组装 ADC(带进位的加法)

标签 assembly x86 carryflag

mov eax, ptr_to_num1 ; little endian
mov ebx, ptr_to_num2 ; little endian
xor ecx, ecx
xor edx, edx
clc
bytes_addition:
    mov dl, byte [eax+ecx] ; byte from shortest
    adc dl, byte [ebx+ecx]
    mov byte [eax+ecx], dl
    inc ecx
    cmp ecx, 4 ; counter, 
    jl bytes_addition

考虑在

EAX:4F2252FF(大端)

EBX:00DFFC00(大端)

这个加法的结果是错误的:50024fff(大端)。它应该是 50024eff。看起来进位标志受到影响,但为什么呢?

最佳答案

cmp影响进位,这就是它用于无符号比较的方式。

您可以开始 ecx在 -4,然后使用 jnz bytes_addition .您已经拥有 inc在那里,当 ecx 时将设置零标志变为零,并且不会影响进位。

当然,必须通过将 4 添加到 eax 来补偿此偏移量。在循环之前,或在寻址中添加 4 的偏移量。

关于组装 ADC(带进位的加法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34256692/

相关文章:

我可以让编译器优化结构中的函数调用吗?

c - ELF 二进制文件的运行时修补

assembly - 如何读取 NASM 汇编程序 .lst 列表文件

c++ - 将 ADC(带进位相加)到 C++

c - 在此汇编代码中如何设置进位标志?

optimization - 是否可以优化编译后的二进制文件?

c - 下面的代码是什么意思?

c - 浮点乘法执行速度较慢,具体取决于 C 中的操作数

c - x86指令中的非阻塞内存写入?

c - 使用 16b 值时检测溢出和进位