您的位置:首页 > 理论基础

操作数的寻址方式(立即,寄存器,直接)

2016-09-30 17:41 246 查看
计算机中程序是由按一定顺序排列的一系列指令,通常一条指令包括两方面的内容:操作码和操作数,操作码决定要完成的操作,告诉计算机要干什么;操作数指参加运算的数据及其所在的单元地址。整条指令以二进制编码的形式存放在存储器中。指令要进行操作,都有相应的数据参加,可是数据在哪里?是什么?都是通过不同的方式来找到的。这就是为什么需要寻址。

寻找指令中所需要的操作数或操作数地址的方式称为寻址方式。80486指令系统的寻址方式包括三种类型:操作数寻址、转移地址寻址及I/O端口寻址。其中操作数寻址有七种。

1.立即数寻址(immediate addressing)

立即数

什么是立即数,操作数包含在指令中。在取指令的同时,操作在操作码后面数随着取出,这种操作数被称为立即数。一般立即数以常数形式出现的。常数可以是二进制数、十进制数、十六进制数、字符串。

立即数寻址

当立即数寻址时,只允许源操作数为立即数,目标操作数必须是寄存器或存储器,其作用是给寄存器或存储单元赋值。在汇编中,立即数不能作为指令中的第一操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。比如下面的第二操作数都是立即数。

例如:

MOV AL, 0FH ; 将8位立即数0FH传送到AL寄存器中

0FH 是源操作数,0F是16进制数,用后缀H表示的。如果16进制数的第一位超过9,即第一位是A到F,在写程序代码时需要在数字前面加一个0,以便与程序中的变量区分。 AL是一个寄存器,在指令中做目的操作数(第一操作数)。MOV指令是将源操作数送给目的操作数。所以整条指令是把十六进制数0FH送到寄存器AL中

MOV AX, 0102H ; 将16位立即数0102H传送到AX寄存器中

MOV EAX,12345678h;将32位立即数12345678h传送到EAX寄存器中

注释:

AX是16位寄存器累加器,可分成AH、AL两个8位寄存器单独使用

AL是8位寄存器累加器

EAX是32位的寄存器



2.寄存器寻址(register addressing)

寄存器

什么是寄存器,是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。通用寄存器(GR)用以存放操作数、操作数的地址或中间结果;指令寄存器(IR)用以存放当前正在执行的指令,以便在指令执行的过程中,控制完成一条指令的全部功能。寄存器由于容量小,不可能什么都存储的,它一般就存放一些地址作为索引,cpu执行指令的时候根据它的地址去内存找相关内容来完成当前的执行。包括变量的内容什么的。至于通用寄存器ax之类,通常就用来暂存中间的结果,比如从内存取出的变量,先用一寄存器保存,然后执行指令,这样寄存器的内容会发生变化(指令是直接作用于寄存器对象的),然后把它的内容可以传给内存保存下来。ax,bx,cx,dx在一般情况下可以通用,只是要注意它们的特殊用法,比如在loop指令的时候默认的就是操作cx,还有bx是唯一能够当指针寄存器来用的通用寄存器,ax一般用于dos功能调用等等。

AX 寄存器称为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的I/O指令都要使用累加器与外设接口传递数据。

BX 寄存器称为基址寄存器,常用来存放访问内存时的地址。

CX 寄存器称为计数寄存器,在循环、串操作指令中用作计数器。

DX 寄存器称为数据寄存器,在寄存器间接寻址中的I/O指令中存放I/O端口的地址。

此外,在做双字长乘除法运算时,DX 与AX合起来存放一个双字长数(32位),其中DX存放高16位,AX存放低16位。

比如:

AX是16位寄存器累加器,可分成AH、AL两个8位寄存器单独使用

AL是8位寄存器累加器,因为这样可以向下兼容8位程序,BX、CX、DX也一样,

字母H就是高HIGH,字母L代表低LOW

寄存器寻址

什么是寄存器寻址,指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。寄存器寻址方式是一种简单快捷、常用的寻址方式,源和目的操作数都可以是寄存器。这种寻址方式有两个好处,一,这种指令中寄存器通过3个位来指定,因此整条指令可以挤在1个字节里,这一点与直接寻址是不同的,也因此提高了代码效率。二,指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,在指令执行过程中,在CPU内部进行,会减少读/写存储器单元的次数,所以执行速度快。

特点是操作数在CPU内部的寄存器中,在指令中指定寄存器号。

对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI和SP等;

对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。

例如:

(1)目的操作数是寄存器寻址方式

MOV AX, 1234h ; 将源操作数1234h中的内容传送到AX中。目的操作数是寄存器AX

(2)源操作数是寄存器寻址方式

ADD VARD,EAX; VARD是双字类型变量,将源操作数EAX寄存器的内容传到VARD

(3)源和目的操作数都是寄存器寻址方式

MOV AX, CX ;源和目的操作数都是寄存器,



3.直接寻址(direct addressing)

直接寻址

操作数一般存放在存储器的数据段中,而操作数的有效地址EA由指令给出。这种寻址方式为直接寻址方式。

物理地址

在通常情况下,操作数存放在数据段中。所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址(偏移)直接形成。若使用段前缀,则操作数从段前缀指定的段读取。

物理地址=(DS)×16+EA

例如: MOV AX, [2000H] ; DS=3000H;内存单元32000H的值为5030H。

该指令的寻址及执行过程如图所示



已知,DS=3000H,已知EA=2000H, 将有效地址EA=2000H字单元中的内容传送到AX寄存器。

物理地址=3000H×16+2000H=32000H

汇编语言中,带方括号“[ ]”的操作数表示存储器操作数,括号中的内容作为存储单元的有效地址EA。存储器操作数本身并不能表明地址的类型,而需通过另一个寄存器操作数的类型或别的方式来确定。由于目标操作数AX为字类型,源操作数也应与之配套,所以有效地址EA=2000H为字单元。

AX是寄存器,在计算机储存地址时,作为基址寄存器,[2000H]位移量的值表示的是操作数单元的地址(偏移地址),DS=3000H是段地址,而实际是需要的是物理地址,因未指定段前缀,则默认数据在数据段中。所以使用DS的值和偏移2000相加,得存储单元物理地址为32000H。其实,段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低四位一定是0,这样就可以规定段地址只取起始地址的高16位值,偏移地址是指在段内相对与起始地址的偏移量,计算物理地址就是把段地址左移4位加偏移地址。即(30000+2000)H=32000H。

“高高低低”是指5030H高八位和低八位。如AX有高八位字节AH 和低八位字节AL。即将存储器32000H和32001H两个存储单元的内容高位字节对应高地址,低位字节对应低地址,送到AX寄存器中。比如,7d0h即07d0h,一个16进位的数字等于4个二进位,那么高八位是07低八位是d0。再把对应高地址07,对应低地址d0送到寄存器中。

直接寻址允许用符号地址来代替数值地址,例如:MOV AX, [DATA],变量DATA为存放操作数的存储单元的符号地址。还可写成MOV AX, DATA。直接寻址适用于处理单个变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息