免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 748 | 回复: 0
打印 上一主题 下一主题

汇编语言概述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览

一.概述

任何汇编语言综合起来无外乎三个主要部分,

1.寻址方式

2.伪指令

3.指令

 

这里以Linux中GNU AS为例看看AT&T格式的汇编

 

二.寻址方式

程序运行时需要进行取指、取数据,因此需要对指令、数据进行寻址,也就包括了数据寻址和转移地址寻址。这两种寻址无外乎以下三种寻址方式:

 

1.立即数寻址方式: 数据/转移地址在指令中

2.寄存器寻址方式: 数据/转移地址在寄存器中

3.存储器寻址方式: 数据/转移地址在存储器中

 

存储器又包括直接寻址和间接寻址,

①存储器直接寻址: 存储器的地址直接给出

②存储器间接寻址: 存储器的地址间接给出

 

很多书本上总结出多达5种存储器寻址方式,例如什么相对寻址,相对基址寻址或者索引寻址等等,其实这些归纳起来都是间接寻址,内存地址都是间接给出的。

数据寻址

转移地址寻址

1.立即数寻址方式:

数据在指令中直接给出

1.立即数寻址方式:

转移地址在指令中直接给出(往往相对地址)

movl $0x1234, %eax

jmp 0x1234 (绝对地址!OS中可能重定位)

movl $var, %eax

jmp label

2.寄存器寻址方式:

数据在寄存器中保存

2.寄存器寻址方式:

转移地址在寄存器中保存

movl %eax, %ebx

jmp *%eax

3.存储器直接寻址方式:

数据在存储器中保存,

存储器的地址直接给出

3.存储器直接寻址方式:

转移地址在存储器中保存,

存储器的地址直接给出

movl 0x1234, %eax

jmp *0x1234(OS中绝对地址可能不被允许)

movl var, %eax

jmp *var

4.存储器间接寻址方式:

数据在存储器中保存,

存储器的地址间接给出

4.存储器间接寻址方式:

转移地址在存储器中保存,

存储器的地址间接给出

movl %ebx, (%eax)

jmp *(%eax)

movl array(%ebx,%esi, 4), %eax

movl -4(%ebp), %eax

 

三.伪指令

 

  1.区伪指令

     .txt 代码段

     .data 数据段

     .bss 未初始化数据段

  2.变量分配伪指令

     .byte 1B

     .short 2B

     .word 2B

     .int 4B

     .long 4B

     .quad 8B

     .octa 16B

     .ascii "string\n"

     .asciz "string\n"NULL

     .string "string\n"NULL

     .space size, value

     .fill repeat, size, value

     .org new_lc, value =>新地址new_lc之前填充value

  3.其他伪指令

     .global 全局变量/符号

     .align 对齐方式

     . 当前位置计数器值

     = 赋值符号常数

     .comm symbol, length bss段全局符号

     .lcomm symbol, length bss段局部符号

     .desc symbol, length

 

四.指令

 

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP