AT&T学习笔记汇编之内联c语言



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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值