小白100000000 发表于 2019-5-19 23:57:41

汇编端口

学到14章端口在某个芯片里面有个时间钟,它的信息被存放在那个71端口,我想把月的信息显示在屏幕上但是这是个cbd码,我看小甲鱼用 shl 指令将那个数左移四位,说取得这个数的十位,为什么这样做能取得它的十位,还有往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码

人造人 发表于 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:, '2'
        mov        byte ptr es:, '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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, '/'
       
        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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, '/'
       
        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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, ' '
       
        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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, ':'
       
        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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, ':'
       
        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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
       
        mov        ax, 4c00h
        int        21h
code ends
end start

jackz007 发表于 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 ,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 ,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

小白100000000 发表于 2019-5-20 09:16:47

比如19这个这个数左移4位变成91它原本的十位不是1么我们应该取那个1的值位10位啊,而不是那个9这么移那个数不就变了

小白100000000 发表于 2019-5-20 09:21:00

一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么

人造人 发表于 2019-5-20 12:26:34

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

用到了,这个等你学到后面就明白了
现在给一点提示,中断会使用栈保存一些必要的数据

人造人 发表于 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:, al
        mov        al, ah
        and        al, 0fh
        add        al, 30h
        mov        byte ptr es:, al
        mov        byte ptr es:, '/'
页: [1]
查看完整版本: 汇编端口