物理地址
- 存储器以字节为单位存储信息。
- 每一个字节单元有一个惟一的存储器地址,称为物理地址。
- 一个字存入存储器要占有相继的两个字节,存放时低位字节存入低地址,高位字节存入高地址。
- 字单元的地址采用它的低地址表示。
- 画内存时下边是高地址,上边是高地址。栈底是高地址。
- 每个存储单元有惟一的物理地址,但它却可由不同的段地址和不同的偏移地址组成。
与数据有关的寻址方式
立即寻址方式
操作数直接存放在指令中,这样的操作数称为立即数。
mov ax,3
注意:
- 立即寻址方式只能用于源操作数字段。
- 源操作数长度应与目的操作数长度一致。
寄存器寻址方式
操作数存放在寄存器中,指令指定寄存器号。
mov ax,bx
以上两种寻址方式都不涉及存储器。
以下各种寻址方式的操作数都存放在存储区中。
在80x86中,把操作数的偏移地址称为有效地址,EA(Effective Address)
。
以下各种寻址方式通过不同途径求得操作数的有效地址,进而获得操作数。
有效地址可以有以下四种成分组成:
位移量
(displacement),是存放在指令中的数字,但它不是立即数,而是一个地址。
基址
(base),是存放在基址寄存器(BP、BX)中的内容,通常用来指向数据段中数组或字符串的首地址。
变址
(index),是存放在变址寄存器(SI、DI)中的内容,通常用来访问数组中的某个元素或字符串中的某个字符。
比例因子
(scale factor),其值可为1,2,4,8。(386及后继机型才有比例因子)
<center>表1 16位寻址时有效地址三种成分的组成</center>
成分 | 16位寻址 |
---|---|
位移量 | 0,8,16位 |
基址寄存器 | BX,BP |
变址寄存器 | SI,DI |
访存类型 | 所用段及段寄存器 | 缺省规则 |
---|---|---|
指令 | 代码段 CS | 用于取指令 |
堆栈 | 堆栈段 SS | 进出栈,ESP、BP或ESP作为基址寄存器 |
局部数据 | 数据段 DS | 除堆栈和串指令的目的串之外 |
目的串 | 附加数据段 ES | 串处理指令的目的串 |
禁止使用段跨越前缀的三种情况:
- 串处理指令的目的串必须使用ES段
- PUSH和POP指令的源必须使用SS段
- 指令必须存放在CS段
直接寻址方式
mov ax,[0]
位移量可以用符号地址(变量)表示。
mov ax,table
mov ax,[table]
默认段寄存器为DS。
该寻址方式适用于处理单个变量。
寄存器间接寻址方式
mov ax,[bp]
mov ax,[bx]
有效地址就在某个寄存器(BX,BP,SI,DI)中。(不允许使用AX,CX,DX)
BP的默认段寄存器为SS,其他三个寄存器的默认段为DS。
寄存器相对寻址方式
又称直接变址寻址方式。
默认段情况与寄存器间接寻址方式相同。
mov ax,count[si]
mov ax,[count+si]
基址变址寻址方式
默认段情况参看表1和表2。
mov ax,[bx][di]
mov ax,[bp][si]
mov ax,[bx+di]
相对基址变址寻址方式
mov ax,mask[bx][si]
与转移地址有关的寻址方式
这种寻址方式用来确定转移指令与CALL
指令的转向地址。
段内直接寻址
有效地址=(IP)+位移量
平常用的jmp next
等,都是这种寻址方式。
近转移:
位移量大小为16bit,如jmp near ptr next
。
短转移:
位移量为8bit,如jmp short next
,看看其他与转移地址有关的寻址方式会发现只有short
没有ptr
。
段内间接寻址
有效地址=寄存器或存储单元内容。
该内容可以用除立即寻址方式以外的与数据有关的所有寻址方式。
jmp bx
jmp word ptr[bp+table]
word ptr
说明是一个字,所以是段内转移。
段间直接寻址
指令中直接提供了转向段地址和偏移地址。
jmp far ptr next
段间间接寻址
取存储器中的两个相继字取代IP和CS中的原始内容,以达到段间转移的目的。
存储单元地址除立即数方式和寄存器方式外均可。
jmp dowrd ptr[table+bx]
。dword
说明是双字,所以是段间转移。
作者:@臭咸鱼
转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!