第三章址方式与指令系统 3,寻址方式 条指令通常由两大部分构成: 操作码「操作数 操作码部分:表示该指令应完成的具体操作,如加法、减 法、乘法、移位等等。在汇编语言中使用一定的符号来表示, 称为助记符。如ADD、PUSH、POP、MOV等等。 操作数部分:表示该指令的操作对象。如移位操作的被移位 数,加法操作的加数等等。它可以是一个操作数,也可以是 多个操作数。这取决于操作码部分的具体需要
1 第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数 操作码部分:表示该指令应完成的具体操作,如加法、减 法、乘法、移位等等。在汇编语言中使用一定的符号来表示, 称为助记符。如ADD 、PUSH、POP、MOV等等。 操作数部分: 表示该指令的操作对象。如移位操作的被移位 数,加法操作的加数等等。它可以是一个操作数,也可以是 多个操作数。这取决于操作码部分的具体需要
寻找指令中所需操作数的各种方法叫寻址方式 Intel8086/8088CPU各指令中操作数的来源有以下四种: (1)操作数在指令代码中提供立即数操作数 (2)操作数在CPU的通用寄存器或段寄存器中 寄存器操作数 (3)操作数在内存的存储单元中存储器操作数 (4)操作数在输入输出接口的寄存器中—输入输 出端口操作数
2 寻找指令中所需操作数的各种方法叫寻址方式 Intel 8086/8088 CPU各指令中操作数的来源有以下四种: (4)操作数在输入/输出接口的寄存器中——输入/输 出端口操作数。 (1)操作数在指令代码中提供——立即数操作数 (2)操作数在CPU的通用寄存器或段寄存器中—— 寄存器操作数 (3)操作数在内存的存储单元中——存储器操作数
1.立即数寻址 立即数寻址方式的指令中,所需操作数直接包含在指令 代码中,这种操作数称为立即数。 立即数可以是8位,也可以是16位。 例: MOV AH,20H 它表示将8位立即数20H送入AH中 AH AL AX 操作码 20H 一条指令
3 1.立即数寻址 立即数寻址方式的指令中,所需操作数直接包含在指令 代码中,这种操作数称为立即数。 例:MOV AH,20H 它表示将8位立即数20H送入AH中 AH AL AX 操作码 20H 一条指令 …... …... 立即数可以是8位,也可以是16位
例: MOV AX,20AOH 它表示将16位立即数20A0H送入AX中 AH AL AX 操作码 AOH 条指令 20H 由于在指令执行过程中,立即数作为指令的一部分直接 从BIU的指令队列中取出,它不需另外占用总线周期,因此 这种寻址方式执行速度快。 注意:立即数只能作为源操作数,而不能作为目的操作数
4 例:MOV AX,20A0H 它表示将16位立即数20A0H送入AX中 由于在指令执行过程中,立即数作为指令的一部分直接 从BIU的指令队列中取出,它不需另外占用总线周期,因此 这种寻址方式执行速度快。 注意:立即数只能作为源操作数,而不能作为目的操作数。 AH AL AX 操作码 20H 一条指令 …... …... A0H
2寄存器寻址 寄存器寻址方式是指指令中所需的操作数在CPU的某 个寄存器中。寄存器可以是8位或16位通用寄存器,或者是 段寄存器。如:AH、AL、AX、CX、DS、ES等。 例如: MOV AX,BX MOV DS, AX 由于存取寄存器操作数完全在CPU内部进行,不需要 总线周期,所以执行速度很快。 后面介绍的几种寻址方式其操作数都是在存储器中,因此它 们的主要区别就是操作数在内存中存放地址的形成方法不同
5 2.寄存器寻址 寄存器寻址方式是指指令中所需的操作数在CPU的某 个寄存器中。寄存器可以是8位或16位通用寄存器,或者是 段寄存器。如:AH、AL、AX、CX、DS、ES等。 例如:MOV AX,BX MOV DS,AX 由于存取寄存器操作数完全在CPU内部进行,不需要 总线周期,所以执行速度很快。 后面介绍的几种寻址方式其操作数都是在存储器中,因此它 们的主要区别就是操作数在内存中存放地址的形成方法不同
个存储单元逻辑地址表示形式:段基值:偏移量 段基值由某个段寄存器提供 偏移量表示了该存储单元与段起始地址之间的距 离,也叫做有效地址EA。 有效地址EA是以下三个地址分量的几种组合,由CPU 的执行单元EU计算出来的。 (1)位移量:位移量是指令中直接给出的一个8位或16位数 般源程序中以操作数名字(变量名或标号)的形式出现。 (2)基址:由基址寄存器BX或基址指针BP提供的内容。 (3)3 变址:由源变址寄存器S或目的变址寄存器D提供内容
6 一个存储单元逻辑地址表示形式: 有效地址EA是以下三个地址分量的几种组合,由CPU 的执行单元EU计算出来的。 段基值由某个段寄存器提供. 偏移量表示了该存储单元与段起始地址之间的距 离,也叫做有效地址EA。 (1)位移量:位移量是指令中直接给出的一个8位或16位数。 一般源程序中以操作数名字(变量名或标号)的形式出现。 (2)基址:由基址寄存器BX或基址指针BP提供的内容。 (3)变址:由源变址寄存器SI或目的变址寄存器DI提供内容 段基值:偏移量
位移量、基址和变址三个地址分量组合时,若有两个或 两个以上分量时,将进行以216为模的十六位加法运算。 下面是由这三个地址分量的不同组合所形成的四种寻址方式。 3直接寻址 在直接寻址方式的指令中,操作数的有效地址EA只有 位移量地址分量。 指令操作码操作数 内存 EA H 操作数 段寄存器_↑
7 位移量、基址和变址三个地址分量组合时,若有两个或 两个以上分量时,将进行以2 16为模的十六位加法运算。 下面是由这三个地址分量的不同组合所形成的四种寻址方式。 3.直接寻址 在直接寻址方式的指令中,操作数的有效地址EA只有 位移量地址分量。 指令 操作码 操作数 EA 操作数…... …... 内存 段寄存器
在汇编语言源程序中,直接寻址方式用符号或常数来表示。 (1)用符号表示 例: MOV BX,VAR→ MOV BX,DS:MAR 它表示将数据段中,偏移了VAR个字节距离的字单元 内容送到寄存器BX中。 MOV AL, DATA+2=> MOV AL, DS: DATA+2 它表示将数据段偏移了DATA+2的字节单元内容送入AL中。 (2)用常数表示 例:MOⅴAX,DS:[64H 它表示从当前数据段开始,偏移100个字节的字单元内容 送到AX中。不能写为: MOV AX,64H 注意:用常数表示时,必须用方括号括起来。段寄存 器可以省略,如果省略则为数据段,即DS所指段
8 在汇编语言源程序中,直接寻址方式用符号或常数来表示。 (1)用符号表示 例:MOV BX,VAR 它表示将数据段中,偏移了VAR个字节距离的字单元 内容送到寄存器BX中。 它表示将数据段偏移了DATA+2的字节单元内容送入AL中。 MOV AL,DATA+2 (2)用常数表示 它表示从当前数据段开始,偏移100个字节的字单元内容 送到AX中。不能写为:MOV AX,64H 例:MOV AX,DS:[64H] 注意:用常数表示时,必须用方括号括起来。段寄存 器可以省略,如果省略则为数据段,即DS所指段。 =>MOV BX,DS:VAR => MOV AL, DS: DATA+2
4寄存器间接寻址 操作数有效地址EA直接从基址寄存器(BX或BP)或 变址寄存器(S或DI)中获得。 BX 内存 操作码操作数OR BP OR SI + EA OR 操作数 段寄存器 寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX、 BP、S或D中,这些寄存器就如同一个地址指针 在程序运行期间,只要对寄存器内容进行修改,就可以实 现用同一条指令实现对不同存储单元进行操作
9 4.寄存器间接寻址 操作数有效地址EA直接从基址寄存器(BX或BP)或 变址寄存器(SI或DI)中获得。 寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX、 BP、SI或DI)中,这些寄存器就如同一个地址指针。 在程序运行期间,只要对寄存器内容进行修改,就可以实 现用同一条指令实现对不同存储单元进行操作。 操作码 操作数 OR OR OR BX DI BP SI EA 操作数…... …... 内存 段寄存器
指示存储器所在段的段寄存器可以省略,当指令中 使用的是BP寄存器,则隐含表示使用SS段寄存器,其余 情况则隐含使用DS段寄存器。 例如:MOAX,|BX]= MOV AX,DS:BX MOV BH, [BPI=> MOV BH, SS: [ BPI MOV[D,BX→MoDS:ID,BX
10 例如:MOV AX,[BX] MOV BH,[BP] MOV [DI],BX 指示存储器所在段的段寄存器可以省略,当指令中 使用的是BP寄存器,则隐含表示使用SS段寄存器,其余 情况则隐含使用DS段寄存器。 => MOV AX,DS:[BX] => MOV BH,SS:[BP] => MOV DS:[DI],BX