assembly 你好,我得到了一个问题,我需要从用户输入,输入是一个数字和数字后,数字可以是一个双字

pbwdgjma  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在做一个程序,我想在这个程序中取一个10位数的数字
(4,294,967,296),并存储所有数字和制造商
EAX中的一个。
例如:输入= 1 2 3 4,EAX = 1234
我尝试与2位数的开始,我得到了一些问题,我不知道如何
从这里继续。我真的很感激你的帮助,提前感谢!!

.model small
.STACK 100h
.data  
num dd ?
ten DB 10

.code
.386
   start:
   MOV AX, @DATA
   MOV DS, AX
   MOV AH,1
   INT 21H
   SUB AL,30H
   MOV BH,AL
   MOV AH,1
   INT 21H
   SUB AL,30H
   MOV CH,AL
   
   MOV AL,BL
   MUL ten 
   ADD AL,CH 
   push eax
   call printNum
   MOV AX, 4c00h
   INT 21h
   END start
ulmd4ohb

ulmd4ohb1#

MOV AL,BL
MUL ten 
ADD AL,CH

如果你使用了正确的寄存器,上面的代码将产生你的2位数的值。你将第一位数存储在BH中,但是你在这里使用的是BL

.386
push eax

您使用的是emu 8086。忘记使用32位寄存器吧。如果您想使用32位数字,您必须将它们存储在几个16位寄存器中。例如DX:AX,其中DX保存最高有效字,AX保存最低有效字。
要解决构建一个高达4GB-1的10位数字的任务,下一个代码将是有用的:

DI:SI中的双字乘以10

mov  ax, 10
mul  si         ; LSW * 10 -> DX:AX
mov  si, ax
xchg di, dx
mov  ax, 10
mul  dx         ; MSW * 10 -> DX:AX
jc   Overflow
add  di, ax
jc   Overflow

将新数字AL=[0,9]添加到DI:SI中的双字

mov  ah, ah
add  si, ax
adc  di, 0
jc   Overflow

循环直到用户按Enter键

Input:
  mov  ah, 01h    ; DOS.GetKeyWithEcho
  int  21h        ; -> AL
  cmp  al, 13     ; Is it <ENTER> ?
  je   Done
  sub  al, '0'    ; From character to digit
  cmp  al, 9
  ja   Invalid

  ...

  jmp  Input
Done:

重要的是,您要决定如何处理无效的用户输入,以及如何处理产生大于4GB-1的数字的输入。编写的许多程序忽略了这一点,然后在某个时候神秘地失败...

相关问题