汇编语言的寻址方式

来源:互联网 发布:js实现烟花的原理 编辑:程序博客网 时间:2024/06/07 12:40

Intel 汇编

立即寻址方式

MOV AH, 80H (直接给寄存器赋值)

寄存器寻址方式(源或者目的有一个是寄存器)

源操作数是寄存器寻址方式

如: ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中: VARD、VARW和VARB是双字,字和字节类型的内存变量。

目的操作数是寄存器寻址方式

如: ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。

源和目的操作数都是寄存器寻址方式

如: MOV EAX, EBX MOV AX, BX MOV DH, BL等。

直接寻址方式(地址值在括号里)

MOV BX, [1234H] (默认使用DS).
MOV ES:[1000H], AX

寄存器间接寻址方式(寄存器在括号里)

MOV BX, [DI]
操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
若有效地址用SI、DI和BX来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。

寄存器相对寻址方式(一个寄存器和一个立即数在括号里,并且还要计算)

MOV BX, [SI+100H]

基址加变址寻址方式(两个寄存器在括号里,并且还要计算)

MOV BX, [BX+SI]

相对基址加变址寻址方式(两个寄存器在括号里和一个立即数在括号里,并且还要计算)

MOV AX, [BX+SI+200H]

AT&T 汇编

立即寻址

movl $2, %ebx
它的意思就是把2这个数字写入%eax寄存器,$2就是立即寻址,其实就是立即数。

寄存器寻址

其实上面的例子也包括了寄存器寻址,顾名思义%ebx就是寄存器寻址,代表对这个寄存器本身的写入或读出。

直接寻址

movl ADDRESS, %eax
ADDRESS其实就相当于”地址或偏移”里的地址,反正就是一个数字。

寄存器间接寻址

movl (%eax), %ebx
(%eax)就是间接寻址了,意思就是访问eax寄存器里的数值所代表的地址。相当于通用公式里的基址或偏移量寄存器。

索引寻址(变址寻址)

movl 0xFFFF0000(,%eax,4), %ebx
0xFFFF0000(,%eax,4)就是索引寻址,意思是从0xFFFF0000地址开始,加上%eax * 4作为索引的最终地址。

基址寻址

movl 4(%eax), %ebx
4(%eax)就是基址寻址,意思是以eax寄存器里的数值作为基址,加上4得到最终地址。

注意

在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上’*’作为前缀,而在 Intel 格式中则不需要。

参考

http://www.cnblogs.com/hdk1993/p/4820353.html Intel格式和AT&T格式汇编区别

http://www.cnblogs.com/findumars/archive/2013/09/05/3302457.html 汇编的8种寻址方式,以及2个默认段寄存器

http://blog.csdn.net/zr_lang/article/details/39962261 AT&T汇编语言及其寻址方式简述

原创粉丝点击