文章作者:东方[E.S.T]
信息来源:邪恶八进制
初学汇编的人往往搞不懂寻址方式,因此我参考《80X86汇编语言程序设计教程》
一书在加上个人的理解整理的如下内容供初学者参考。
表示指令中操作数所在的方法称为寻址方式。
8086/8088有7种基本的寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接
寻址,寄存器相对寻址,基址加变址寻址方式,相对基址加变址寻址。
1 立即数寻址
操作数就在指令中,作为指令的一部分,跟在操作码后存放在代码段。
eg. mov ah,01h
mov ax,1204h
;如果立即数是16位的,则高地址放在高位,低地址放在低位
2 寄存器寻址
操作数在寄存器中,指令中指定寄存器号。对于8位操作数,寄存器可以是AL,AH,BL,BH,
CL,CH,DL,DH。 对于16位操作数,寄存器可以是AX,BX,CX,DX,BP,SP,SI,DI等
eg. mov ah,ch
mov bx,ax
3 直接寻址方式
操作数在存储器中,指令直接包含操作数的有效地址EA。
eg. mov ax,[1122h] ;将ds:1122的数据放在ax,默认段为DS
mov es:[1234],al ;采用了段前缀
4 寄存器间接寻址
操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。在不采用段前
缀的情况下, 对于DI,SI,BX默认段为DS,而BP为SS。
eg. mov ah,[bx]
mov ah,cs:[bx] ;使用了段前缀
5 寄存器相对寻址
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的
内容加上8位或16位的位移之和。在指令中的8位和16位的常量采用补码表示,8位要被带
符号扩展为16位。
eg. mov ah,[bx+6]
;段址默认情况与寄存器间接寻址相同
6 基址加变址寻址
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)加上变址寄存器(SI,DI)的
内容。如果有BP,则默认段址为SS,否则为DS.
eg. mov ah,[bx+si]
7 相对基址加变址寻址
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和变址寄存器(SI,DI)的
内容加上8位或16位的位移之和。如果有BP,则默认段址为SS,否则为DS.
eg. mov ax,[bx+di-2]
mov ax,1234h[bx][di]
[注]:上面3~7为存储器寻址方式
80386支持8088/8086的各种寻址方式。在立即数和寄存器寻址中,操作数可以达32位宽。
在实模式下,80386和8088。8086没什么区别。在保护模式下,段的最大长度是4G。段寄存器内的
是段选择子,而不再是段基地址。
80386具有灵活的存储器寻址方式,他类似于8088/8086的存储器寻址,不过386的基址寄存器
可以是8个通用寄存器,变址寄存器可以是除ESP外的另7个通用寄存器。寻址方式如下
|无 | |无 |
|EAX| |EAX|
|EBX| |EBX| |1|
|ECX| |ECX| |2| | 无 |
|EDX| + |EDX| * |4| + |8 bit |
|ESP| |8| |32 bit|
|EBP| |EBP|
|ESI| |ESI|
|EDI| |EDI|
posted on 2009-03-05 19:15
小叶子 阅读(532)
评论(0) 编辑 收藏 引用 所属分类:
初学汇编