三行代码  ›  专栏  ›  技术社区  ›  Sandy Ketchum

我们不能用ADD指令在8086中添加两个16位数字吗?

  •  0
  • Sandy Ketchum  · 技术社区  · 1 周前

    由于8086有一个带有16位寄存器的16位ALU,因此我将其描述为添加两个16位数字:

    MOV BX,12FFh
    MOV CX,0001h
    ADD BX,CX
    

    MOV BX,12FFh
    MOV CX,0001h
    ADD BL,CL
    ADC BH,CH
    

    她的解决方案是唯一被接受的添加两个16位数字的方法吗?

    1 回复  |  直到 1 周前
        1
  •  2
  •   Peter Cordes    1 周前

    第一个代码块在BX中生成与第二个代码块相同的结果。(在CF和SF中,我想到的不是ZF、PF或AF,原因很明显。)

    16位 add 不是两个单独字节相加的SIMD相加。如果你想要的话,用 movd xmm0, ebx / movd xmm1, ecx / paddb xmm0, xmm1 . MMX / SSE2 paddb 是具有单独字节元素的SIMD加法。 Scalar integer add 是对整个操作数大小的单个整数加法运算,CF和OF根据寄存器的顶部确定,无论是什么。

    您可以通过构造一个测试用例来证明这一点,其中进位在8位边界上传播。单步在调试器中执行此操作,并在添加后查看寄存器。

       mov  ax, 0x80
       add  ax, ax          ; ax = 0x0100  = 0x0080 << 1
    

    或者查看编译器输出,如 https://godbolt.org/z/xKfK6h4d5 GCC使用的位置 add eax, edx 要实现两个 short 变量,或使用 添加 例如,做指针数学。

    也许你的教授不得不亲自学习组装来教授一门课程,而且没有太多的经验。事实是 添加 其他整数寄存器操作是对整数的单次操作,这是非常基本的,与所有(?)伊萨斯。(尽管8086是少数几个将部分寄存器别名到低/高半部的寄存器之一)。希望她能纠正她的误解,让全班同学知道组装是如何工作的。