文章目录
- 操作码与操作数
- 1. 8086处理器的与数据有关的寻址方式
- 1.1 立即数寻址方式
- 1.2 寄存器寻址方式
- 2. 有效(偏移)地址(effective address,EA)与缺省段寄存器选择
- tips:段跨越前缀
- 2.1 直接寻址
- tips:直接寻址与立即寻址的差别
- 2.2 寄存器间接寻址方式
- 2.3 寄存器相对寻址方式
- 2.4 基址变址寻址方式
- 2.5 相对基址变址寻址方式
操作码与操作数
指令由操作码和操作数两部分组成。
- 操作码 说明计算机要执行的操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。
- 操作数 是指令执行的参与者,即各种操作的对象。也就是指令执行操作过程中需要的操作数。有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,通常称为一地址指令、二地址指令、三…
- 基本格式如图
80x86的大多数运算型指令采用二地址指令,少数采用三地址指令。
操作数是指令的一部分,存放在代码段中
计算机只能识别二进制代码,所以机器指令是用二进制代码组成的。为便于人们使用采用汇编语言来编写程序。汇编语言中采用助记符表示操作码,用符号表示操作数或操作数地址。它与机器指令一一对应
1. 8086处理器的与数据有关的寻址方式
寻址、寻址方式的概念
- 寻址就是寻找操作数的地址(如何找到指令所需数据、
指令执行结果存放到哪里?寄存器/存储器)。 - 寻址方式就是指令中用于说明操作数所在地址的方法。
寻址方式又可分成两种:与数据有关的寻址方式、与转移地址有关的寻址方式
1.1 立即数寻址方式
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的 一部分存放在代码段中,这种操作数称为立即数寻址。
如MOV AX, 3064H
执行后(AX)=3064H
**tips:**立即数只能作为源操作数,一般用来初始化寄存器或变量;另外需要注意数据长度应和目的操作数范围内(不要将如16位数据传入8位寄存器)
1.2 寄存器寻址方式
操作数存储在寄存器中,指令中指定寄存器号,这种寻址方式称为寄存器寻址方式。
在该寻址方式下可以引用的寄存器有:
- 8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL;
- 16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
- 32位寄存器: EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP和段寄存器等;
如MOV AX,BX
执行前,(AX)=3064H,(BX)=1234H
执行后:(AX)=1234H,(BX)=1234H
tips:
- 指令中源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;(即使是如
MOV BX,AL
这种操作也不可) - 两个操作数不能同为段寄存器;
- 目的操作数不能为代码段寄存器(CS)。
2. 有效(偏移)地址(effective address,EA)与缺省段寄存器选择
当寻址方式中操作数都在除代码段之外的存储区中(下面介绍的都是)。通过不同的寻址方式,需要先获得操作数地址,从而取得操作数。
而操作数的物理地址等于段基址,再加上偏移地址而取得。其中段基地址可以从段寄
存器取得或者通过段寄存器计算得到,那么得到物理地址的重点就在于如何获取偏移地址(有效地址)
有效地址(EA)由以下4种成分组成:
- 位移量(displacement):存放在指令中的一个8位或16位或32位的数,但它不是立即数,而是一个地址;
- 基址(base):存放在基址寄存器(如BX、BP)中的内容。它是有效地址中的基址部分,通常用于指向数据段中数
组或字符串的首地址。 - 变址(index):存放在变址寄存器(如SI、DI)中的内容。通常用来指向数组中某个元素或字符串的某个字符。
- 比例因子(scale factor)是386以以后机型新增加的寻址方式中的一个术语,其值可以是1、2、4或8。
有效地址(EA)可以用下列式子表示:EA=基址+(变址x比例因子)+位移量 - 此外不允许使用AX、CX、DX 存放 EA
8086/8088只能使用16位寻址方式,有效地址只有3种成分组成,无比例因子
又因为物理地址((PA—Physical Address)=段地址(此处指有效地址)×16(即十六进制数后加一个0) + 偏移量
故为了得到物理地址我们还需要知道段地址,缺省选择规则如表
访存类型 | 所用段及段寄存器 | 缺省选择规则 |
---|---|---|
指令 | 代码段 CS寄存器 | 用于取指 |
堆栈 | 堆栈段 SS寄存器 | 所有堆栈的进栈和出栈 |
局部数据 | 数据段 DS寄存器 | 一般数据 |
目的串 | 附加数据段 ES寄存器 | 串处理指令目的串 |
8086/8088允许程序员使用段跨越前缀来改变系统指定的默认段。但以下3种情况不允许使用段跨越前缀。
- 指令必须在代码段CS中;
- PUSH指令的源操作数和POP指令的目的操作数必须使用SS段;
- 串处理指令的目的串必须使用附加段ES;
tips:段跨越前缀
当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。
汇编格式:段寄存器名:操作数地址。
冒号“ : ”之前的段寄存器名指明操作数所在的段。
eg: MOV AX,DS:[BP]
/MOV CX,SS:[SI]
该例中,DS:、SS:均为跨段前缀,此时默认状态无效(BP默认段为SS)
操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。
上述2条指令的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+ [SI] (十六进制左移1位)
在不使用段超越前缀的情况下,有下列规定:
- 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存
器为DS; - 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆
栈段)。
2.1 直接寻址
操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值即操作数的有效地址。
eg:MOV AX ,[2000H]
设(DS)=3000H。 执行后:(AX)=30000H+2000H
tips:直接寻址与立即寻址的差别
对于内存变量名(符号地址)其本身就表示其地址,所以对于如下
MOV AX, 1234H
!= MOV AX, [1234H]
前者是立即寻址,后者是直接寻址
MOV AX, VARW
== MOV AX, [VARW]
两者是等效的,均为直接寻址
2.2 寄存器间接寻址方式
当操作数的有效地址只包含基址寄存器内容或者变址寄存器内容一种成分。因此有效地址就在某个寄存器中,而操作数则在存储器中。(16位寻址可用的寄存器:BX,BP,SI,DI)
汇编格式:目标寄存器名,[源寄存器名]
eg:MOV AX, [BX]
,在执行时,(DS)=2000H,(BX)=1000H,存储单元21000H的内容是50A0H。问执行指令后,AX的值此时存储50A0H
注意寄存器BX存储的值不是操作数的值,而是操作数的地址。
2.3 寄存器相对寻址方式
操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位偏移量之和。 (寄存器的规定同寄存器间接寻址)
汇编格式:目标寄存器名,X[寄存器R](X表示位移量,16位寻址:X是8位或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。
eg:
MOV AX, COUNT[SI]
或 MOV AX, [COUNT+SI]
假设 (DS)=3000H, (SI)=2000H, COUNT=3000H(符号地址),则: PA = (30000H+(2000))
假设(35000H)=1234H, 那么 (AX)=1234H(值 不是地址)
2.4 基址变址寻址方式
操作数有效地址是一个基址寄存器(如BX、BP)和一个变址寄存器(如SI、DI)的内容之和。 有效地址由两种成分组成。
MOV BX, [BX+SI]
or MOV AX, [BX] [SI]
,在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。执行后,BX的值是1234H
2.5 相对基址变址寻址方式
操作数有效地址是一个基址寄存器(如BX、BP)的值与一个变址寄存器(如SI、DI)的值和指令中的偏移量之和。(16位寻址位:移量为8位/16位) 有效地址由三种成分组成。
eg:
MOV AX, [BX+SI+200H]
or MOV AX, BX [SI+200H]
or MOV AX, BX SI 200H
,
在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,(AX)=10000H+(2100H+0010H+10H)
这种寻址方式通常用于二维数组的寻址。