Comportamento inesperado do ASM in-line do GCC (sobrescrito variável substituída)
No meu computador, o executável compilado omite a execução de "mov% 2, %% ax" na parte superior do loop
quando "adicione% 1, %% ax" não comentado.
Alguém para verificar duas vezes ou comentar?
#include <stdio.h>
int main() {
short unsigned result, low ,high;
low = 0;
high = 1;
__asm__ (
"movl $10, %%ecx \n\t"
"loop: mov %2, %%ax \n\t"
// "add %1, %%ax \n\t" // uncomment and result = 10
"mov %%ax, %0 \n\t"
"subl $1, %%ecx \n\t"
"jnz loop"
: "=r" (result)
: "r" (low) , "r" (high)
: "%ecx" ,"%eax" );
printf("%d\n", result);
return 0;
}
Segue a montagem gerada
movl $1, %esi
xorl %edx, %edx
/APP
movl $10 ,%ecx
loop: mov %si, %ax
mov %dx, %bx
add %bx, %ax
mov %ax, %dx
subl $1, %ecx
jnz loop
/NO_APP
Graças a Jester, a solução:
: "=&r" (result) // early clober modifier