第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
相比直接使用寄存器還優化了一點。