12

我是一个偶尔的 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++ 中编译。有人可以解释一下它在做什么吗?蒂亚!

4

2 回答 2

13

前两条指令相加dstsrc将结果存储在累加器中。第三条指令计算有时称为“结束进位”的东西,第四条指令将结果存储在dst.

以下是等效的 C 实现:

int32_t sum = dst + (int32_t)src;
dst = (int16_t)((sum & 0xffff) + (sum >> 16));

Wikipedia在其补码的报道中谈到了 end-around 进位:

要将这个系统中表示的两个数字相加,需要进行传统的二进制加法,但随后需要进行end-around 进位:也就是说,将任何结果进位加回到结果和中。

例如,在计算 IPv4 校验和时使用结束进位。

于 2019-09-07T14:58:38.323 回答
7

这段代码到 GNU C 内联汇编的字面翻译是:

static inline short ADC(short dst, short src)
{
     asm ("add %1, %0; adc $0, %0" : "+r"(dst) : "rmi"(src));

     return (dst);
}

但是NPE提供的版本应该更便携一点。

于 2019-09-07T15:15:05.240 回答