[汇] 当即寻址,直接寻址,间接寻址

当即寻址就是指令当中自带数据,直接读取,最快;
直接寻址就是指令中存放的是地址,直接解析这个地址;
间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。

总共有14个16位寄存器,8个8位寄存器数组

 

通用寄存器:指针

  数据寄存器:字符串

  AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器)it

  BH(8位)  BL(8位)  BX(16位)   (BX又称基址寄存器,惟一做为存储器指针使用寄存器)  扩展

  CH(8位)  CL(8位)  CX(16位)   (CX用于字符串操做,控制循环的次数,CL用于移位)循环

  DH(8位)  DL(8位)  DX(16位)   (DX通常用来作32位的乘除法时存放被除数或者保留余数)引用

 

  指针寄存器:方法

  SP 堆栈指针 (存放栈顶地址)数据

  BP 基址指针 (存放堆栈基址偏移)margin

 

  变址寄存器:主要用于存放某个存储单元地址的偏移,或某组存储单元开始地址的偏移,

  即做为存储器(短)指针使用。做为通用寄存器,它们能够保存16位算术逻辑运算中的操

  做数和运算结果,有时运算结果就是须要的存储单元地址的偏移.

 

  SI 源地址  (源变址寄存器)

  DI 目的地址 (目的变址寄存器)

  

控制寄存器:

  IP 指令指针

  FLAG 标志寄存器

   ① 进位标志 CF,记录运算时最高有效位产生的进位值。

 ② 符号标志 SF,记录运算结果的符号。结果为负时置1,不然置0。

 ③ 零标志  ZF,运算结果为0时ZF位置1,不然置0。

 ④ 溢出标志 OF,在运算过程当中,如操做数超出了机器可表示数的范围称为溢出。溢出时OF位置1,不然置0。

 ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。

 ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错状况提供检验条件。当结果操做数中1的个数为偶数时置1,不然置0。

 

段寄存器

  CS 代码段  IP

  DS 数据段  

  SS 堆栈段  SP BP

  ES 附加段

 

七种寻址方式:

一、当即寻址方式:

操做数就包含在指令中。做为指令的一部分,跟在操做码后存放在代码段。

这种操做数成为当即数。当即数能够是8位的,也能够是16位的。

例如:

    指令: MOV AX,1234H

      则: AX = 1234H

 

二、寄存器寻址方式:

操做数在CPU内部的寄存器中,指令指定寄存器号。

对于16位操做数,寄存器能够是:AX、BX、CX、DX、SI、DI、SP和BP等。

对于8位操做数,寄存器能够是AL 、AH、BL、BH、CL、CH、DL、DH。

这种寻址方式因为操做数就在寄存器中,不须要访问存储器来取得操做数

于是能够取得较高的运算数度。

 

三、直接寻址方式:

操做数在寄存器中,指令直接包含有操做数的有效地址(偏移地址)

注:操做数通常存放在数据段

因此操做数的地址由DS加上指令中直接给出的16位偏移获得。若是采用

段超越前缀,则操做数也可含在数据段外的其余段中。

例如:

MOV AX,[8054]

如(DS) = 2000H,

则执行结果为(AX) = 3050H

(物理地址=20000+8054=28054H)

28054H里的内容为3050H

 

在汇编语言指令中,能够用符号地址代替数值地址

如:MOV AX,VALUE

此时VALUE为存放操做数单元的符号地址。

如写成:MOV AX,[VALUE]也是能够的,二者是等效的。

如VALUE在附加段中,则应指定段超越前缀以下:

MOV AX,ES:VALUE 或 MOV AX,ES:[VALUE]

 

四、寄存器间接寻址方式:

操做数在寄存器中,操做数有效地址在SI、DI、BX、BP

这四个寄存器之一中。在通常状况下,若是有效地址在

SI、DI和BX中,则以DS段寄存器中的内容为段值。若是

有效地址在BP中,则以SS段寄存器中的内容为段值

