part4.AT&T汇编学习

基本写法

寄存器

在寄存器前要加%
e.g %1

操作数顺序

左边是源,右边是目的
e.g. movl %1, %2

立即数

立即数前加 e.g.movl 0x04, %1
data = 0x04
movl $data, %1
意味着将立即数04h装入寄存器1

符号常数

直接引用
e.g. value = .long 0x12a
movl value, %1
将常数0x12a装入寄存器1

引用符号地址在符号前加符号 $
e.g. movl $value也就是将value的地址装入寄存器1

操作数的长度

操作数的长度用加在指令后的符号表示,b(byte,8-bits),w(word,16-bits),l(long,32-bits)
e.g. movb %1, %2

内存引用

displacement(base, index, scale)
base, index为任意的32-bits base和index寄存器
scale可以取值1,2,4,8,如果不指定scale值,默认值为1
e.g. -4(%1)

GCC内联ASM

将汇编嵌入到GCC中
以下内容转载自百度文库

1.基本内联汇编

e.g.
这里写图片描述
基本内联汇编的格式是
这里写图片描述
这里写图片描述
这里写图片描述

当在”Instruction List”中有多条指令的时候,你可以在一对引号中列出全部指令,也可以
将一条或几条指令放在一对引号中,所有指令放在多对引号中。如果是前者,你可以将每一
条指令放在一行,如果要将多条指令放在一行,则必须用分号(;)或换行符(\n,大多数
情况下\n 后还要跟一个\t,其中\n 是为了换行,\t 是为了空出一个tab 宽度的空格)将它们
分开。

2.带有C/C++表达式的内联汇编

GCC 允许你通过C/C++表达式指定内联汇编中”Instrcuction List”中指令的输入和输出,
你甚至可以不关心到底使用哪个寄存器被使用,完全靠GCC 来安排和指定。这一点可以让
程序员避免去考虑有限的寄存器的使用,也可以提高目标代码的效率。

带有C/C++表达式的内联汇编格式为:
这里写图片描述
这里写图片描述

补充:转载自ibm
这里写图片描述
这里写图片描述
ok~好像差不多了~阅读源代码估计没有障碍了吧~(不是flag,不是flag,不是flag)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值