汇编语言-80x86寻址方式

物理地址

  • 存储器以字节为单位存储信息。
  • 每一个字节单元有一个惟一的存储器地址,称为物理地址
  • 一个字存入存储器要占有相继的两个字节,存放时低位字节存入低地址,高位字节存入高地址。
  • 字单元的地址采用它的低地址表示。
  • 画内存时下边是高地址,上边是高地址。栈底是高地址。
  • 每个存储单元有惟一的物理地址,但它却可由不同的段地址和不同的偏移地址组成。

与数据有关的寻址方式

立即寻址方式

操作数直接存放在指令中,这样的操作数称为立即数

  • 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
表2 默认段选择规则
访存类型 所用段及段寄存器 缺省规则
指令 代码段 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

欢迎讨论和交流!