gpt4 book ai didi

assembly - ASCII 调整和十进制调整指令如何工作?

转载 作者:行者123 更新时间:2023-12-04 05:15:51 24 4
gpt4 key购买 nike

我一直在努力理解来自 x86 汇编语言的 ASCII 调整指令。

我在互联网上看到所有的信息告诉我不同​​的事情,但我想这只是以不同的形式解释的同一件事,我仍然没有得到。

谁能在 AAA 的伪代码中解释原因, AAS 我们必须从 AL 的低位半字节中加减 6?

谁能解释一下AAM , AAD和十进制调整指令伪代码in the Intel instruction set manuals还有,他们为什么会这样,他们背后的逻辑是什么?

最后,有人可以举例说明什么时候这些说明有用,或者至少在过去它们在哪些应用程序中有用。

我知道现在不使用这些说明,但我仍然想知道这些说明是如何工作的,很高兴知道。

最佳答案

why in the pseudo-code of AAA, AAS we have to add, subtract 6 from the low-order nibble in AL



因为在十六进制中,每个字符有 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 Addition assembly program logic
  • Why must six be added to a BCD addition if it is an invalid BCD code?


  • and can someone explain AAM, AAD and the Decimal adjust instructions pseudo-code in the Intel instruction set manuals too, why are they like that, what's the logic behind them?



    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

    之所以有这些指令,是因为在过去,内存很昂贵,您必须尽可能减少内存使用量。因此在那个时代 CISC CPU 很常见。他们使用大量复杂的指令来最小化用于执行任务的指令。现在内存便宜得多,现代架构几乎是 RISCy,在 CPU 复杂性和代码密度之间进行权衡

    关于assembly - ASCII 调整和十进制调整指令如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24092600/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com