void jump(){
int i = 10, sum = 0;
__asm__("movl $0, %0;"
"a:;"
"cmpl $0, %2;"
"jle b;"
"addl %2, %0;"
"subl $1, %1;"
"jmp a;"
"b:;"
:"=r"(sum), "=r"(i)
:"1"(i)
);
cout << sum;
}
当sum的约束条件是"r"时,内联汇编中应该初始化一下,movl $0, %0;
相当于初始化sum的中转寄存器;
比如下面,编译器选择%edx来暂存sum,如果不清零操作,其中的值是不确定的;
再看看生成的.s文件
subq $16, %rsp
movl $10, -4(%rbp)
movl $0, -8(%rbp)
movl -4(%rbp), %eax
#APP
# 52 "main.cpp" 1
movl $0, %edx;a:;cmpl $0, %eax;jle b;addl %eax, %edx;subl $1, %eax;jmp a;b:;
# 0 "" 2
#NO_APP
movl %edx, -8(%rbp)
movl %eax, -4(%rbp)
movl -8(%rbp), %eax
movl %eax, %esi
leaq _ZSt4cout(%rip), %rdi
call _ZNSolsEi@PLT
nop