【发布时间】:2014-12-21 11:05:12
【问题描述】:
在我的电脑上,编译后的可执行文件省略了在循环顶部执行“mov %2, %%ax”
当 "add %1, %%ax" 未注释时。
有人要仔细检查或评论吗?
#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;
}
遵循生成的程序集
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
感谢 Jester 的解决方案:
: "=&r" (result) // early clober modifier
【问题讨论】:
-
没有线索,总猜测:应该是
$1而不是%1? -
%1 表示低,%2 表示高
-
那是哪个汇编器或汇编器语法?这对我来说是新的。
-
这是 GCC 编译器上的内联 ASM,AT&T 汇编语法。
标签: gcc assembly inline-assembly i386