繁体   English   中英

如何将2的数字相乘并形成4的数字然后显示呢?

[英]How can i multiply 2 number together and form 4 digit and then display it?

所以程序开始如下:

.data
num db 22
multiplier db 20
divide db 10
digit1 db ?
digit2 db ?
digit3 db ?
digit4 db ?
.code
MOV AL,num
MUL multiplier
;----22 x 20 = 440
MOV BH,AH
;----AH stores 04?? AL stores 40?
;----40
DIV divide
MOV digit1,AH
MOV digit2,AL
;----04
MOV AL,BH
DIV divide
MOV digit3,AH
MOV digit4,AL

;---display
MOV AH,02H
MOV DL,digit1
INT 21H
;---same for digit2,3,4

程序输出的是一堆十六进制数字。 有人可以告诉我如何存储3位数字或4位数字。 它存储在AX还是AL中?

为什么你觉得ah可能是04 al 40?

我问有两个原因。

1)如果您要调试它,则调试器应能够向您显示ahal当前值。 尽管它可能显示ax六进制形式,并且您不了解六进制数,所以对于您来说,这可能又是另一件事。

2)您缺少“位”点。 al是8位信息,这意味着它可以包含2 8条不同的信息。 由于每个位可以是01 (两个选项),并且您有8位,所以位置很重要。 如果您要检查组合理论,则所有可能组合的“二乘幂提高到八分之一”,即256。现在,这些组合最常用作二进制数,当被视为0到255之间的数字时(请检查二进制形式以查看如何将位模式分配给特定数字,这是合乎逻辑的,每个位代表2的幂之一,就像在我们的十进制格式中,每个数字代表10的特定幂一样。

您可能会想到的所有胡言乱语,请告诉我该错误。 根据您的逻辑,数字100将在ah:al之间分配为01:00。 因此, al最大数量将为99。这浪费了3/5的可能组合(最多255)。

440以二进制(位)编码为: 0000 0001 1011 1000 ,前8位在ah ,等于1 ,其他8位在al ,那些等于(440-ah * 256)=(440-1 * 256)= 184(数值256ax被分割为10ahal255被分割为0255 )。 如果将值hl放入ahal ,则ax值为256*h + l

在调试器中,您可能会读到: ax 01B8 十六进制格式具有此整洁的功能,每个数字正好是4位长。 0 = 00001 = 0001B (11十进制)= 10118 = 1000 因此,前两位数字是ah内容,其他两位数字是al内容。

阅读有关位,字节的更多信息,并进行一些数学练习,以完全掌握二进制<->十进制<->八进制<->十六进制之间的转换是如何工作的,只需手动计算几次即可。 特别是在ASM中进行编程时,特别是从头开始进行一些基本的dec <-> bin / hex数学运算非常方便,例如,当您将寄存器的内容视为位掩码而不是数字时,通常更容易记下该值的十六进制形式,而不是将所有设置的位重新计算为小数并求和。


现在回到您的代码(每段都是错误描述,或者至少是非常强烈的代码风格建议,如果您希望我再次查看您的源代码,则应该遵循)。

我想这是MASM或TASM。 我不喜欢mov al,num ,它掩盖了您实际上正在获取内存而不是地址的事实。 mov al,[num]是CPU中发生的情况的更精确定义。 即使在TASM中,您也可以这样写(当需要时,数据大小由byte ptr [...]指定。

div byte ptr [mem8]划分ax在[mem8]值,你的情况,你把440 10.这将产生0余成ah ,和商44到al “错误”不是在指令本身中,而是在您的期望中。 您将ah存储为digit1 ,但它不是字体数字,而是从0到9的值数字。要将其转换为字体字形,需要ASCII编码的数字。 您必须将其转换为ASCII编码(检查ASCII表以查看哪个字形具有什么代码)。 因此, add ah,30h将修复digit1。

如您所见,Digit2完全关闭,0到9范围内的数值甚至都不是44,因此无法将其转换为一位数字,您必须重复整个过程,但是这次从低10的一个顺序开始(因此将ax设为44,而不是440)。 然后将其重写为循环。

MOV AL,BH DIV divide -现在您将ax除以字节10 ,而未设置AH 在digit1冒险之后,它可以包含任何内容,幸运的是,在您的AH版本中, AH0 movzx ax,bhxor ah,ah可以将bh的8位值零扩展为16位ax (上面解释了DIV和编码为ASCII的结果)

最后,您首先显示digit1,但是digit1是什么? 保留除以原始值的10。 因此,对于440,你一不小心就会输出0440 (当然,不会像digit1-2-3-4的内容是不正确的),恰似440,但以相反的顺序。 尝试22 * 49 = 1078进行调试(如果您的代码将产生正确的digit#值,则它将打印8701)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM