微机与接口技术笔记(2)

继续记录课本第3章,关于指令的知识点

指令格式和寻址方式

通常一条指令包括一个或两个操作数,双操作数分别称为源操作数(SRC)和目的操作数(DST)

8086、8088的寻址方式

  1. 操作数在指令中,即指令中的操作数部分就是操作数本身,这种叫立即操作数
  2. 操作数在CPU内部的某个寄存器中,这时操作数是CPU内部寄存器的一个编码
  3. 操作数在内存区中,这是指令的操作数部分包含操作数所在的内存地址

立即数寻址方式

立即数放在指令中,立即数可以是8位或者16位,可以用二进制、八进制、十进制以及十六进制数表示。

1
2
3
4
5
mov     al,10           ;(al)<-立即数10
mov al,00100101b ;(al)<-立即数00100101b
mov al,0ah ;(al)<-立即数0ah
mov ah,58h ;(ah)<-立即数58h
mov bx,1234h ;(bx)<-立即数1234h

上面的12H放BH,34H放BL

寄存器寻址方式

寄存器寻址方式的操作数就存放在指令规定的寄存器中,寄存器的名字在指令中指出。对于16位操作数,寄存器可以有AX,BX,CX,DX,SI,DI,SP,BP;对于8位操作数,寄存器可以有AH,AL,BH,BL,CH,CL,DH,DL。

1
2
mov     al,cx           ;(AX)<-(cx)
INC al ;(al)<-(al)+1

上面两种要注意操作对象的位数是否匹配,下面情况都是错的

1
2
mov     al,1234h        ;al是8位,1234h是16位
mov al,dx ;al是8位,dx是16位

直接寻址方式

操作数在储存器中,通过有效地址取得操作数,有效地址是一个16位二进制数

1
2
3
4
mov     ah,[1234h]      ;将DS段中1234H单元内容送AH
mov ah,value ;将DS段value单元内容送ah
mov ax,[2100h] ;将DS段2100h单元内容送al,2101h送ah
mov bx,es:[2000h] ;段超越,操作数在附加段,即物理地址=(es)*16+2000H

再提一次上一节内容,物理地址=段地址*16(16进制段地址左移一位)+有效地址

寄存器相对寻址方式

寄存器相对寻址方式的操作数有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容+指令中给定的8位或16位位移量,即有效地址由两种分量组成。

以SI、DI、BX,间接寻址,则通常操作数在现行数据段DS区域中,物理地址计算方法为:

  • 物理地址=16 X (DS) + SI/DI/BX

如果使用寄存器BP时,操作数所在存储单元的段地址在堆栈寄存器SS中,物理地址计算方法为:

  • 物理地址=16 X (SS) + BP

例如:(DS)=3000H,(SI)=2000H,指令 mov ax,[si] ,物理地址=(DS)*16+2000H=32000H

指令的执行结果就是将32000H和32001H单元的内容送入寄存器AX中。当然BP也可以和其他的段寄存器相加形成物理地址,如mov ax,ds:[si]

寄存器相对寻址方式

寄存器相对寻址方式的操作数有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容+指令中给定的8位或16位位移量,即有效地址由两种分量组成。一般情况下,如果指令中的寄存器是BX,SI,DI,则对应的段地址默认是DS,如果是BP,则对应的段地址默认是SS。同样的,寄存器相对寻址方式也允许段超越。其中位移量可以是一个8位或者16位的立即数,也可以是符号地址。

例如:(DS)=2000H,(SI)=1000H,ARRAY=2000H(16位位移量),指令:mov bx,array[si]或者mov bx,[array+si]

有效地址=(si)+(array)=1000h+2000h=3000h,物理地址=20000H+3000H=23000H

基址变址寻址方式

基址变址寻址方式的操作数有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和,即有效地址由两种分量组成。不允许同时使用BX和BP或者SI和DI。