例如:

MOV AX,[SI]

若是(DS) = 5000H (SI) = 1234H

则物理地址 =  50000 + 1234 = 51234H

51234H地址中的内容为:6789H

执行该指令后,(AX) = 6789H

 

五、寄存器相对寻址方式:

操做数在存储器中,操做数的有效地址是一个基址寄存器(BX、BP)

或变址寄存器(SI、DI)的内容加上指令中给定的8位或16位位移量之和

 

    BX  8位 位移量

EA(有效地址) =  BP  + 

    SI  16位 位移量

    DI

在通常状况下,若是SI、DI、或BX中的内容做为有效地址的一部分,那么

引用的段寄存器是DS;若是BP中的内容做为有效地址的一部分,那么引用的

段寄存器是SS。

 

物理地址 = 16d × (DS) + (BX) + 8

           或(SI)或16位位移量

           或(DI)

物理地址 = 16d × (SS) + (BP) + 8位位移量

                       或16位位移量

在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如

位移量是8位,则被带符号扩展成16位。

例如:

MOV AX,[DI+1223H]

假设,(DS) = 5000H,(DI) = 3678H

则物理地址 = 50000 + 3678 + 1233 = 5489BH

5489BH地址中的内容:55AAH

执行该指令后AX = 55AAH

下面指令中,源操做数采用寄存器相对寻址,引用的段寄存器是SS: MOV BX,[BP-4]

下面指令中,目的操做数采用寄存器相对寻址,引用的段寄存器是ES: MOV ES:[BX+5],AL

指令:MOV AX,[SI+3]与MOV AX,3[SI]是等价的

 

六、基址加变址寻址方式:

操做数在寄存器中,操做数的有效地址由:

基址寄存器之一的内容与变址寄存器之一的内容相加

   BX   SI

即: EA =    + 

   BP   DI

在通常状况下,若是BP以内容做为有效地址的一部分,则以SS以内容为段值,不然已DS

为段值。

例如:

MOV AX,[BX][DI]

如:(DS)=2100H,

   (BX)=0158H,

   (DI)=10A5H

则EA=0158 + 10A5 = 11FD

物理地址=21000 + 11FD = 221FDH

221FDH地址中的内容:1234H

执行该指令后AX = 1234H

 

下面指令中,目的操做数采用基址加变址寻址,

引用的段寄存器是DS: MOV DS:[BP+SI],AL

 

下面指令中,源操做数采用基址加变址寻址,

引用的段寄存器ES: MOV AX,ES:[BX+SI]

 

这种寻址方式使用与数组或表格处理。用基址寄存器存放数组首地址,而用变地寄存器

来定位数组中的各元素,或反之。因为两个寄存器均可改变,因此能更加灵活地访问数

组或表格中的元素。

下面的两种表示方法是等价的:

MOV AX,[BX+DI]

MOV AX,[DI][BX]

 

七、相对基址加变址寻址方式:

操做数在存储器中,操做数的有效地址因为基址寄存器之一的内容与变址寄存器之一的

内容及指令中给定的8位或16位位移量相加获得。

         BX    SI    8位

即: EA =     +     +      位移量

   BP    DI    16位

在通常状况下,若是BP中的内容做为有效地址的一部分,则以SS段寄存器中的内容为段

值,不然以DS段寄存器中的内容为段值。

在指令中给定的8位或16位位移量采用补码形式表示。

在计算有效地址时,若是位移量是8位,那么被带符号扩展成16位。

当所得的有效地址操做FFFFH时,就取其64K的模

例如:

MOV AX,[BX+DI-2]

假设,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H

物理地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H

执行该指令后 (AX) = 7654H

 

相对基址加变址这种寻址方式的表示方法多种多样,如下四种方法均是等价的:

MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]

MOV AX 1234H[BX+DI],  MOV AX,1234H[DI][BX]

相关文章
相关标签/搜索