第57部分- Linux x86 64位汇编改动寄存器列表
编译器假设输入值和输出值使用的寄存器会被改动,并相应的做出处理。
程序员不需要在改动的寄存器列表中包含这些值。
示例
#include <stdio.h>
int main()
{
int data1 = 10;
int result = 20;
asm ("movl %1, %%eax\n\t"
"addl %%eax, %0"
: "=r"(result)
: "r"(data1), "0"(result)
: "%eax");
printf("The result is %d\n", result);
return 0;
}
gcc -o changedtest changedtest.c
这里内联汇编代码中使用eax寄存器作为存储数据的中间位置,这个寄存器没有被声明为输入值或输出值,所以必须在改动的寄存器列表中包含。然后编译器会知道EAX寄存器不可用会使用其他寄存器。