我一直在努力理解 x86 汇编语言的 ASCII 调整指令。
我在互联网上看到所有信息告诉我不同的事情,但我想这只是以不同形式解释的同一件事,但我仍然不明白。
谁能用伪代码解释一下为什么AAA, AAS我们必须从 AL 的低位半字节中加、减 6?
有人可以解释一下吗AAM
, AAD
和十进制调整指令伪代码在Intel指令集手册中还有,为什么会这样,背后的逻辑是什么?
最后,有人可以举例说明这些说明何时有用,或者至少在过去它们在哪些应用程序中有用。
我知道现在这些指令已经不再使用,但我仍然想知道这些指令是如何工作的,很高兴知道。
为什么在AAA、AAS的伪代码中我们要在AL的低位半字节上加、减6
因为在十六进制中,每个字符有 16 个不同的值,而 BCD 只有 10 个。当您以十进制进行数学计算时,如果数字大于 10,您需要取 10 的模并进位到下一行。类似地,在 BCD 数学中,当加法结果大于 9 时,您可以添加 6 以跳过剩余的 6 个“无效”值并进位到下一位。相反,你在减法中减去 6。
例如:27 + 36
27: 0010 0111
+ 36: 0011 0110
───────────────
5_13: 0101 1101 (13 >= 10)
+ 6: 0110
───────────────
63: 0110 0011 (13 + 6 = 19 = 0x13, where 0x3 is the units digit and 0x10 is the carry)
进行解包加法是相同的,只是直接从个位进位到十位,丢弃每个字节的顶部半字节
欲了解更多信息,您可以阅读
- BCD加法汇编程序逻辑
- 如果是无效的 BCD 码,为什么必须在 BCD 加法上加上 6?
有人能解释一下Intel指令集手册中的AAM、AAD和十进制调整指令伪代码吗,为什么它们是这样的,它们背后的逻辑是什么?
AAM只是二进制到BCD的转换。通常以二进制形式进行乘法,然后调用 AAM 将结果除以 10 并将商余数对存储在两个解压缩的 BCD 字符中
例如:
13*6 = 78 = 0100 1110
78/10 = 7 remains 8 => result = 0x78
AAD则相反:在除法之前,调用AAD将其从BCD转换为二进制,然后像其他二进制除法一样进行除法
例如:87/5
0x8*10 + 0x7 = 0x57
0x57/5 = 0x11 remains 0x7
之所以有这些指令,是因为过去内存很昂贵,你必须尽可能减少内存的使用。所以在那个时代CISCCPU 很常见。他们使用大量复杂的指令来最大限度地减少用于执行任务的指令。如今,内存便宜得多,现代架构几乎都是 RISCy,需要权衡 CPU 复杂性和代码密度
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)