Код:
#include <stdio.h>
int main(int argc, char *argv[]){
int i = 58;
int b = 52;
int sum;
asm("add %1, %2;" : "=r"(sum) : "r"(i), "r"(b));
printf("Hello, %d+%d=%d \n", i, b, sum);
return 0;
}
Получившийся ассемблерный код выглядит так:
...
mov edx, 52
mov eax, 58
mov ecx, 52
mov esi, 58
mov edi, OFFSET FLAT:.LC0
#APP
# 7 "test1.c" 1
add eax, ecx;
# 0 "" 2
#NO_APP
xor eax, eax
call printf
...
После выполнения моей вставки регистр eax обнуляется. Тем не менее результат сложения сохраняется и нормально отображается. Если выполнить xor eax, eax внутри моей вставки, то sum обнуляется. Что за магия?