寻址方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1与数据有关的寻址方式
1 立即寻址方式(immediate addressing)
操作数直接放在指令中,紧跟在操作码之后,他作为代码的一部分放在代码段里,这种操作数称谓立即数。立即数可以是8位或者16位的,如果是16位的,则高位字节放在高地址中,低位字节放在低地址中。
Eg. 内存片段0AEF:0110 00 01 01 34 12 12 11 00-00 00 00 00 00 00 00 00
则:[113]字=1234h低地址表示法12高位存在高字节114 34低位存在低字节113 [113]字节=34h [113]双字=11121234h
立即寻址方式用来表示常数,他经常用来给寄存器赋初值,并且只能源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。
Mov al,5 -> 执行后al=05h
Mov ax,3064 -> 执行后ax=3064h
Mov Eax,12345678 Eax=12345678h
2寄存器寻址方式(register addressing)
操作数在寄存器中,指令制定寄存器号。
Mov ax,bx ((ax)=3064h,(bx)=1234h) 则执行后(ax)=1234h,(bx)=1234h
除上述两种方式外,以下的寻址方式的操作数都在除代码段外的存储区中。
有效地址有下面4种成分组成:
(1)位移量(displacement)是存放在指令中的一个8位、16位或者32位的数,但他不是立即数,而是一个地址。
(2)基址(base)是存放在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中的数组或字符串中的首地址。
(3)变址(index)是存放在变址寄存器中的内容,它通常用来访问数组中某个元素或者字符串中的某个字符。
(4)比例因子(scale factor)是386及其后继机型新增加的寻址方式中的一个术语,其值可以是1,2,4或8。在寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。
有效地址计算:
EA=基址+(变址X比例因子)+位移量(只有比例因子是定值)
PS:说明了各种访存类型下所对应段的默认选择。实际上,在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段,如允许数据存放在DS段以外的其他段中,此时程序员应使用段跨越前缀。
但是以下3种情况不允许使用段跨越前缀:
①串处理指令的目的串必须用ES段
②PUSH指令的目的和POPZ指令的源必须用SS段
③指令必须存放在CS段
默认段选择规则
3.直接寻址方式(direct addressing)
操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值即操作数的有效地址。
Mov ax,[2000h]如[DS]=3000h,则ax=3050h
有效地址=30000H+2000h=32000h
在汇编语言指令中,可以用符号地址代替数值地址
Mov AX,VALUE
如果VALUE在附加段中,则应指定段跨越前缀
Mov AX,ES:VALUE
4.寄存器间接寻址(register indirect addressing)
操作数的有效地址只包含基址寄存器内容或者变址寄存器内容一种成分。因此,有效地址就在某个寄存器中,而操作数则在某个存储器中。
Eg mov ax,[bx]
如果ds=2000h,bx=1000h
则物理地址=20000h+1000h=21000h
执行结果为:ax=5040h
指令中也可以用段跨越前缀来取得其他数据段中的数据;
Mov ax,ES:[bx]
Mov ECX,[EDX]
5.寄存器相对寻址方式(register relative addressing)(或称直接变址寻址方式)
操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和,所以有效地址由两部分组成。
Mov ax,COUNT[SI]
Mov ax,[COUNT + SI]
如果DS=3000h ,SI=2000h,COUNT=3000h
则物理地址=30000H+2000H+3000H=35000H
Mov EAX,TABLE[ESI]
这种寻址方式开用于表格处理,表格的首地址可以设为位移量,利用修改基址或变址寄存器的内容来取得表格中的值。
直接变址寻址方式也可以使用段跨越前缀。
Mov DL,ES:STRING[SI]
6基址变址寻址方式(based indexed addressing)
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两部分组成。
Mov AX,[BX][DI]/MOV AX,[BX+DI]
如DS=2100h,BX=0158h,DI=10A5h
EA=0158+10A5=11FDh 物理地址=21000+11FD=221FDh
对于32位
MOV EDX,[EBX][ESI]
使用段跨越前缀:
MOV AX,ES:[BX][SI]
7.相对基址变址寻址方式(relative based indexed addressing)
操作数的有效地址是由一个基址寄存器的内容和变址寄存器的内容和指令中指定的位移量之和,所以有效地址由3部分组成。
Mov AX,MASK[BX][SI]
(MOV AX,MASK[BX+SI] OR MOV AX,[MASK+BX+SI])
如DS=3000h,BX=2000H,SI=1000H,MASK=0250H
物理地址=16DXDS+BX+SI+MASK
=30000+2000+1000+0250=33250H
相对于32位:
MOV EAX,ARRAY[EBX][ECX]
8.比例变址寻址方式(scaled indexed addressing)
操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,所以有效地址有三部分组成。
Mov EAX,COUNT[ESI*4]
9基址比例变址寻址方式(based scaled indexed addressing)
操作数的有效地址是变址寄存器的内容乘以比例因子再加上基址寄存器的内容之和,所以有效地址由三部分组成。
MOV ECX,[EAX][EDX*8]
10.相对基址比例变址寻址方式(relative based scaled indexed addressing)
操作数的有效地址是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量之和,所以有四部分组成。
MOV EAX,TABLE[EBP][EDI*4]