- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。
1、 基本操作指令
简单的操作数类型说明,一般有三种,
(1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。
(2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。
(3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。
图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元素进行访问时会用到。
操作数类型
格式
操作数值
名称
立即数
$Imm
Imm
立即数寻址
寄存器
Ea
R[Ea]
寄存器寻址
寄存器
Imm
M[Imm]
绝对寻址
寄存器
(Ea)
M[R[Ea]]
间接寻址
寄存器
Imm(Eb)
M[Imm+R[Eb]]
(基址+偏移量)寻址
寄存器
(Eb,Ei)
M[R[Eb]+R[Ei]]
变址寻址
寄存器
M[Imm+R[Eb]+R[Ei]]
寄存器
(,Ei, s)
M[R[Ei] * s]
伸缩化的变址寻址
寄存器
Imm(,Ei, s)
M[Imm+R[Ei] * s]]
伸缩化的变址寻址
寄存器
(Eb,Ei, s)
M[R[Eb]+R[Ei] * s]
伸缩化的变址寻址
寄存器
Imm(Eb,Ei, s)
M[Imm+R[Eb]+R[Ei] * s]
伸缩化的变址寻址
图1 操作数格式
注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。 从上面的图我们就可以大致了解操作数的类型了。
在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。
1、movl $0x4050, %eax 立即数——寄存器
2、movl %ebp, %esp 寄存器——寄存器
3、movl (%edi, %ecx), %eax 存储器——寄存器
4、movl $-17, (%esp) 立即数——存储器
5、 movl %eax, -12(%ebp) 寄存器——存储器
注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的,但这并不会影响我们理解汇编,只要熟悉其细节之后就能够明白的。
指令
效果
描述
movl S, D
D ←S
传送双字
movl S, D
D ←S
传送字
movl S, D
D ←S
传送字节
movl S, D
D ←符号扩展(S)
传送符号扩展的字节
movl S, D
D ←零扩展(S)
传送零扩展的字节
pushl S
R[%esp] ← R[%esp] – 4;
M[R[%esp]] ← S
压栈
popl D
D ← M[R[%esp]];
R[%esp] ← R[%esp] + 4
出栈
图2:数据传送指令
结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大,
如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,
studyrush@studyrush-desktop:~/C$ vi exchange.c
vi 后面加我们要创建的程序文件的名字,在这里是exchange.c
studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c
gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。
studyrush@studyrush-deskto
文档评论(0)