代码之家  ›  专栏  ›  技术社区  ›  Ina Gabrielle

汇编语言中十进制到二进制的转换

  •  1
  • Ina Gabrielle  · 技术社区  · 8 年前

    在将十进制值转换为二进制时,我在分析这段代码时遇到了困难。谁能帮我解释一下下面的几行文字吗?顺便说一下,这是一个工作代码。我非常感谢你的帮助,这是为了学习。谢谢你!

    calc :
        mul multiplier
        mov bl, byte ptr [si]
        mov bh, 00h
        add ax, bx
        inc si
        loop calc
    
        mov si, offset buf4 + 2
        mov bx, ax
        mov dx, 0000h
        mov ax, 8000h
    convert :
        mov cx, 0000h
    conv :
        cmp bx, ax
        jb cont3
        sub bx, ax
        inc cx
        jmp conv
    cont3 :
        add cl, 30h
        mov byte ptr [si], cl
        inc si
        mov cx, 0002h
        div cx
        cmp ax, 0000h
        jnz convert
    
        mov byte ptr [si], '$'
        prnstr buf3
        prnstr buf4+2
    stop :
        mov ax, 4c00h
        int 21h
    

    代码的第一部分很容易理解(接受用户输入并检查其是否为有效的十进制数)。我已经添加了一些评论。。代码的前半部分如下所示:

    prnstr macro msg     ;acts like a function to print string
        mov ah, 09h
        lea dx, msg
        int 21h
        endm
    
    data segment
        buf1 db "Enter a decimal number : $"
        buf2 db 0ah, "Invalid Decimal Number...$"
        buf3 db 0ah, "Equivalent Binary number is : $"
        buf4 db 6
             db 0
             db 6 dup(0)
        multiplier db 0ah
    data ends
    
    code segment
        assume cs:code, ds:data
        start :
        mov ax,@data
        mov ds,ax
        mov es, ax   
    
        prnstr buf1         ;Display
    
        mov ah, 0ah         ;Get line function
        lea dx, buf4        ;adress of input buffer
        int 21h
    
        mov si, offset buf1 + 2 ;Load pointer to beginning of structure
        mov cl, byte ptr [si-1] ;determine end of loop?
        mov ch, 00h
        subtract :
        mov al, byte ptr [si]   ;Load 1 byte of buf1 to cl
        cmp al, 30h             ;check if not below 0
        jnb cont1
    
        jmp stop
     cont1 :
        cmp al, 3ah         ;check if not above 9
        jb cont2
        prnstr buf2         ;Display
        jmp stop
     cont2 :
        sub al, 30h             ;convert ASCII to Decimal number
        mov byte ptr [si], al   ;place bcd form back to pointed character
        prnstr buf2             ;Display
        inc si                  ;next character
        loop subtract           ;repeat until end of string
        mov si, offset buf1 + 2 ;Load pointer to beginning of structure
        mov cl, byte ptr [si-1] ;reset to determine end of loop using si
        mov ch, 00h
        mov ax, 0000h           ;reset ax to 0
    
        ;...CONTINUE TO calc.....
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Mike Nakis    8 年前

    这个 calc: 循环不断乘以10并累加,因此它似乎计算以十进制输入的数字的实际值。(它将您输入的字符串(例如“42”)转换为数字42。)

    其余代码将计算的数字转换为二进制。至少可以说,它是以一种非正统的方式写成的。

    说明书 mov dx, 0000h 清除 dx ,因为再往下 div cx 指令将 dx:ax 配对方式 cx ,所以如果 dx公司 如果不是零,你就会得到垃圾。

    这个 ax 寄存器以值开头 08000h 在二进制中是 1 然后是15 0 在循环的每次迭代中,它总是被2除,所以在每次迭代中,一个新的二进制数字 0 从左侧进入 1. 二进制数字向右移动一个位置 0 二进制数字从右侧脱落。

    检查 斧头 1. 二进制数字在16次迭代后退出,留下 斧头 全部为零。

    这个 conv: 循环是一种非常非正统的设置方式 cx公司 0 1. 取决于位是否表示为 斧头 在中设置或清除 bx 。这个循环最多循环一次,所以我认为 jmp conv 指令可能会丢失,它可能会被 cont2: 标签

    还要注意,加载 2 进入 cx公司 然后执行 分区cx 是弱智,你可以 shr ax, 1

    推荐文章