您的位置:首页 > 其它

浅谈汇编,认识汇编(二)

2017-07-17 18:36 260 查看
认识汇编,了解汇编(二)

今天主要谈一下汇编中操作数的寻址方式。




我们知道在机器语言中,其指令是由二进制码组成。一条指令包含操作码和操作数两部分,操作码指明了该指令进行什么操作,操作数指出该指令在执行规定操作时所需的信息来源。

汇编中一样,以8086为例,指令通常使用一个操作数或两个操作数。我们知道操作数其实就是你直接处理的数据,而操作数地址就是操作数存放在内存的物理地址中,cpu通过操作数寻址找到相应的存储单元,也就是用不同的操作数寻址方式计算出最后的物理地址,用物理地址来寻找最终的操作数。

我们强调一下概念,规定操作数的方法,即指令中用于说明操作数地址的方法称为寻址方式。

8086的寻址方式可分为两大类:数据寻址方式和转移地址寻址方式。


在详细讲解之前引出关于目的操作数和源操作数的概念,让大家更好的理解,这里以MOV指令为例。

MOV DST, SRC  诸如这种形式,含有两个操作数的,我们把前头寻址后找到的操作数称为DST也就是目的操作数,后面寻址后找到的操作数称为SRC也就是源操作数。有了这样的认识,我们来详细学习下寻址方式。

一、 数据寻址方式

1.立即数寻址

当数据为8位或16位时,可以直接放在指令本身的最后一个字节或两个字节中。这样的数据称为立即操作数。简单的理解就是一个纯数字。为了更好的理解,这里还是以MOV指令为例:

MOV AX, 102CH

这里的源操作数的寻址方式就为立即数寻址,为16位的,作用是把102CH传给AX.

MOV AH, 10H

这里的源操作数的寻址方式为立即数寻址,8位的,作用是把10H传给AX的高位AH里。

2.直接寻址

操作数在存储单元中,其16位有效地址,即段内偏移地址在指令码中,占两个字节。也就是说这种方式告诉你我的操作数是放在一个存储单元里头了,现在告诉你这个存储单元它的偏移地址,通过偏移地址计算出物理地址去寻找存储单元。

MOV AL, [01H]

该指令的源操作数寻址方式为直接寻址,作用是把偏移地址为01H的存储单元里的内容传给AL.

MOV AX, [18H]

该指令的源操作数寻址方式为直接寻址,作用是把偏移地址为18H的存储单元里的内容传给低8位AL,下一个单元的内容传给高8位AH.

MOV BX, DS:[20H]

该指令的源操作数的寻址方式事实上也是直接寻址,它利用了逻辑地址的格式,指明了你的段地址为DS,而前头的指令没有是因为他们在程序该指令源操作数寻址的段地址为当前数据段,在程序开始已经初始化过段地址。该指令的作用依然是把DS段内偏移地址为20H的存储单元的内容传给BX.

3.寄存器寻址

数据放在指令规定的寄存器中。对于16位数据,寄存器可以是AX,BX,CX,DX,SI,DI,SP和BP。对于8位数据,寄存器可以是AL,AH,BL,BH,CL,CH,DL和DH。

MOV AX, BX

该指令的源操作数和目的操作数都为寄存器寻址。作用是把BX里的内容直接传给AX

4.寄存器间接寻址

操作数在存储单元中,其有效地址即偏移地址在指明的基址寄存器BX或变址寄存器SI,DI中,为了更好的理解我们和直接寻址对比,直接寻址是直接用数字告诉你偏移地址是多少,而寄存器间接寻址隐晦了一点,告诉你偏移地址在这个寄存器中。

MOV AX, [BX]

该指令的源操作数寻址为寄存器间接寻址,假如BX里存10H,则该指令的作用为用BX的内容作为偏移地址,即10H,来找到对应的存储单元,把存储单元里的内容传给AX.

注意:这种寻址方式,它允许的寄存器只能为BX,SI或DI。(这点很容易理解,看我上一篇提到的寄存器分类,从图中你很明显的发现只有这三种寄存器名字跟地址有关,除过BP,而我们的这种方式正是利用偏移地址来寻址)

5.寄存器相对寻址

操作数在存储单元中,其偏移地址是一个8位或16的位移量(disp)与一个基址寄存器或变址寄存器的内容之和。这两个都在指令码中给出。这里寄存器可以为BX,BP,SI,DI。当位移量为常数,寄存器为BX,,SI,DI时,段地址指定DS,寄存器为BP时,段地址指定SS。当位移量为变量时,变量的在哪个段定义,段地址就取哪个段。该寻址可以理解成在寄存器寻址的基础上又给偏移地址加上一个disp(偏移量)。

MOV AX, [BX]+06H

该指令源操作数寻址方式为寄存器相对寻址。作用为BX的内容加上06H作为偏移地址,在计算出物理地址,最后通过物理地址找到对应的存储单元,将其里面的内容传给AX。

(注意:MOV AX, 06H[BX] ; MOV AX, [BX+06H] ; MOV AX, 06H+[BX] 是一样的,只是格式不同而已)

6.基址变址寻址

操作数在存储单元中,其偏移地址是一个基址寄存器和一个变址寄存器内容之和,两个都在指令码中指明。

MOV AX, [BX][SI]

该指令源操作数寻址方式为基址变址寻址。该指令的作用是将基址寄存器的内容与变址寄存器的内容之和作为偏移地址,在计算出物理地址,找到物理地址对应的存储单元,将里面的内容传给AX。

7.基址变址且相对寻址

操作数在存储单元中,其偏移地址是一个8位或16位的位移量,一个基址寄存器内容和一个变址寄存器内容三个的和作为最后的偏移地址。

MOV AX, [BX][DI]04

该指令的源操作数的寻址方式为基址变址且相对寻址。若BX的内容是02H,DI的内容是06H。则该指令作用就是将BX,DI和04三者之和即0CH作为偏移地址,再用DS算出最后的物理地址,通过物理地址找到存储单元,将其内容传给AX。

8.隐含寻址

有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含地指明了操作数地址。如字节转换指令XLAT,该指令的目的操作数寻址和源操作数寻址都为隐含寻址,,作用为(AL)←((BX)+(AL))。

(注意:以上的例子中,MOV指令它的目的操作数和源操作数都存在寻址方式,有的我并没有具体说明目的操作数的寻址方式,这些例子中的目的操作数寻址均为寄存器寻址)

二、 转移地址的寻址方式

这里说明一下段内和段间转移的概念

寻找的操作数作地址用,给IP或给CS:IP,而实现程序的转移。如果程序转移后只有IP发生了改变,则称段内转移或近程转移。如果程序转移后CS,IP均发生了变化,则称为段间转移或远程转移。

段内和段间都可再分为直接和间接。

 

最后,总结一下,主要对数据寻址方式进行概括,不难发现,该类寻址的目的都是想把数据传给存储器或存储单元,而立即数寻址直接就给出数据,寄存器寻址直接把寄存器里的内容传出,而其他方式都是通过地址来找到存储单元,在得到地址对应的存储单元的内容。无非就是这些地址的给出方式不同,可以直接数字给出,称为直接寻址,若寄存器给出,则寄存器间接寻址,再加上个位移量又是一类,若是基址变址又是一类,这些类最终的目的都是一样的,为了找到最后的存储单元。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: