第54部分- Linux x86 64位汇编内联汇编使用占位符
使用寄存器可以处理只有几个输入值的情况,如果有很多输入值的函数,需要占位符。可以在内联汇编代码中引用输入值和输出值,方便编译器在任何寄存器和内存位置中声明输入和输出值。
占位符是前面加上百分号符号的数字。每个值被赋予一个从零开始的数字。
将前面使用寄存器示例使用占位符示例
示例
#include <stdio.h>
int main()
{
int data1 = 10;
int data2 = 20;
int result;
asm ("imull %1, %2\n\t"
"movl %2, %0"
: "=r"(result)
: "r"(data1), "r"(data2));
printf("The result is %d\n", result);
return 0;
}
gcc -o regtest regtest3.c
使用约束r。表示使用寄存器满足所有数据需求。
这里%0将表示result,%1表示data1,%2表示data2。
占位符提供在内联汇编代码中利用寄存器和内存位置的方法。
进行反汇编
#gcc -o regtest.s -S regtest3.c查看:
有片段如下:
movl $10, -8(%rbp)
movl $20, -4(%rbp)
movl -8(%rbp), %edx;//使用edx保存10
movl -4(%rbp), %eax;//使用eax保存20
#APP
# 9 "regtest3.c" 1
imull %edx, %eax;//eax和edx相乘,结果直接到eax中。没有在需要使用ecx寄存器了,还优化了一点。
# 0 "" 2
#NO_APP
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
相比直接使用寄存器还优化了一点。