Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53593
  • 博文数量: 10
  • 博客积分: 365
  • 博客等级: 一等列兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-07 16:28
文章存档

2012年(3)

2011年(7)

分类: 嵌入式

2011-04-17 21:58:20

一.概述

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

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

 

四.指令

 

1.Linux 汇编语言开发指南:
2.Linux 中 x86 的内联汇编:
3.AT&T汇编语言语法:
4.GNU for x86汇编语法:
阅读(1565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~