【微机原理与接口技术】指令系统
涵盖8086/8088内部寄存器类型,编址方式,与常见的汇编指令
8086/8088内部寄存器的类型
14个16位寄存器,按功能可分为三类:8个通用寄存器,4个段寄存器,2个控制寄存器。
通用寄存器
-
数据寄存器(AX,BX,CX,DX):8088/8086含4个16位数据寄存器,每一个又可拆分为2个8位寄存器。
AX:累加器。所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中。
BX:基址寄存器。在间接寻址中用于存放基地址。
CX:计数寄存器。用于在循环或串操作指令中存放计数值。
DX:数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。
-
地址指针寄存器(SP,BP)
SP:堆栈指针寄存器,其内容为栈顶的偏移地址。
BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。
BX和BP的区别:作为基址寄存器,用BX表示所寻找的数据在数据段,用BP则表示数据在堆栈段。
-
变址寄存器(SI,DI)
SI:源变址寄存器
DI:目的变址寄存器
变址寄存器在指令中常用于存放数据在内存中的地址。
段寄存器
- CS:代码段寄存器,存放代码段的段基地址。
- DS:数据段寄存器,存放数据段的段基地址。
- ES:附加段寄存器,存放数据段的段基地址。
- SS:堆栈段寄存器,存放堆栈段的段基地址。
控制寄存器
- IP: 指令指针寄存器
- FLAGS:标志寄存器
8086/8088内存单元的编址
- 内存单元的地址表示有物理地址和逻辑地址两种方式
- 物理地址:指每个内存单元在整个内存空间中具有的惟一的地址。8086/8088CPU有20根地址线,它可以产生20位的地址码,寻址范围为220,即1兆字节空间。为了方便书写,在源程序中常用5位十六进制数或一个符号来表示一个存储单元的地址。
- 任何两个相邻字节单元就构成一个字单元。字单元的地址为两个字节单元中较小地址字节单元的地址。字数据的存放规则是低8位放在较低地址字节单元,高8位放在较高地址字节单元。
- 逻辑地址:每个存储单元的逻辑地址由两部分组成。16位的段(基)地址—决定该逻辑段在内存中的位置。16位的段内地址,也叫相对地址,或偏移地址—决定该存储单元相对段起始单元的距离。逻辑段的起始单元称为段首,段首的偏移地址=0。
- 物理地址=段基地址×16+偏移地址
寻址方式
立即寻址
- 指令中的源操作数是立即数,即源操作数是参加操作的数据本身,
- 立即寻址仅适合于源操作数
- 例:MOV AX,1200H

寄存器寻址
- 参加操作的操作数在CPU的通用寄存器中。例:MOV AX,BX
- 执行时不必访问内存就可取得操作数,执行速度较快。
直接寻址
- 指令中直接给出操作数的偏移地址,默认在数据段,可以允许段重设。
- 注意:存储器操作数的长度由指令中另一个操作数的长度决定。
- 操作数的段地址默认为数据段,但允许段重设,即由指令定义段,说明数据存放在其他逻辑段中。例:MOV AX,ES:[1200H],这种情况称为段超越,所加的段寄存器叫段前缀。
寄存器间接寻址
- 寄存器的内容表示操作数的偏移地址,此时寄存器中的内容不再是操作数本身,而是存放数据的偏移地址,操作数本身在内存中。
- 存放偏移地址的寄存器称为间址寄存器,它们可以是:BX,BP,SI,DI,操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:BX,SI,DI默认在数据段DS,BP默认在堆栈段SS。
- 偏移地址长度均为16位,故间址寄存器必须是16位寄存器。
- 例:MOV BX,1200H,MOV AX,[BX]

