gcc 内联汇编用法介绍

前言

大部分内容翻译提取自某国外HOW-TO文档,原地址:

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

AT&T汇编语法

gcc内联汇编语法采用AT&T格式,主要不同有五个方面
1. 源操作数和目标操作数的位置与intel格式不同
2. 寄存器命名,AT&T在寄存器前加百分号(%)
3. 字面值前加美元符号($),且字面值16进制不用h作为结尾,而是使用前缀0x
4. 操作数大小由b(byte 8-bit),w(word 16-bit),l(long 32-bit)跟在操作符号后而非在寄存器等之前加xxx ptr来指定大小
5. 内存寻址采用 disp(base, index, scale)来对应intel的[base + index*scale + disp] (disp和scale常量前不加美元符号($))

简单的一些转换举例:

Intel Code AT&T Code
mov eax,1 movl $1,%eax
mov ebx,0ffh movl $0xff,%ebx
int 80h int $0x80
mov ebx, eax movl %eax, %ebx
mov eax,[ecx] movl (%ecx),%eax
mov eax,[ebx+3] movl 3(%ebx),%eax
mov eax,[ebx+20h] movl 0x20(%ebx),%eax
add eax,[ebx+ecx*2h] addl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx] leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h] subl -0x20(%ebx,%ecx,0x4),%eax

内联汇编基本语法

格式

基础版

asm("movl %ecx %eax");
__asm__("movl %ecx %eax");

两种格式都可以,前后加双下划线主要是为了避免“asm”已经被使用。
提高版


                
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值