当使用BX时段寄存器为DS,当使用寄存器BP时,段寄存器为SS,所以物理地址为:

  • 物理地址=16*(DS)+(BX)+(SI/DI)
  • 物理地址=16*(SS)+(BP)+(SI/DI)

同样可以跨越段,如:mov ax,es:[bx+di]

基址变址相对寻址方式

基址变址相对寻址方式的操作数有效地址是一个基址寄存器与一个变址寄存器的内容和指令中给定的8位或16位位移量之和,即有效地址由三种分量组成。

有效地址为:EA=(BX)/(BP) + (SI)/(DI) + DISP8/DISP16

所以物理地址为:

  • 物理地址=16*(DS)+(BX)+(SI/DI)+DISP8/DISP16
  • 物理地址=16*(SS)+(BP)+(SI/DI)+DISP8/DISP16

如指令mov ax,data[bx][si]或者mov ax,data[bx+si]或者`mov ax,[data+bx+si]

同样是不允许同时使用BX和BP或者SI和DI。

转移地址有关的寻址方式

控制转移指令在段内、段间转移时,使用直接(相对)寻址或间接寻址方式

数据传送类指令和串操作类指令

概述

8086、8088指令系统共有117条基本命令,按照功能分为6类:

  1. 数据传输类
  2. 算术
  3. 逻辑移位
  4. 串操作
  5. 控制转移
  6. 处理机控制类

通用数据传送指令

包括传送指令MOV(move)、进栈指令PUSH(push onto the satack)、出栈指令POP(pop from the stack)和交换指令XCHG(exchange)

MOV传送指令

指令格式:MOV DST,SRC,DST<-SRC

下面是错误示范

1
2
3
4
5
6
7
mov  1234h,ax       ;立即数不能做目标操作数
mov cs,ax ;cs不能用于目标操作数
mov ip,ax ;IP不能用于目标操作数
mov ds,1234h ;立即数不能直接送段寄存器
mov al,bx ;源操作数与目标操作数的位数必须一致
mov buf1,buf2 ;不能在两个储存器单元之间传送数据
mov ds,es ;不能在两个段寄存器单元之间传送数据

堆栈操作指令

PUSH进栈指令:把一个字的操作数从源地址压进堆栈中

POP出栈指令:把一个字的操作数从栈中弹出到目的操作数

PUSH指令格式:PUSH SRC

1
2
指令执行操作: (SP) <- (SP) - 2
((SP)+1,(SP)) <- SRC

POP指令操作: POP DST

1
2
指令执行操作:  (DST) <- ((SP)+1,(SP))
(SP) <- (SP) + 2

例如:已知SP=1000H,AX=1122H,BX=3344H,程序如下

1
2
3
4
PUSH AX
PUSH BX
POP BX
POP AX

两次PUSH流程图如下:

两次POP流程图如下:

错误写法!

1
2
3
4
5
PUSH AL     ; 字节不能进栈
PUSH 1000H ; 立即数不能进栈
POP AL ; 字节不能作为出栈对象
POP CS ; CS不能作为出栈对象(但是可以进栈)
POP 123H ; 立即数不能作为出栈对象

XCHG交换指令

XCHG(exchange)指令可以将源操作数和目的操作数的内容进行交换,可以交换字或者字节

指令格式:XCHG obj1,obj2

错误写法!

1
2
3
4
XCHG    AL,BX       ; 字节和字不能交换
XCHG AX,1000H ; 寄存器与立即数不能交换
XCHG DS,SS ; 段寄存器之间不能交换
XCHG CS,IP ; CS和IP不能交换

累加器专用传送指令

累加器专用传送指令包括:IN(input)输入指令、OUT(output)输出指令、XLAT(translate)查表。

IN/OUT指令

8086、8088采用I/O与储存器是单独编址的,因此访问I/O端口只能用IN/OUT两条指令,IN/OUT指令分为长格式和短格式。长格式指令代码为2个字节,第二字节用PORT表示端口号,端口范围是00~FFH短格式指令代码为1个字节,指定的端口范围是0000~FFFFH

IN指令实现输入端口到CPU的数据传输

长格式:
IN AL,PORT(字节) —- (AL)<-(Port)(字节)
IN AX,PORT(字) —- (AX)<-(Port+1,Port)(字节)

短格式:
IN AL,DX(字节) —- (AL)<-((DX))(字节)
IN AX,DX(字) —- (AX)<-((DX)+1,(DX))(字)

OUT指令实现CPU到输出端口的数据传输

长格式:
OUT PORT,AL(字节) —- (Port)<-(AL)(字节)
OUT PORT,AX(字) —- (Port+1,Port+1)<-(AX)(字)

短格式:
IN DX,AL(字节) —- ((DX))<-(AL)(字节)
IN DX,AX(字) —- ((DX)+1,(DX))<-(AX)(字)

例如: (a)从60H端口输入一个字节数据(b)向61H输出一个字节数据32H(c)从2160H端口输入一个字节数据(d)向2161H端口输入一个字节数据64H

(a)

1
2
3
4
5
方法1:
IN AL,60H
方法2:
MOV DX,60H
IN AL,DX

(b)

1
2
3
4
5
6
7
方法1:
MOV AL,32H
OUT 61H,AL
方法2:
MOV AL,32H
MOV DX,61H
OUT DX,AL

(c)

1
2
MOV     DX,2160H
IN AL,DX

(d)

1
2
3
MOV     DX,2161H
MOV AL,64H
OUT DX,AL

XLAT查表指令

好像没啥用,先不写了

地址传送指令

包括:LEA(load effective address)有效地址送寄存器、LDS(load DS with pointer)指针送寄存器和DS、LES(load ES with pointer)指针送寄存器和ES

这组指令的功能是完成把地址送到指定通用寄存器(REG)中。REG 不能为段寄存器,SRC 必须为存储器寻址方式。

LEA 有效地址送寄存器

指令格式: LEA   REG,SRC 相当于: (REG)←SRC

指令把源操作数(存储器)有效地址送到指定16位通用寄存器中,REG 不能为段寄存器。源操作数可使用除立即数和寄存器外任一种存储器寻址方式

如:

1
2
3
4
LEA     AX,[5678H]     ;(AX)← 5678H

MOV AX,5678H
等价

LDS 指针送寄存器和DS

指令格式:LDS  REG,SRC

执行的操作:(REG)←(SRC)、(DS)←(SRC+2)

把源操作数(双字存储器)的低字送入16位通用寄存器中,高字送入DS中

LES 指针送寄存器和ES

指令格式: LES  REG,SRC

执行的操作:(REG)←(SRC)、(ES)←(SRC+2)

把源操作数(双字存储器)中的低字送入16位通用寄存器中,高字送入ES中

如:已知:(DS)=8000H ,(81480H)=33CCH ,(81482H)=2468H。指令:LDS SI,[1480H]

物理地址=16×(DS)+1480H=81480H。
指令执行结果:(SI)=33CCH,(DS)=2468H

符号扩展指令

符号扩展指令包括:CBW(convert byte to word)字节扩展为字、CWD(convert word to double word)字扩展为双字。

CBW 字节转换为字指令

指令格式:CBW

执行的操作:将AL中的8位带符号数扩展为16位并送入AX中,也就是将AL的最高位送入AH的所有各位,即如果(AL)的最高有效位为0,则(AH)=00H;如果(AL)的最高有效位为1,则(AH)=0FFH。

CWD 字转换为双字指令

指令格式:CWD

执行的操作:AX的内容符号扩展到DX,形成DX:AX中的双字。即如果(AX)的最高有效位为0,则(DX)=0000H;如果(AX)的最高有效位为1,则(DX)=0FFFFH。

例子:已知:(AX)= 0BA45H

指令:CBW      ;(AX)=0045H
指令:CWD      ;(DX)=0FFFFH  (AX)=0BA45H

串操作类指令

串操作类指令包括:MOVS(move string)串传送、CMPS(compare string)串比较等,与串操作基本指令配合使用的前缀有:REP(repeat)重复、REPE/REPZ(repeat while equal / zero)相等/为零重复、REPNE/REPNZ(repeat while not equal / not zero)不相等/不为零重复。

MOVS 串传送指令

指令格式:MOVSB

执行的操作:

  • 当DF=0时,则((DI))←((SI))、(SI)←(SI)+1,(DI)←(DI)+1
  • 当DF=1时,则((DI))←((SI))、(SI)←(SI)-1,(DI)←(DI)-1

指令格式:MOVSW

执行的操作:字操作,

  • 当DF=0时,则((DI))←((SI))、(SI)←(SI)+2,(DI)←(DI)+2
  • 当 DF=1时,则((DI))←((SI))、(SI)←(SI)-2,(DI)←(DI-2)

串传送指令的功能是将位于DS段以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至ES段以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。

当DF=0时,(SI)和(DI)增量;当DF=1时,(SI)和(DI)减量。指令不影响状态标志位。

CMPS 串比较指令

指令格式:CMPSB

执行的操作:字节操作,((SI))-((DI)),(SI)←(SI)±1,(DI)←(DI)±1

指令格式:CMPSW
执行的操作:字操作,((SI))-((DI)),(SI)←(SI)±2,(DI)←(DI)±2

串比较指令的功能是把位于DS段由SI指定的字节数据或字数据与ES段由DI指定的字节数据或字数据进行比较,结果不保存,但影响状态标志位。当DF=0时,(SI)和(DI)增量;当DF=1时,(SI)和(DI)减量。

REP重复

指令格式:REP

执行的操作:

  • 当(CX)=0退出重复;
  • 当(CX)≠0,(CX)←(CX)-1,执行其后串操作指令。

每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。REP前缀用在MOVS指令前,流程图在下面

REPE/REPZ相等/为零重复指令

指令格式:REPE/REPZ

执行的操作:

  • 当(CX)=0或零标志ZF=0退出重复
  • 否则(CX)←(CX)-1执行其后串操作指令

该指令功能是每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,退出重复。该指令一般用在CMPS指令前,流程图如下

REPNE/REPNZ不相等/不为零重复指令

指令格式:REPNE/REPNZ

执行的操作:当(CX)=0或零标志ZF=1退出重复,否则(CX)←(CX)-1执行其后串操作指令。

该指令功能是每执行一次串指令(CX)-1,并判断ZF标志是否为1,只要(CX)=0或ZF=1,则退出重复。该指令一般用在CMPS指令前。

  • 重复前缀指令不能单独使用,其后必须紧跟串操作指令,控制串操作指令重复执行。其执行过程相当于一个循环程序的运行,如下图所示。在每次重复之后,地址指针SI和DI都被修改,但指令指针IP仍保持指向带有前缀的串操作指令的地址。
  • 重复执行次数由数据串长度决定,数据串长度应预置在寄存器CX中。
  • 执行重复前缀指令不影响标志位。

例题1:在数据段中有一个字符串,其长度为20,要求把他们转送到附加段的一个缓冲区中。程序代码如下所示:

(CLD:使DF复位到0)

例题2:把附加段中10个字节的缓冲器置30H,

1
2
3
4
5
6
7
8
9
10
11
12
方法1:
lea di,mess2
mov al,30H
mov cx,10
cld
rep stosb
方法2:
lea di,mess2
mov ax,3030H
mov cx,5
cld
rep stosw

算术运算指令与位操作指令

算术运算指令

算术指令分为加法指令,减法指令,乘法指令,除法指令和十进制调整指令。

加法指令

加法指令包括:ADD(add)加法、ADC(add with carry)带进位加法、INC(increment)加1

ADD加法指令

指令格式:ADD DST,SRC — (DST)←(SRC)+(DST)

将源操作数与目的操作数相加,结果存放于目的操作数。要求源操作数和目的操作数同时为带符号的数或无符号数,且长度相等。

ADC带进位加法指令

指令格式:ADC DST, SRC — (DST)←(SRC)+(DST)+CF

将源操作数与目的操作数以及进位标志位CF的值相加,并将结果存放于目的操作数

INC加1指令

指令格式: INC OPR — (OPR)←(OPR)+1

注意:这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。

减法指令

减法指令包括:SUB(subtract)减法、DEC(decrement)减1、NEG(negate)求补、CMP(compare)比较

SUB 减法指令

指令格式为:SUB DST,SRC — (DST)←(DST) -(SRC)

将目的操作数减去源操作数,结果存放于目的操作数。

DEC 减1指令

指令格式为:DEC OPR — (OPR)←(OPR)-1

对指定操作数减1。DEC指令不影响进位标志。

NEG求补指令

NEG OPR

对指定操作数求补运算。亦即把操作数按位求反后末位加1,因而执行的操作也可表示为:
(OPR)← 0FFFFH -(OPR)+1

CMP比较指令

指令格式为:CMP OPR1,OPR2

将目的操作数减去源操作数,结果不予保存。只是根据结果的状态设置状态标志位。
(一般和后面的转移指令连用)

乘法指令

乘法指令包括:MUL(unsigned multiple)无符号数乘法、IMUL(signed multiple)带符号数乘法

MUL无符号数乘法指令

指令格式为: MUL SRC
执行的操作:

  • 8位数乘法 (AX) <- (AL) ×(SRC)
  • 16位数乘法 (DX,AX) <- (AX)× (SRC)

注意:

  • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX(高16位)、AX(低16位)中 。源操作数不允许使用立即数寻址方式。
  • 乘法指令运算结果只影响状态标志CF、OF,对其他状态标志位无影响

除法指令

除法指令包括:DIV(unsigned divide)无符号数除法、IDIV(signed divide)带符号数除法。

DIV无符号数除法指令

指令格式为: DIV SRC

字节操作数:16位被除数在AX中,8位除数位源操作数,结果的8位商在AL中,8位余数在AH中。表示为:

  • (AL) <- (AX) ÷ (SRC)的商
  • (AH) <- (AX) ÷ (SRC)的余数

操作数:32位被除数在DX,AX中,16位除数位源操作数,结果的16位商在AX中,16位余数在DX中。表示为:

  • (AX) <- (DX,AX) ÷ (SRC)的商
  • (DX) <- (DX,AX) ÷ (SRC)的余数
1
2
3
4
5
设(AX)=0400H,(BL)=0B4H。即(AX)为无符号数的1024D;(BL)为无符号数的180D。
执行如下指令:
MOV AX,0400H ;AX=400H=1024
MOV BL,0B4H ;BL=B4H=180
DIV BL ;商AL=05H=5,余数AH=7CH=124

逻辑运算指令

逻辑运算指令包括:AND(and)逻辑与、OR(or)逻辑或、NOT(not)逻辑非、XOR(exclusive or)异或、TEST(test)测试。逻辑指令对字节或字数据进行按位的操作。

AND逻辑与指令

指令格式:AND DST,SRC — (DST) <- (DST)∧(SRC)

AND指令执行按位逻辑与操作。为双操作数指令,两个操作数宽度必须相等,即同为字节或字,执行结果存入DST中。

OR 逻辑或指令

指令格式:OR DST,SRC — (DST)<-(DST)∨(SRC)

OR指令执行按位逻辑或操作。它们均为双操作数指令,两个操作数宽度必须相等,即同为字节或字,执行结果存入DST中并且是按位进行。

要求屏蔽寄存器AH的高四位,保留其低四位的数据: AND AH,0FH

要求把寄存器AH的高四位置1,保留其低四位的数据: OR AH,F0H

NOT 逻辑非指令

指令格式:NOT OPR

XOR 逻辑异或指令

指令格式:XOR DST,SRC — (DST)<-(DST)⊕(SRC)

TEST 测试指令

指令格式:TEST OPR1,OPR2 — (OPR1)∧(OPR2)

对两个操作数指定的内容进行与操作, 但不保留结果,只是根据结果状态,对标志位进行置位

移位指令

移位指令包括:

  • SHL(shift logical left)逻辑左移,下图a
  • SAL(shift arithmetic left)算术左移,下图a
  • SHR(shift logical right)逻辑右移,下图b
  • SAR(shift arithmetic right)算术右移,下图c
  • ROL(rotate left)循环左移,下图d
  • ROR(rotate right)循环右移,下图e
  • RCL(rotate left through carry)带进位循环左移,下图f
  • RCR(rotate right through carry)带进位循环右移,下图g

指令格式都是:指令 目标操作数,移位位数

逻辑左移一位最低位补零,最高位移入CF,可用于无符号数乘2操作;逻辑右移指令右移一位最高位补零,移出位进入CF,可用于无符号数除2操作。

控制转移指令与处理器控制指令

控制转移指令

控制转移指令分为无条件转移指令,条件转移指令,循环指令,子程序指令和中断指令。

无条件转移指令

无条件地转移到指令指定的地址去执行该地址开始的指令。

转移可以分成两类:段内转移和段间转移。

段内转移是指在同一段的范围内进行转移,此时只需修改IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移目的。

段间转移则是要转到另一个段去执行程序,此时需要修改IP和CS寄存器的值,才能达到转移目的,因此段间转移的目标地址由新的段地址和偏移地址组成。

段内直接短转移

指令格式:JMP SHORT OPR — (IP)←(IP) + 8位位移量(由目标地址OPR确定的)

位移量需要满足向前或向后转移的需要,因此它是一个带符号的数,也就是说这种转移格式只允许在-128~+127字节的范围内转移。

例如:

1
2
3
4
5
6
JMP  SHORT NEXT
……
……
NEXT:MOV AL,‘A’
……
……

假设JMP指令地址为0100H,NEXT的地址为011AH,当前IP 的值为0102H,所以JMP指令的偏移量为18H,目的地址为(IP)011AH。

段内直接近转移

指令格式:JMP NEAR PTR OPR — (IP)←(IP) + 16位位移量

段内直接短转移和段内直接近转移的属性运算符在书写指令时往往不给出,而是直接写成JMP OPR。而到底是8位还是16位需要由汇编程序在汇编过程中,根据标号处的地址与JMP指令所在地址进行计算得到。

段内间接近转移

指令格式:JMP WORD PTR OPR — (IP)←(EA)

其中有些地址EA值由OPR的寻址方式确定。它可以使用除立即数方式以外的任一种寻址方式。

  • JMP BX:若执行指令前,(BX)=0120H,(IP)=0012H,则执行指令后,(IP)=0120H。
  • JMP WORD PTR[BX]:若执行指令前,(BX)=0120H,(IP)=0012H,(DS)=3000H,(30120H)=80H,(30121H)=00H,目标地址为存储器寻址。首先计算偏移地址EA=(BX)=0120H,
    物理地址=DS×16H+EA=30120H。所以执行指令后,(IP)=0080H。

段间直接远转移

指令格式:JMP FAR PTR OPR

执行的操作:

  1. (IP)←OPR的段内偏移地址
  2. (CS)←OPR所在段的段地址

段间间接远转移

指令格式:JMP DWORD PTR OPR
执行的操作:

  1. (IP)←(EA)
  2. (CS)←(EA+2)

其中EA由OPR的寻址方式确定,它可以使用除立即数及寄存器方式以外的任何存储器寻址方式,根据寻址方式求出EA后,把指定存储单元的字内容送IP寄存器,并把下一个字的内容送到CS寄存器,这样就实现了段间跳转。

条件转移指令

  1. JZ(或JE)(jump if zero,or equal)结果为零(或相等)则转移。测试条件:ZF=1
  2. JNZ(或JNE)(jump if not zero,or not equal)结果不为零(或不相等)则转移。测试条件:ZF=0
  3. JS(jump if sign)结果为负则转移。测试条件:SF=1
  4. JNS(jump if not sign)结果为正则转移。测试条件:SF=0
  5. JO(jump if overflow)结果溢出则转移。测试条件:OF=1
  6. JNO(jump if not overflow)结果不溢出则转移。测试条件:OF=0
  7. JP(JPE)(jump if parity,or parity even)奇偶位为1则转移。测试条件:PF=1
  8. JNP(JPO)(jump if not parity,or parity odd)奇偶位为0则转移。测试条件:PF=0
  9. JB(或JNAE,或JC)(jump if below,or not above or equal,or carry)低于,或者不高于或不等于,或进位为1则转移。测试条件:CF=1
  10. JNB(或JAE,或JNC)(jump if not below,or above or equal,or not carry)不低于,或者高于或等于,或进位为零则转移。测试条件:CF=0

最后两条指令在这一组指令中可以看作JC和JNC,它们只用CF的值来判别是否转移。

比较两个数大小的转移指令的现行指令都是CMP。小结:

比较情况

无符号数

带符号数

指令助记符

满足条件

指令助记符

满足条件

A<B

JB/JNAE/JC

CF=1

JL/JNGE

SF⊕OF=1且ZF=0

A<=B

JBE/JNA

CF=1或ZF=1

JLE/JNG

SF⊕OF=1或ZF=1

A>B

JA/JNBE

CF=0且ZF=0

JG/JNLE

SF⊕OF=0且ZF=0

A>=B

JAE/JNB

CF=0或ZF=1

JGE/JNL

SF⊕OF=0或ZF=0

测试CX的值为0则转移

指令格式:JCXZ  OPR,测试条件:(CX)=0

循环指令

循环指令包括:LOOP(loop)循环、LOOPZ/LOOPE(loop while zero,or equal)当为零或相等时循环、LOOPNZ/LOOPNE(loop while nonzero,or not equal)当不为零或不相等时循环。

LOOP循环指令

指令格式:LOOP OPR

执行操作及测试条件:CX←CX-1,若 (CX)≠0转移,(CX)=0退出循环

LOOPZ(或LOOPE)当为零或相等时循环指令

指令格式:LOOPZ(或LOOPE) OPR

执行操作及测试条件:CX←CX-1,若(CX)≠0且ZF=1循环,若ZF=0或(CX)=0退出循环

LOOPNZ(或LOOPNE)当不为零或不相等时循环指令

指令格式:LOOPZ(或LOOPE) OPR

执行操作及测试条件:CX←CX-1, 若(CX)≠0且ZF=0循环,若ZF=1或(CX)=0退出循环

注意:使用循环控制指令之前,必须在寄存器CX(作为计数器)中预置循环次数的初值。

子程序指令

子程序指令包括:CALL(call)调用、RET(return)返回。

段内调用指令和返回指令应用原理简述如下。
主程序为:

1
2
3
4
5
1000H	MOV	SP,0200H

1050H CALL 2100H
1053H
1A00H HLT

子程序为:

1
2
2100H	XOR	AL,AL
21B0H RET

说明:主程序中,1053H为返回地址,2100H为子程序入口地址。主程序执行时,指令“CALL 2100H”将返回地址1053H压入堆栈,同时将2100H送给指针IP,程序转向子程序执行。子程序执行后,RET指令将保存在堆栈中的1053H送入指针IP,保证主程序的连续执行。

中断指令

中断指令包括:INT(interrupt)中断、INTO(interrupt if overflow)如溢出则中断、IRET(return from interrupt)从中断返回。

INT 中断指令

指令格式:INT  TYPE 或 INT

INT TYPE指令为两字节指令,中断类型号TYPE占有一个字节,TYPE它可以是常数或常量表达式,其值必须在0~255范围内,代表256级中断。每个中断类型号都对应一个4字节的中断矢量,中断矢量是指中断服务程序的入口地址。

处理器控制指令

处理器控制指令可以分为标志位处理指令和其他处理器控制指令。

标志位处理指令

标志位处理指令包括:

  • CLC(Clear carry)进位位置0。执行的操作:CF←0
  • CMC(Complement carry)进位位求反。执行的操作:CF← CF
  • STC(Set carry)进位位置1。执行的操作:CF←1
  • CLD(Clear direction)方向标志置0。执行的操作:DF←0
  • STD(Set direction)方向标志置1。执行的操作:DF←1
  • CLI(Clear interrupt)中断标志置0。执行的操作:IF←0
  • STI(Set interrupt) 中断标志置1。

这组指令只影响本指令指定的标志,不影响其他标志位。执行的操作:IF←1

其他处理器控制指令

8086/8088用于CPU最大模式时,需要处理主机和协处理器及多处理器之间的同步关系。其他处理器控制指令包括:NOP(no opreation)空操作、HLT(halt)停机、WAIT(wait)等待、ESC(escape)换码、LOCK(lock)封锁,这些指令可以控制处理机状态。它们都不影响状态标志。

  1. NOP 空操作指令。
    指令格式:NOP。
    此指令为单字节指令,不执行任何操作,只起到占用存储器空间和时间延迟的作用。
  2. HLT停机指令。
    指令格式:HLT。
    此指令可暂停计算机工作,使处理器处于停机状态,用于等待一次外部中断的产生,中断结束后,继续执行下面的程序。
  3. WAIT等待指令。
    指令格式:WAIT。
    此指令使处理器处于等待状态,也可以用来等待外部中断发生,但中断结束后仍返回WAIT指令继续等待。本指令不允许使用立即数和寄存器寻址方式。
  4. ESC换码指令。
    指令格式:ESC  mem。
    此指令执行时,协处理器监视系统总线,并能将mem指定内存单元的内容(指令或操作数)送到数据总线上。
  5. LOCK封锁指令。
    指令格式:LOCK。
    用于维持总线的锁存信号,直到后续指令执行完毕。

指令系统小结表

指令类

指令名称

指令助记符

数据传送

数据传送

MOV、LEA、LDS、LES、LAHF、SAHF

堆栈操作

PUSH、POP、PUSHF、POPF

数据交换

XCHG、XLAT

输入输出

IN、OUT

算术运算

加法

ADD、ADC、INC

减法;比较

SUB、SBB、DEC、NEG;CMP

乘法

MUL、IMUL

除法

DIV、IDIV

扩展

CBW、CWD

十进制调整

AAA、AAS、DAA、DAS、AAM、AAD

位操作

逻辑运算

AND、OR、NOT、XOR、TEST

移位运算

SAL、SAR、SHL、SHR

循环移位

ROL、ROR、RCL、RCR

串操作

串传送

MOVS、MOVSB、MOVSW

串存取

STOS、STOSB、STOSW、LODS、LODSB、LODSW

串比较

CMPS、CMPSB、CMPSW

串搜索

SCAS、SCASB、SCASW

串输入输出

INS、INSB、INSW、OUTS、OUTSB、OUTSW

程序控制

调用

CALL、RET

中断

INT、INTO、IRET

重复操作

LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ、JCXZ

跳转

JA/JNBE、JAE/JNB、JB/JNAE、JBE/JNA、JG/JNLE、JE/JZ、JNE/JNZ、JGE/JNL、JL/JNGE、JNC、JC、JNS、JS、JP/JPE、JNP/JPO、JNO、JO

处理器控制

清除标志

CLC、STC、CMC、CLD、STD、CLI、STI

时序控制

NOP、WAIT、HLT、ESC

前缀操作

重复前缀

REP、REPZ/REPE、REPNZ/REPNE

段前缀

ES:、DS:、CS:、SS:

总线封锁前缀

LOCK