寄存器相对寻址
- 操作数的偏移地址为寄存器的内容加上一个位移量(常量)
- 可以使用的寄存器为:BX、BP、SI和DI
基址-变址寻址
- 操作数的偏移地址为:一个基址寄存器的内容 + 一个变址寄存器的内容
- 操作数的段地址由选择的基址寄存器决定:基址寄存器为BX,默认在数据段基址寄存器为BP,默认在堆栈段
基址-变址-相对寻址
指定一个基址寄存器和一个变址寄存器。同时给出一个8位或16位的位移量
隐含寻址
指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。
数据传送指令
通用数据传送指令
一般传送指令MOV
- 格式:MOV dest,src
- 两操作数长度必须相同
- 存储单元之间不能直接传送
- 段寄存器CS只能作源操作数,段寄存器之间不能直接传送
- 在源操作数是立即数时,目标操作数不能是段寄存器
堆栈操作指令PUSH/POP
- 存取以字为单位,堆栈操作指令的操作数必为16位
- 操作数不能是立即数;可以是16位寄存器或存储器1个字单元;若为存储器操作数,需要声明操作数的字长。
- 压栈指令PUSH,指令执行过程:SP - 2 → SP,操作数高字节 → (SP+1),操作数低字节 → (SP)
- 出栈指令POP,指令执行过程:(SP)操作数低字节弹出,(SP+1)操作数高字节弹出 ,SP ← SP+2
交换指令XCHG
- 格式:XCHG OPRD1,OPRD2,将源地址和目标地址中的内容进行互换
- 两操作数必须有一个是寄存器操作数,不允许使用段寄存器。
查表转换指令XLAT
- 格式:XLAT
- 指令为零操作数指令,采用隐含寻址,隐含的操作数为BX和AL。用BX的内容代表表格首地址,AL内容为表内位移量, BX+AL得到要查找元素的偏移地址。
输入输出指令IN/OUT
-
指令功能:专门面向I/O端口操作的指令
-
指令格式
输入指令:IN acc,PORT
输出指令:OUT PORT,acc,PORT为端口地址,acc为累加器AL或AX
-
直接寻址:端口地址为8位时,指令中直接给出8位端口地址;可寻址256个端口。
-
间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;可寻址64K个端口。
取偏移地址指令LEA
- 指令格式:LEA REG,MEM
- 操作:将变量的16位偏移地址取出送目标寄存器,当程序中用符号地址表示内存偏移地址时,须使用该指令。
- 源操作数必须是一个存储器操作数,目标操作数必须是16位通用寄存器,通常是间址寄存器。
装入地址指针指令LDS和LES
- 格式:LDS DEST,SRC; LES DEST,SRC
- 把SRC存储单元开始的4个字节单元的内容送入DEST通用寄存器和段寄存器DS(LDS指令)或ES(LES指令)。
- DEST十六位通用寄存器,SRC必须是一个存储器操作数。
算术运算指令
加法运算指令
普通加法指令ADD
- 格式:ADD OPRD1 OPRD2
- 操作:OPRD1+OPRD2 →OPRD1
- ADD指令的执行对全部6个状态标志位都产生影响
- 不允许两个操作数都是存储器操作数,不允许把段寄存器作为操作数
带进位位的加法指令ADC
- 指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样,只是CF也要参加求和运算
- 操作:OPRD1+OPRD2+CF→OPRD1,注意:CF是该指令执行前的值
- ADC指令常用于多字节数相加,使用前要先将CF清零。
加一指令INC
- 格式:INC OPRD
- 操作:OPRD+1 → OPRD,注意:INC指令执行不影响CF标志
- 不能是段寄存器或立即数
减法运算指令
减法指令对操作数的要求与对应的加法指令相同
不考虑借位的减法指令SUB
- 格式:SUB OPRD1,OPRD2
- 操作:OPRD1-OPRD2 →OPRD1
考虑借位的减法指令SBB
- 指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样,只是CF也要参加求和运算
- 操作:OPRD1-OPRD2-CF→OPRD1,注意:CF是该指令执行前的值
减一指令DEC
- 格式:DEC OPRD
- 操作:OPRD-1 → OPRD,注意:DEC指令执行不影响CF标志
CMP指令
- 格式:CMP OPRD1,OPRD2
- 操作:OPRD1- OPRD2
- 指令执行的结果不影响目标操作数,仅影响标志位!
- 用于比较两个数的大小,可作为条件转移指令转移的条件
- 指令对操作数的要求及对标志位的影响与SUB指令相同。
- 两个无符号数的比较:两个数的大小由CF或ZF来判断,CMP AX,BX,若AX>BX,CF=0;AX<BX,CF=1;AX=BX,ZF=1
- 两个带符号数的比较:两个数的大小由OF和SF共同决定,OF和SF状态相同,AX > BX; OF和SF状态不同,AX < BX
逻辑运算和移位指令
- 逻辑运算指令对操作数的要求大多与MOV指令相同。
- “非”运算指令要求操作数不能是立即数
- 除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0,AF不变,并对SF,PF和ZF有影响
逻辑运算指令
逻辑与指令AND
- 格式:AND OPRD1,OPRD2
- 操作:两操作数按位相“与”,结果送目标地址。
- 应用:实现两操作数按位相与的运算;使目标操作数的某些位不变,某些位清零;在操作数不变的情况下使CF和OF清零
逻辑或指令OR
- 格式:OR OPRD1,OPRD2
- 操作:两操作数按位相“或”,结果送目标地址。
- 应用:实现两操作数按位相或的运算;使目标操作数的某些位不变,某些位变1;在操作数不变的情况下使CF和OF清零
逻辑非指令NOT
- 格式:NOT OPRD
- 操作:操作数按位取反再送回原地址
- 指令中的操作数不能是立即数,指令的执行对标志位无影响
逻辑异或指令XOR
- 格式:XOR OPRD1,OPRD2
- 操作:两操作数按位相“异或”,结果送目标地址。
测试指令TEST
- 格式:TEST OPRD1,OPRD2
- 操作:执行“与”运算,运算的结果影响标志位,但不送回目标地址。
- 常用于测试某些位的状态
移位指令
算术左移SHL和逻辑左移SAL
- 格式:SHL OPRD,CL或SHL OPRD,1;SAL同
- 操作:将目的操作数左移一位或CL指定的位,每左移一位,左边的最高位移入标志位,右边的最低位补0
- 指令系统中它们是同一条指令,正负数算术左移与逻辑左移结果一样
逻辑右移指令SHR
每右移一位,右边的最低位移入标志位CF,而在左边的最高位补0
算术右移指令SAR
和SHR的区别是,最高位不是补0,而是保持不变
不带CF的循环左移ROL和循环右移ROR
ROL指令:最高位移入CF,同时移入最低位构成循环
ROR指令:最低位移入CF,同时移入最高位构成循环
带CF的循环左移RCL和循环右移RCR
RCL指令:最高位移入CF,而CF原来的值移入最低位
RCR指令:最低位移入CF,而CF原来的值移入最高位
串操作指令
源串地址由DS:[SI]提供,目的串由ES:[DI]提供。
每次只处理串中的一个单元(字或字节),并自动修改SI和(或)DI,使其指向下一个单元。
地址修改方向由DF标志位决定:DF=0为增地址方向, DF=1为减地址方向。
指令前面可加上自动重复前缀,实现自动重复执行串操作,重复执行次数由CX指定。
REP:CX不等于0重复
REPE/REPZ:CX不等于0且ZF等于1重复
REPNE/REPNZ:CX不等于0且ZF等于0重复
串传送
MOVS OPRD1,OPRD2
MOVSB
MOVSW
串比较
CMPS OPRD1,OPRD2
CMPSB
CMPSW
串扫描
SCAS OPRD
SCASBS
CASW
执行AX(或AL)-OPRD,结果不保存,只影响标志寄存器。
串装入
LODS OPRD
LODSB
LODSW
对字节: AL<-[DS:SI]
对字: AX<-[DS:SI]
串存储
STOS OPRD
STOSB
STOSW
对字节: AL->[ES:DI]
对字: AX->[ES:DI]
程序控制指令
无条件转移指令JMP
段内直接转移
- 格式:JMP Label
- 说明:转移的目标地址由指令直接给出,如:常数、标号
段内间接转移
- 格式:JMP OPRD
- 说明:转移的目标地址存放在某个16位通用寄存器或存储器的某字单元中
- JMP WORD PTR[BX],在上述指令中,若操作数OPRD是存储器,则要加上类型指示符WORD PTR已说明后面的存储器操作是一个字
段间直接转移
- 格式:JMP FAR LABLE
- 转移的目标地址由指令直接给出
段间间接转移
- 格式:JMP OPRD
- 转移的目标地址由指令中的32位存储器单元给出
条件转移指令JCC
| 指令名称 | 汇编格式 | 转移条件 | 功能说明 |
|---|---|---|---|
| 进位转移 | JC target | (CF)=1 | 有进位或借位 |
| 无进位转移 | JNC target | (CF)=0 | 无进位或借位 |
| 等于或为零转移 | JE/JZ target | (ZF)=1 | 相等或结果为 0 |
| 不等于或为零转移 | JNE/JNZ target | (ZF)=0 | 不相等或结果为 0 |
| 奇偶校验为偶转移 | JP/JPE target | (PF)=1 | 有偶数个 1 |
| 奇偶校验为奇转移 | JP/JPO target | (PF)=0 | 有奇数个 1 |
| 结果为负转移 | JS target | (SF)=1 | 为负数 |
| 结果为正转移 | JNS target | (SF)=0 | 为正数 |
| 溢出转移 | JO target | (OF)=1 | 溢出 |
| 不溢出转移 | JNO target | (OF)=0 | 不溢出 |
| 大于则转移 | JA/JNBE target | (CF)=0 且(ZF)=0 | 无符号数 |
| 大于或等于则转移 | JB/JNAE target | (CF)=0 | 无符号数 |
| 小于则转移 | JB/JNAE target | (CF)=1 | 无符号数 |
| 小于或等于则转移 | JAE/JNB target | (CF)=1 或(ZF)=1 | 无符号数 |
| CX内容为0转移 | JCXZ target | (CX)=0 | |
| 大于则转移 | JG/JNLE target | (SF)=(OF)且(ZF)=0 | 带符号数 |
| 大于或等于则转移 | JGE/JNL target | (SF)=(OF) | 带符号数 |
| 小于则转移 | JL/JNGE target | (SF)≠(OF)且(ZF)=0 | 带符号数 |
| 小于或等于则转移 | JLE/JNG target | (SF)≠(OF)或(ZF)=1 | 带符号数 |
循环控制指令
LOOP指令
- 格式:LOOP LABLE
- 循环条件:CX≠ 0
- 操作:DEC CX,CX-1→CX,JNZ LABEL(符号地址 ),CX ≠ 0则转LABEL,否则执行下条指令
LOOPZ(或LOOPE)指令
格式同上,执行是先使CX内容减1,再根据CX中的以及ZF的值来决定是否继续循环,继续循环的条件是CX≠0且ZF=1,若CX=0或者ZF=0则退出循环。
LOOPNZ(或LOOPNE)指令
继续循环的条件是CX≠0且ZF=0,否则退出循环。
过程调用和返回
段内直接调用
- 格式: CALL NEAR PROC
- 指令中的NEAR可以省略
段内间接调用
- 格式:CALL OPRD
- OPRD是16位寄存器或两个存储器单元的内容,内容代表的是一个近过程的入口地址,例如:CALL WORD PTR[SI]
段间直接调用
- 格式:CALL FAR PROC
- 例:CALL FAR TIMER
段间间接调用
- 格式:CALL OPRD
- OPRD为32位的存储器地址
- 例:CALL DWORD PTR[SI]
返回指令
- 格式:RET
- 功能:从堆栈中弹出断点地址,返回原程序
- RET指令一般位于子程序的最后,返回指令在格式上不区分段内或段间(即1WORD或2WORD)。
中断指令
- 格式: INT n
- n为中断向量码,是一个常数,取值0-255
- 说明: n×4存放“中断服务子程序入口地址”的存储单元的偏移地址
处理器控制指令
CLC:CF<-0
STC:CF<-1
CLD:DF<-0
STD:DF<-1
CLI:IF<-0
STI:IF<-1
HLT:暂停指令
更多推荐


所有评论(0)