我是一个偶尔的 C 程序员。我在 Turbo C 程序中遇到过这段内联汇编代码
#define ADC(dst,src) { asm MOV AX, dst; asm ADD AX, src; \
asm ADC AX, 0; asm MOV dst, AX; }
dst 和 src 都是无符号的 16 位整数。
它不会在 GNU C++ 中编译。有人可以解释一下它在做什么吗?蒂亚!
前两条指令相加dst
,src
将结果存储在累加器中。第三条指令计算有时称为“结束进位”的东西,第四条指令将结果存储在dst
.
以下是等效的 C 实现:
int32_t sum = dst + (int32_t)src;
dst = (int16_t)((sum & 0xffff) + (sum >> 16));
Wikipedia在其补码的报道中谈到了 end-around 进位:
要将这个系统中表示的两个数字相加,需要进行传统的二进制加法,但随后需要进行end-around 进位:也就是说,将任何结果进位加回到结果和中。
例如,在计算 IPv4 校验和时使用结束进位。
这段代码到 GNU C 内联汇编的字面翻译是:
static inline short ADC(short dst, short src)
{
asm ("add %1, %0; adc $0, %0" : "+r"(dst) : "rmi"(src));
return (dst);
}
但是NPE提供的版本应该更便携一点。