鱼C论坛

 找回密码
 立即注册
查看: 3726|回复: 6

汇编端口

[复制链接]
发表于 2019-5-19 23:57:41 From FishC Mobile | 显示全部楼层 |阅读模式
100鱼币
学到14章端口在某个芯片里面有个时间钟,它的信息被存放在那个71端口,我想把月的信息显示在屏幕上但是这是个cbd码,我看小甲鱼用 shl 指令将那个数左移四位,说取得这个数的十位,为什么这样做能取得它的十位,还有往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 00:47:17 | 显示全部楼层
不知道这个代码够不够
assume cs:code

stack segment
        db        1024 dup(0)
stack ends

code segment
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 1024
        
        mov        ax, 0b800h
        mov        es, ax
        mov        bx, 5 * 160
        
        mov        byte ptr es:[bx + 0], '2'
        mov        byte ptr es:[bx + 2], '0'
        
        mov        al, 9                ; 年
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 4], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 6], al
        mov        byte ptr es:[bx + 8], '/'
        
        mov        al, 8                ; 月
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 10], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 12], al
        mov        byte ptr es:[bx + 14], '/'
        
        mov        al, 7                ; 日
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 16], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 18], al
        mov        byte ptr es:[bx + 20], ' '
        
        mov        al, 4                ; 时
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 22], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 24], al
        mov        byte ptr es:[bx + 26], ':'
        
        mov        al, 2                ; 分
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 28], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 30], al
        mov        byte ptr es:[bx + 32], ':'
        
        mov        al, 0                ; 秒
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 34], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 36], al
        
        mov        ax, 4c00h
        int        21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 01:12:03 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-20 01:13 编辑

    1、关于左移 4 位的作用:
        左移 1 位就是 x 2,左移 2 位就是 x 4,左移 4 位就是 x 16。假如一个字节的值是 09,那么,左移 4 位就会变成 90,个位上的数值就被平移到十位数上了。

    2、往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码?
        准确地说,被放入的是字符串形式的十进制数值。
        关于十进制数的显示,请参考以下代码:
data segment para public
     db 020h dup(00)
data ends
stack segment stack
     dw 080h dup(00)
stack ends
code segment para public
    assume cs:code , ds:data , ss:stack
    bin2hex proc near
            push bx
            push cx
            push dx
            push ds
            push es
            mov si,0fh
            push ax
            pop bx
            mov cl,04h
        h1: mov al,bl
            and al,0fh
            shr bx,cl
            cmp al,0ah
            jb h2
            add al,37h
            jmp h3
        h2: add al,030h
        h3: mov [si],al
            or bx,bx
            jz h4
            dec si
            jmp h1
        h4: mov cx,0fh
            sub cx,si
            inc cx
            push ds
            pop es
            xor di,di
            rep movsb   
            xor al,al
            stosb
            pop es
            pop ds
            pop dx
            pop cx
            pop bx
            ret
    bin2hex endp
    bin2dec proc near
            push bx
            push cx
            push dx
            push ds
            push es
            mov si,1fh
        b1: xor dx,dx
            mov cx,0ah
            div cx
            add dl,30h
            mov [si],dl
            or ax,ax
            jz b2
            dec si
            jmp b1
        b2: mov cx,1fh
            sub cx,si
            inc cx
            push ds
            pop es
            mov di,010h
            rep movsb   
            xor al,al
            stosb
            pop es
            pop ds
            pop dx
            pop cx
            pop bx
            ret
    bin2dec endp
    show proc near
            push bx
            push cx
            push dx
            push si
            push di
            push ds
            push es
            push ax
            mov al,ah
            xor ah,ah
            mov cl,0a0h
            mul cl
            push ax
            pop di
            pop ax
            xor ah,ah
            add al,al
            add di,ax
            push di
            xor si,si
            mov ax,0b800h
            mov es,ax
        s1: lodsb
            or al,al
            jz s2
            stosb
            mov al,2
            stosb
            jmp s1
        s2: pop di
            add di,0a0h
            mov si,010h
        s3: lodsb
            or al,al
            jz s4
            stosb
            mov al,02
            stosb
            jmp s3
        s4: pop es
            pop ds
            pop di
            pop si
            pop dx
            pop cx
            pop bx
            ret
    show endp
    cls proc near
            push ax
            push bx
            push cx
            push dx
            mov ax,0600h
            xor cx,cx
            mov dx,0184fh
            int 10h
            pop dx
            pop cx
            pop bx
            pop ax
            ret
    cls endp
    ppause proc near
            push ax
            xor ax,ax
            int 016h
            pop ax
            ret
    ppause endp
    main proc far                  ; 程序入口
            mov ax,data
            push ax
            pop ds
            push ax
            pop es

            mov ax,1234h           ; 屏幕显示 ax 的数值 
            push ax
            call bin2dec           ; 把数值转化为十进制字符串
            pop ax
            call bin2hex           ; 把数值转化为十六进制字符串

            call cls               ; 清屏

            mov ax,0b28h           ; 在第11行,40列显示结果
            call show              ; 在屏幕的指定位置显示字符串

            call ppause            ; 等待键盘输入

            mov ax,4c00h
            int 21h
    main endp
code ends
end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-20 09:16:47 From FishC Mobile | 显示全部楼层
比如19这个这个数左移4位变成91它原本的十位不是1么我们应该取那个1的值位10位啊,而不是那个9这么移那个数不就变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-20 09:21:00 From FishC Mobile | 显示全部楼层
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 12:26:34 | 显示全部楼层
小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么

用到了,这个等你学到后面就明白了
现在给一点提示,中断会使用栈保存一些必要的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 12:37:14 | 显示全部楼层
小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
        mov        al, 9                ; 年
        out        70h, al
        in        al, 71h

执行完in        al, 71h后al中的内容是0x19,因为今年是2019年
al中的高4位是1,低4位是9
把al中的内容右移4位后al中的内容变成了0x01,最右边的9移没了,不过不用担心,ah中有备份
字符'1' 和 数字1不一样
1 + 0x30 = '1'
所以要add        al, 30h

mov        al, 9                ; 年
        out        70h, al
        in        al, 71h
        mov        ah, al
        mov        cl, 4
        shr        al, cl
        add        al, 30h
        mov        byte ptr es:[bx + 4], al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:[bx + 6], al
        mov        byte ptr es:[bx + 8], '/'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 10:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表