標籤:att彙編 linux atampt
asm("assembly code");
ansi c將asm用於其它用途,用__asm__替換
在asm後面加上 volatile可以禁止編譯器最佳化
asm volatile ("pusha \n\tpopa");
__asm__ __volatile__ ("pushl $1\n\t");
擴充asm
asm ("asm code" : output locate : input operands : changed registers)
changed register 改變的寄存器
"constraint" (variable)
位置 變數
修飾符
+ 讀取和寫入運算元
= 只能寫入運算元
% 如果必要,運算元可以和下一個運算元切換。
& 在內嵌函式完成之前,可以刪除或者重新使用運算元。
約束: 描述
a 使用%eax ax al
b %ebx
c %ecx
d %edx
S %esi si
D %edi di
r 任何可用的通用寄存器
q %eax ebx ecx edx之一
A 對64位使用%eax 和 %edx
f 使用浮點寄存器
t 使用第一個(頂部)浮點寄存器
u 第二個浮點寄存器
m 直接使用記憶體位置
o 使用記憶體位移位置
V 直接使用記憶體位置
i 使用立即整數值
n 使用值已知的立即整數值
g 使用任何可用的寄存器或記憶體位置。
asm ("asm code" : "=a"(result) : "d":(data1) : , "c"(data2));
data1存放到edx data2存放到ecx 結果存放到eax,然後再傳送到result
asm("asm code" : "=r"(result) : "r"(data1) , "r"(data2));
預留位置%0將表示包含result值的寄存器,%1:data1,%2:data2h
引用預留位置:
asm("imull %1 , %0" : "=r"(data2) : "r"(data1) , "0"(data2));
AT&T學習筆記彙編之內聯c語言