gcc - Alguém poderia explicar o que esta montagem#define inline está fazendo?




assembly x86 (2)

As duas primeiras instruções adicionam dst e src , armazenando o resultado no acumulador. A terceira instrução calcula o que às vezes é chamado de "transporte final" e a quarta armazena o resultado em dst .

A seguir, uma implementação C equivalente:

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

A Wikipedia fala sobre o retorno da cobertura de seu complemento:

Para adicionar dois números representados nesse sistema, é feita uma adição binária convencional, mas é necessário executar um transporte final : isto é, adicionar qualquer transporte resultante de volta à soma resultante.

O transporte final é usado, por exemplo, ao calcular somas de verificação IPv4.

Eu sou um programador ocasional de C. Eu me deparei com esse pedaço de código de montagem embutido em um programa Turbo C

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

dst e src são números inteiros de 16 bits sem sinal.

Não será compilado no GNU C ++. Alguém poderia explicar o que está fazendo? TIA!


Uma tradução literal desse código para o assembly embutido GNU C é:

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

     return (dst);
}

Mas a versão fornecida pelo NPE deve ser um pouco mais portátil.





carryflag