【问题标题】:Numbers in Assembly Language汇编语言中的数字
【发布时间】:2017-11-22 05:59:47
【问题描述】:

您好,我是汇编语言的初学者,谁能帮我理解如何处理汇编语言 x86 中的数字。 我在处理任何与数字相关的任务时遇到困难,我无法执行像shlshrmuldiv 这样的程序,如果有人能解释或分享以下代码,我会非常感谢

喜欢:

Mov Al 2
Mov Bx 2
mul bx

mov dx,bx
mov ah,2
int 21h 

但是如果我通过减去30h 来隐藏它,它就不能显示正确的输出,即使它不能显示正确的答案。

【问题讨论】:

  • 在汇编中,你读写字符。如果您需要数值,则必须将字符值转换为数字,然后将这些数字组合为您尝试创建的任何类型。见ASCIITable
  • 屏幕上的两位数字由两个 ASCII 字符组成。像mov dl,'2' mov ah,2 int 21h mov dl,'5' mov ah,2 int 21h 会在屏幕上输出“25”。在该示例中根本没有使用实际值 25。 DOS 没有输出数字的服务。您必须先将数字转换为字符。请参阅:stackoverflow.com/tags/x86/info ...如果您只是学习汇编基础知识,请完全跳过字符串内容,并使用调试器来验证您的数值是否正常。稍后再使用字符串,当您有算术和内存操作经验时。

标签: assembly number-formatting x86-16


【解决方案1】:

我无法执行像 shlshrmuldiv 这样的程序

shlshrmuldiv说明。请不要将它们称为程序

...我通过减去 30h 来隐藏它...

在下面的代码中看到,转换要求您添加 30h 而不是减去 30h。

Mov Al 2
Mov Bx 2
mul bx
mov dx,bx
mov ah,2
int 21h 

可以更正这个将两个单数相乘的程序。

错误 1:选择正确的大小乘法。使用mul bx,您已经计算出DX:AX = AX * BX,在这种情况下这是多余的。此外,由于您忘记归零AH,因此您得到了随机结果!

mov al, 2
mov bl, 2
mul bl       ; -> AX = AL * BL

错误 2:将结果是数字 4 ( 2 * 2 ) 转换为字符“4”。
另请注意,mul 指令的结果在BX 寄存器中找不到,就像您的代码正在考虑的那样 (mov dx, bx)。
mul bl 将其结果留在AX 中,因为值这么小,我们只需要使用ALAX的下半部分)

add al, "0"  ;"0" = 30h
mov dl, al
mov ah, 02h
int 21h

重要的是要看到,这种非常简单的结果显示方式只适用于从 0 到 9 的结果。

要显示超出 [0,9] 范围的数字,请查看 Displaying numbers with DOS。文本非常详细地解释了如何将任何数字转换为其文本表示形式并将其输出到屏幕。

【讨论】:

  • 非常感谢您的精彩解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多