【问题标题】:Strange Assembly Language Addition奇怪的汇编语言添加
【发布时间】:2018-06-24 17:12:34
【问题描述】:

我最近一直在学习汇编语言,遇到了一个我不明白的 add 语句。

ebx=00000003;
esi=0FFFFFFFFh;
add ebx,esi
The Result was: ebx=00000002

这怎么可能? 有人可以解释一下添加是如何发生的吗?

【问题讨论】:

    标签: assembly binary hex add cpu-registers


    【解决方案1】:

    这是一个被掩盖为加法的减法。
    指令add ebx,esi 将ESI 中的-1 值与EBX 中3 的值相加,得到2 的值。

    这是可能的,因为two complement binary addition

    ebx=000000003h;   3
    esi=0FFFFFFFFh;  -1
    --------------;   +
    ebx=000000002h;   2
    

    减法是通过从 0FFFFFFFFh(-1) 到 00000000h(0) 的溢出实现的。

    【讨论】:

    • 如果它是一个签名号码,它是-1。如果是且 unsigned 数字,则值为 UINT_MAX。 (是的,你有正确的两个恭维计算)
    • @Ramesh:将所有 0 翻转为 1,反之亦然,称为补码(x86 NOT instruction)。将所有 0 翻转为 1,反之亦然并添加一个称为二补码,如链接中所示(x86 NEG instruction)。
    • 年龄越大,大脑中收集的住宿事实就越多...我已经存在很长时间了...
    • 您甚至可以将其视为两个无符号值,然后简单地从最低位进行加法...30011F1111 => 右边的第一位是两个 1 -> 0 + 进位,第二位都是 1 并进位 -> 1 + 进位,第三位是 1+0+进位 -> 0 + 进位 -> 这将重复到最后 32 位,留给你携带。 IE。结果是00....0010 binary = 2
    • 它不是-1。如果你添加它,它只会像 -1 一样。注意一个十进制示例,有 4 位数字:取 2345 并添加 9999。结果将是 2344 和溢出。您没有“看到”前面的 1(因为您只有 4 位数字),结果与您减去 0001 的结果相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多