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.