-2

我使用 TASM,我试图输入 2 个大于 9 的数字并计算这些数字的总和,然后简单地打印数字和总和;

像那样 :

Number1=109 Number2=90 sum=199

我想如何转换这个数字以及如何计算总和。如果大于 9,我使用该代码输入一个数字。谢谢

MOV Numbre1,0
lecture: int 21h ; 
Cmp AL, "0"
JB fin
Cmp AL,"9"
JA fin
Sub AL,"0" 
SHL Numbre1,1 
Mov BL,Numbre1
SHL BL,1
Add Numbre1,BL
Add Numbre1,AL
jmp lecture
4

1 回答 1

0

这一定是有史以来最常被问到的问题。如果您找不到示例,请升级您的搜索技能。

从你所拥有的......你将需要一个子函数al(编辑:ah!)int 21h。您正确检查了有效的十进制数字。shl不会帮助您处理十进制数(但可能对十六进制有用)。

要将文本转换为数字,这就是您的代码似乎正在做的事情,请将“迄今为止的结果”的寄存器清零。每次找到一个有效的十进制数字(从左到右),减去“0”(30h 或 48 十进制,但“0”更容易阅读),将“到目前为止的结果”乘以 10,然后添加新数字。直到完成...

要将数字转换为文本以便打印它,您的问题实际上是问的,重复除以十 - 注意什么div除以什么!余数(在ah,dxedx, 中)是十进制数字。为每个添加“0”。你会得到从右到左的数字,并且你想从左到右打印它们——有几种方法可以处理这个......

找一个例子,或者启动一个调试器并解决它。你的程序崩溃的最可能的原因是你没有注意什么div除以什么!请问您有没有具体问题...

编辑:叹息...

mov ax, the_number
xor cx, cx ; digit counter
mov bx, 10
pushem:
xor dx, dx ; important!
div bx ; quotient in ax, remainder in dx
add dl, '0' ; convert to character
push dx  ; save 'em to get back in right order
inc cx ; count 'em
test ax, ax  ; done?
jnz pushem ; no, do more
popem:
pop ax ; we're only interested in al
int 29h ; print al
loop popem  ; until done

这是我所知道的最简单的方法(也许不是“最好的”)。您当前的一组数字将适合一个字节,但做一个完整的单词同样容易。

于 2013-01-15T19:30:28.543 回答