32 位汇编中的十进制到二进制 (IA-32)



您好,我正在尝试制作一个代码,该代码将 <0; 65 535> 范围内的十进制数转换为二进制,到目前为止,我的想法是将原始字符串编号传输到数字,然后在 BX 中将其除以 2,因此结果将以 AX 为单位,其余部分在 DX 中......但到目前为止,我不知道如何走得更远,虽然我可能会比较剩余区域中是否有 0 或 1,这是每次除法后的 DX,然后在新字符串中按符号写歌?

TITLE MASM Vstup_výstup (main.asm)
INCLUDE Irvine32.inc
.data
Number DB 9 dup(?),0Dh,0Ah,§
Result DB 9 dup(?),0Dh,0Ah,§
.code
main PROC
    call Clrscr
    mov ebp, offset Number      ;first number's adress is saved to ebp
    mov esp, offset Result
    mov ecx, 20                 ;
    mov edi, 1                  ;           
    call ReadString
    mov ax, Number              ;
    sub ax, '0';                ;String to Number by substracting 0 
    mov bx, 2                   ;save 2 to 16 bit bx register
Start:  
    mov cl, [ebp+edi]           ; something as a counter to know when to end with dividing ?
    inc edi                     ; increase edi by one
    cmp cl, §                   ; compare if the counter already came here division will jump to Ending
    je Ending       
    div bx                      ; divide ax with bx, which means that result will be in AX and remainder in DX
    cmp dx,0
    je Zero                     ; if the remainder is 0 it will write 0 in the new string 
    jmp Start                   ; jmp to start
Zero:
    mov esi, [esp+edi]

Ending:
    exit
main ENDP
END main

看起来您实际上正在做的是将包含十进制数的 ASCII 表示形式的字符串更改为寄存器中的等效数字。 执行此操作的典型方法是从最高有效数字开始,然后重复将前一个结果乘以 10 并添加数字的值。 在伪代码中:

value = 0
for each digit, starting with the most significant:
    value = value * 10 + digitvalue

最新更新