您好,我正在尝试制作一个代码,该代码将 <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