读取x86汇编中的5位十进制数

时间:2010-10-27 15:19:56

标签: assembly x86-16

我正在(b h d)编号系统之间编写一个数字转换器,程序接受 16位二进制数,或4位十六进制数。或5位小数。

当我处理16位寄存器并且它不能包含更大的值时,我写的读取过程似乎有一个问题,因为十进制值高于65535(FFFFh)

如果你帮助我,我将不胜感激。

这是我的阅读程序:

Proc R  
       mov ah,01;read first digit
   int 21h
   mov saveal,al

   cmp al,0dh; if it is a new line break then dont read
   jz toret

   mov al,radex ; the radex value already entered by user
   mov ah,0
   mul dx
   mov dx,ax; multiplies the radex by the number entered so far to shift it 1 dig.                     

   mov al,saveal
   cmp al,65
   jge big2
   sub al,30h; taking decimal value of the character

   cont2:
   call checkerror
   mov ah,0
   add dx,ax; adding the digit to the number read so far

 loop R

 toret:
 ret 
 endp

由于 NATALY

1 个答案:

答案 0 :(得分:2)

您需要更多位超过65536(0xFFFF),因此您需要更大的寄存器,32位或另一个16位寄存器。将其他16位寄存器设置为零,并在添加后添加数字到目前为止,将带有进位的add添加到下一个寄存器中。

所以0xFFFF + 5例如是进位设置为0x10004或0x0004,取另一个寄存器加进位到它接收另一位,现在高位寄存器中有0x0001而低位有0x0004订单注册。

与使用铅笔和纸张添加相比,绝对没有区别。 99 + 5 = 04,带有“携带一个”到数百个位置。当数百个地方溢出时,你会带到下一个地方。二进制是相同的更容易。当你在纸上执行时,每个位列都像一个十进制列,它从第0位到第15位是不可见的,但第15位的进位是可见的,因此你可以将加法器链接在一起,并根据需要任意加宽。