gcc assembly x86 turbo-c carryflag

gcc - ¿Podría alguien explicarme qué está haciendo esta#definir ensamblaje en línea?



assembly x86 (2)

Soy programador ocasional de C. Me he encontrado con este código de ensamblaje en línea en un programa Turbo C

#define ADC(dst,src) { asm MOV AX, dst; asm ADD AX, src; / asm ADC AX, 0; asm MOV dst, AX; }

dst y src son enteros de 16 bits sin signo.

No se compilará en GNU C ++. ¿Podría alguien explicarme qué está haciendo? TIA!


Las dos primeras instrucciones agregan dst y src juntas, almacenando el resultado en el acumulador. La tercera instrucción calcula lo que a veces se llama "acarreo final" y la cuarta almacena el resultado en dst .

La siguiente es una implementación equivalente de C:

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

Wikipedia habla sobre el uso final en su cobertura del complemento de unos:

Para agregar dos números representados en este sistema, uno hace una suma binaria convencional, pero luego es necesario hacer un carry final : es decir, agregar cualquier carry resultante a la suma resultante.

End-around carry se utiliza, por ejemplo, al calcular sumas de comprobación IPv4.


Una traducción literal de este código al ensamblado en línea GNU C es:

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

Pero la versión proporcionada por NPE debería ser un poco más portátil.