8086/8088指令系统的详细介绍
指令系统
1.计算机指令格式
2. 指令格式及寻址方式
3.8086/8088指令系统
1.指令的寻址方式;
2.指令系统.
主要内容
重点难点
1.掌握指令的寻址方式;
2.了解指令的机器语言格式;
3.掌握8086/8088的指令系统;
学习目标
难点
1.十进制调整指令;
2.串操作指令;
5.1 8086/8088指令码格式与寻址方式
5.2 8086指令系统
5.3 数据传送类指令
5.4 数据操作类指令
5.5 串处理指令
5.6 控制类指令
主要知识点
(一)指令(Instruction)
指令是计算机执行某种操作命令:内容包括做什么操作,操作数的来源,结果的存放,以及下一条指令的位置等等.
1,传送类;
2,加工处理类:算术运算,逻辑运算,移位循环;
3,控制类:转移,调用,中断等;
4,串操作类;
(二)指令系统:所有指令的集合
8086CPU包含133条指令.
(三 )程序:一些指令的有机结合,用于完成某种目的.
5.1 8086指令格式
一,指令与指令系统
5.1 8086指令格式
W: 操作数字节长度.
W=0,字节操作;
W=1,字操作;
5.1 8086指令格式
字节1:操作功能
OPCODE:指令操作码;操作数中至少有一个为寄存器:
D: 操作数传送方向.
D=0,REG为源;
D=1,REG为目的;
REG:寄存器编码字段
000=AL/AX 100=AH/SP
001=CL/CX 101=CH/BP
010=DL/DX 110=DH/SI
011=BL/BX 111=BH/DI
5.1 8086指令格式
字节2:
寻址方式
MOD:寻址字段
00=存储器方式,指令中无偏移量
01=存储器方式,指令中8位偏移量 10=存储器方式,指令中16位偏移量 11=寄存器方式,指令中无偏移量
在MOD≠11,存储器模式下,R/M给出计算有效地址的方法.
5.1 8086指令格式
.R/M:寄存器/存储器字段
在MOD=11,寄存器模式下,R/M给出第二个操作数寄存器编码.
5.1 8086指令格式
5.1 8086指令格式
MOV [BX+DI-6H], CL;
10001000 01 001 001
11111010
指令码为:88 49 FA
DISP:存储器操作数地址偏移量,长度由MOD字段定义.
DATA:指令中的立即数.
MOV AX,[BX]
D=1,W=1;MOD=00,
R/M=111,REG=000
指令码为:8B 07
地址(CS段) 机器代码 指令
00A8H FA CLI
00A9H 2E 8E 16 A4 00 MOV SS,CS:[00A4H]
00AEH BC 50 00 MOV SP,0050H
00B1H BB EC MOV BP,SP
00B3H 2E 8E 1E A6 00 MOV DS,CS:[00A6H]
00B8H FB STI
00B9H C7 06 40 00 22 11 MOV [0040H],1122H
5.1 8086指令格式
5.1 8086指令格式
按指令格式,一条指令可占一到六个字节,从形式上可分单操作数,双操作数,无操作数指令.
指令中16位的立即数或偏移量,变为机器代码后低字节在前,高字节在后.
双操作数指令不能同为存储器操作数
助记符形式的汇编语言经汇编(DEBUG,MASM,ASM)变成机器代码才能被CPU识别和执行.
指令不同,寻址方式不同,指令执行时间不同,与时间和计算机主频(时钟周期)还有关.
(一)立即寻址
即:操作数直接存放在指令中.用于表示常数,给变量赋初值.
例:mov AL,5; (AL)←5
5.1 8086指令格式
二,操作数寻址方式
10000H
10100H
10101H
10102H
OP
34H
12H
100H
...
..
...
34H
AH
AL
12H
AX
代码段
代码段起址
操作数包含在指令中,紧跟在操作码后
放在代码段 .
MOV AX ,1234H
(若CS = 1000H ,IP = 100H)
定义:如何寻找操作数或其地址
即:指令指定寄存器内容为操作数.
5.1 8086指令格式
二,操作数寻址方式
MOV AX ,BX
若 AX = 1234H,BX = 4567H
4567H
4567H
AX
BX
操作数包含在CPU的内部寄存器中.
(二)寄存器寻址
例:mov BX,AX;
(BX)←(AX)
例:mov SI,var;
var 定义为变量.
5.1 8086指令格式
二,操作数寻址方式
(三)直接寻址
即:指令中直接给出操作数的有效地址.
例:mov SI,[2000H];
(SI) ←(2000H)
注意: 指令中一般不出现直接地址,直接地址用变量表示.
例:MOV AX, [4000H ]
(若DS = 3000H)
数据段起址
30000H
34000H
34001H
OP
00H
20H
代码段
..
...
数据段
54H
7AH
7AH
54H
4000H
实际地址 34000H
+
DS 30000
偏移量 4000
(三)直接寻址
(四)寄存器间接寻址
即:指令中寄存器值是操作数的地址.
能够间接寻址的寄存器有:SI,DI,BX,BP
5.1 8086指令格式
二,操作数寻址方式
MOV AX ,[BX]
(若DS = 2000H,BX = 1000H)
段基址 2000
EA(BX) + 1000
操作数地址 21000
2000H
...
M
....
....
21000H
操作数
例:mov AL,[BX];
(AL) ←((BX))
5.1 8086指令格式
二,操作数寻址方式
(五)寄存器相对寻址
(1)变址寻址
即:操作数的有效地址是一个变址寄存器的内容加上偏移量.变址寄存器为SI和DI.
例:mov AX,ARRAY[SI] ;
(AX) ←(ARRAY+(SI))
(五)寄存器相对寻址
(2)基址寻址
即:指令中指出基址寄存器(BX或BP)加上偏移量得到操作数有效地址..
例:mov AX,[BX+6];
(AX)←((BX)+6)
例:mov AX,6[BP][SI];
(AX)←((BP)+(SI)+6)
(五)寄存器相对寻址
(3)基址加变址寻址
即:操作数的有效地址是基址寄存器,变址寄存器和偏移量三者相加产生.
二,操作数寻址方式
I/O端口寻址(当I/O端口按独立的I/O空间编址时)
1,直接端口寻址:
即:指令直接提供8位端口地址.
例:IN AL,63H;
(AL)←(63H)
{从I/O地址号为63H的端口中读取数据送到AL中}
例: IN AL,DX
(AL) ←((DX))
OUT DX,AL;
{将AL中的内容输出到地址由DX寄存器内容所指定的端口中}
2,间接端口寻址方式:
即:由DX寄存器给出16位端口地址.
5.1 8086指令格式
三,程序转移地址的寻址方式
位移量
IP
EA
有效转移地址
指令
1,段内直接(相对)寻址方式
转移地址由当前的IP内容和指令规定的8位(短程转移)或16位(近程转移)位移量之和.
5.1 8086指令格式
三,程序转移地址的寻址方式
2,段内间接寻址方式
转移地址存放在寄存器或存储单元中.
寻址方式
根据寻址方式计算EA
有效转移地址
指令
有效转移地址
或
寄存器
存储器
5.1 8086指令格式
三,程序转移地址的寻址方式
3,段间直接寻址方式
指令码中直接给出16位的段地址和16位的偏移地址.
偏移量
段地址
IP
指令
段地址
CS
5.1 8086指令格式
三,程序转移地址的寻址方式
4,段间间接寻址方式
由指令码的寻址方式求出存放转移地址的连续两个字的地址.
寻址方式
根据寻址方式计算EA
转移地址偏移量
指令
段地址
内存中两个连续的字
存储器
8086指令系统操作数符号表示
DST:目的操作数
SRC:源操作数
TARGET:循环,转移和调用指令操作数
reg:寄存器操作数,字节或字
reg8:寄存器操作数,字节
reg16:寄存器操作数,字
mem:存储器操作数,字节或字
mem8:字节型存储器操作数
mem16:字型存储器操作数
mem32:双字型存储器操作数
acc:累加器AL或AX
5.2 8086指令系统
seg_reg:段寄存器
imm:立即操作数,字节或字
imm8:8位立即操作数
imm16:16位立即操作数
short_label:短标号(8位偏移量)
near_label:近标号(16位地址或偏移)
far_label:远标号(32位地址)
5.2 8086指令系统
操作数符号表示
1,MOV DST,SRC;
(DST)←(SRC), 不影响标志位.
5.3 数据传送类指令
(一)通用数据传送指令
在存储器中的操作数的寻址方式
[n] 直接地址 MOV AX,[1234H]
BUFFER 直接地址 MOV AX,BUFFER
[BX+n] 间接寻址(基址寻址)
[DI+n] 间接寻址(变址寻址)
[SI+n] 间接寻址(变址寻址)
[BP+n] 间接寻址(基址寻址)
[BX+DI+n],[BX+SI+n]
[BP+DI+n],[BP+SI+n]
对应段寄存器DS
对应段寄存器SS
对应段寄存器DS
对应段寄存器SS
(一)通用传送指令(MOV)
源操作数和目的操作数
存储器
通用寄存器
段寄存器( CS除外)
立即数
MOV的 "4不能"
(1)IP和CS不能出现
(2)存储器之间不能传送
(3)段寄存器之间不能传送
(4)立即数和段寄存器不能传送
MOV [SI],[2000H]
MOV CS,BX
MOV DS,2000H
2,堆栈及堆栈操作
堆栈
堆栈是一种按先进后出(FILO)原则存取的存储器,它由堆栈指针寄存器SS:SP和RAM中的一部分组成,主要用于保护现场和恢复现场.
SP的内容总是指向栈顶,即最后推入信息所在单元.
(一)通用传送指令(PUSH/POP)
进栈指令
PUSH SRC
;(SP) ←(SP)-2, ((SP)+1,(SP)) ←(SRC)
具体指令:
PUSH reg16
PUSH seg_reg
PUSH mem16
出栈指令
POP DST
;(DST) ←((SP)+1, (SP)), (SP)←(SP)+2)
具体指令:
POP reg16
POP seg_reg
POP mem16
建栈 MOV AX ,1050H
MOV SS ,AX
MOV SP ,000 EH
进栈 PUSH AX (设 AX=1234H)
PUSH BX (设 BX=5CF8H)
1050FH
10500H
初始栈顶
(栈底)
SP=0EH
SS= 1050H
堆栈起地址
栈的范围
SP= 0EH
12H
34H
SP= 0CH
5CH
F8H
SP= 0AH
10500H
(不变)
1050FH
SS = 1050H
- 2
- 2
当前栈顶
进栈后的SP和SS的值
SP=000AH SS=1050H
进栈前SP和SS的值
SP=000EH SS=1050H
(变化)
(AX)
(BX)
8086通过赋值SS和SP建栈
进栈操作:先SP减 2,再内容进栈.
高
低
出栈操作:先栈顶内容出栈,再修改SP,使SP加2.(字操作)
出栈: POP CX
POP DS
SP= 0EH
12H
34H
SP= 0CH
5CH
F8H
SP= 0AH
10500H
(不变)
1050FH
SS = 1050H
- 2
- 2
当前栈顶
出栈前的SP和SS的值
SP=000AH SS=1050H
(变化)
SP= 0EH
CX=5CF8H
DS=1234H
SS=1050H
出栈后SP和SS的值
SP=000EH SS=1050H
SP=0AH
SP=0CH
+2
+2
F8H
5CH
34H
12H
1050FH
高
低
例2,用堆栈交换数据
PUSH AX
PUSH BX
POP AX
POP BX
堆栈的应用
主要用于子程序调用或中断子程序的现场保护和恢复,以及参数传递等.
例1,保护现场
fun: PUSH DS
PUSH ES
PUSH AX
PUSH BX
;处理部分
POP BX
POP AX
POP ES
POP DS
RET
3,交换指令
XCHG DST,SRC
;(DST)(SRC)
具体指令:
XCHG reg , mem/ reg
XCHG reg, acc
例:
XCHG AX,BX
;(AX)(BX)
XCHG AL,BL
;(AL)(BL)
(一)通用传送指令(XCHG)
(二)累加器专用传送指令
1,输入指令
IN AL,PORT;(AL) ←(PORT)
IN AX,PORT;(AX) ←(PORT)
IN AL,DX;(AL) ←((DX))
IN AX,DX;(AX) ←((DX))
PORT为8位直接地址,(DX)为16位端口地址
2,输出指令
OUT PORT,AL;(PORT) ←(AL)
OUT PORT,AX;(PORT) ←(AX)
OUT DX,AL;((DX)) ←(AL)
OUT DX,AX;((DX)) ←(AX)
3,字节转换指令
XLAT; (AL)←((BX)+(AL))
例:MOV BX,offset TABLE
XLAT
若(AL)=3,则首先应将表格首地址送BX,执行XLAT后
(AL)=9
TABLE: DB 0
DB 1
DB 4
DB 9
DB 16
DB 25
(三)地址传送指令
LEA (load effective address)
LDS (load DS with pointer)
LES (load ES with pointer)
1,有效地址传送指令
LEA reg16,SRC
;(reg16) ←SRC
例:
MSG db 'Hello$'
LEA DX,MSG;
相当于: MOV DX,OFFSET MSG
指令执行后 (DX)=2000H
如果指令:
MOV DX,MSG
则:(DH)='e' (DL)='H'
2,LDS reg16,mem32
作用:地址指针装入DS
;(reg16) ←(mem32)
;(DS) ←(mem32+2)
把源操作数指定的4个字
节传送到指定的寄存器及
DS寄存器中.
例:
VECT DW 01F0H
DW 2018H
LDS BX,VECT;
执行后:
(DS)=2018H
(BX)=01F0H
3,LES reg16,mem32
LES reg16,mem32
;(reg16) ←(mem32)
;(ES) ←(mem32+2)
作用:把源操作数指定的4个字节传送到指定的寄存器及ES寄存器中.
(四)标志寄存器传送
1,LAHF; (AH) ←(flag低字节)
2,SAHF; (flag低字节) ←(AH)
3,PUSHF; (SP) ←(SP)-2, ((SP)),(SP) -1) ←flag
4,POPF; flag ←((SP)+1),(SP)), (SP) ←(SP)+2
指令操作数以隐含方式规定.SAHF可以修改flag标志位SF,IF,AF,PF,CF.PUSHF和POPF一般用于子程序和中断处理程序的首尾,用于保存主程序标志和恢复主程序标志;也可用于改变flag的其他标志位:如将标志寄存器的 TF 置 1
PUSHF
POP AX
OR AX ,0100H
PUSH AX
POPF
1,加法指令
(1)ADD DST,SRC ;作用:不带进位位的加法指令
;(DST) ← (SRC) + (DST)
例如:ADD AL,50H ; AL和50H相加,结果放在AL中
注:对六个标志位OF,SF,ZF,AF,PF,CF都有影响
(2)ADC DST,SRC ;作用:带进位加法
; (DST) ← (SRC) + (DST)+CF
注:对六个标志位都有影响
5.4 数据操作类指令
(一)算术运算类指令
例1
例2
(3)INC DST 加1
;(DST) ←(DST)+1,不影响进位标志
作用:INC只有1个操作数,指令在执行时,将操作数的内容加1,再送回该操作数.
例如:INC AL; 将AL中的内容加1
INC CX; 将CX中的内容加1
INC BYTE PTR[BX+DI+500]
;将BX+DI+500所指的存储单元的内容加1
NF
OF
DF
IF
TF
SF
ZF
AF
PF
CF
D15
D14
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
例:设AL=3AH,则执行 ADD AL , 7CH 后,
AL= 各标志位如何
解:
AL=3AH 00111010
7CH 01111100
AL=B6H 10110110
PF=0,ZF=0,AF=1,OF=1,SF=1,CF=0
ADD 实例
两个无符号双字相加
双字数据1=12345678H在DX:AX中,即(DX)=1234H,(AX)=5678H
双字数据2=6789ABCDH在BX:CX中,即(BX)=6789H,(CX)=0ABCDH
ADC 实例
答案
(1)先用ADD AX,CX进行低位相加
(2)再用ADC DX,BX进行高位相加
(3)若CF=1则应再加一个字节存进位
2,减法指令
(1)SUB DST,SRC ;不带借位的减法指令
;(DST) ←(DST)-(SRC)
例如:SUB AL,20 ; AL中的数减去20,结果放在AL中
注:对六个标志位都有影响
(2)SBB DST,SRC;作用:带借位的减法指令
; (DST) ←(DST)-(SRC)-CF
注:对六个标志位都有影响
(一)算术运算类指令
2,减法指令
(3)DEC DST ;减量指令
;(DST) ←(DST)-1
例:DEC AX; 将AX的内容减1,再送回AX中
注:对六个标志位都有影响
(4)NEG DST ;作用:取补指令
;(DST)=0-(DST)
例:NEG AL ; 将AL中的数取补码,送回AL
注:对六个标志位都有影响
(一)算术运算类指令
2,减法指令
(5)CMP DST,SRC ;比较指令
;(DST)-(SRC),仅影响标志
例:CMP AX,2000H
;将AX的内容和2000H相比较,结果影响标志位
CMP AX,[BX+DI+100]
;将累加器和两个存储单元的数相比,单元地址由BX+DI+100和BX+DI+101指出
注:对六个标志位都有影响
(一)算术运算类指令
3,乘法指令
(1)MUL SRC;无符号数乘法
;(AX) ←(AL)*(SRC)
(DX,AX) ←(AX)*(SRC)
注:(1)另一个操作数是隐含的(2)只对CF和OF两个标志位有影响,若乘积高半部分不为0,CF=OF=1,否则为0.
(2)IMUL SRC;作用:有符号数乘法
;(AX) ←(AL)*(SRC)
(DX,AX) ←(AX)*(SRC)
注:若乘积高半部分为低半部分的符号扩展,CF=OF=1,否则为0.不影响其他位.
(一)算术运算类指令
例3
例4
例:求 0A7H*85H=
MOV AL,0A7H
MOV BL,85H
MUL BL
结果:AX=56C3H
由于AH不为零,所以CF=1,OF=1
MUL 实例
例:设AX=04E8H,BX=0088H,DS=2000H,存储单元20088H中的字内容为4E20H,问执行指令:
IMUL WORD PTR [BX]
后,DX= ,AX= ,CF= ,OF=
结果:DX=017FH , AX=4D00H
由于DX不为零,所以CF=1,OF=1
IMUL 实例
4,除法指令
(1)DIV SRC;无符号数除法指令
;(AL) ←(AX)/(SRC), (AH) ←(AX)%(SRC)
或 (AX)←(DX,AX)/(SRC),
(DX) ←(DX,AX)%(SRC)
注:不影响标志位.如果商超过范围则引起0型中断.
(2)IDIV SRC;作用:有符号数除法指令
;操作与DIV相同
注:不影响标志位.
(一)算术运算类指令
4,除法指令
(3)CWB;字节转换成字指令(有符号数)
;若(AL) <80H则(AH)←0,否则(AH) ←FFH.不影响标志位
(4)CWD;有符号字转换成双字指令
;若(AX)9 OR AF=1,THEN AL= AL+6,AF=1;
若AL>9FH OR CF=1,THEN AL=AL+60H,CF=1
(2)DAS ;对减法运算结果(AL)进行BCD码调整.
若(AL and 0FH)>9 OR AF=1,THEN AL= AL-6,AF=1;
若AL>9FH OR CF=1,THEN AL=AL-60H,CF=1
注:无操作数指令,隐含的源操作数是AL(AX),目的是AL(AX),一般二进制运算指令如ADD,SUB,MUL后根据需要紧接着执行BCD码调整指令.
(一)算术运算类指令
5, BCD码调整指令
非压缩BCD码调整指令:
(1)AAA;对加法非压缩BCD码进行调整,进位送(AH)中.
若(AL and 0FH)>9 OR AF=1,THEN AL =AL+6;
AL=(AL and 0FH),AH=AH+1,CF=AF=1
(2)AAS;对减法运算非压缩BCD码进行调整.
若(AL and 0FH)>9 OR AF=1,THEN AL =AL-6,AL=(AL and 0FH),AH= AH-1,CF=AF=1
(3)AAM;对乘法运算非压缩BCD码进行调整.
AH=(AL/0AH); AL=AL%0AH
如乘法之后AL=72=48H, 经AAM调整,AL/0A=48H/0AH,AH=7(商),AL=2(余)
(3)AAD ;对除法运算非压缩BCD码进行调整.
应该放在DIV指令之前, AL=AH*0AH+AL,AH=0
(一)算术运算类指令
例5
例6
BCD乘法调整指令(AAM)举例:
例:设AL=05H,BL=07H,则
MUL BL
AAM
;05H*07H=23H- AL
;23H/0AH=03H- AH
;23H%0AH=05H- AL
结果:AX=0305H
BCD码除法调整指令(AAD)
例:设被除数75以未组合式BCD码存入AX中,则AH=07H,AL=05H,除数BL=06H,则75除以6的十进制除法程序如下:
;对AX进行调整(AH*10+AL)=3BH- AL
;商=0CH- AL,余数=05H- AH
;AH=05H- BH
;(AL=0CH)/0AH=01H- AH
; (AL=0CH)%0AH=02H- AL
结果:AX=0102H , BH=05H
AAD
DIV BL
MOV BH,AH
AAM
1,逻辑运算指令
可以利用源操作数的各位代码,使目的操作数的某些位置1,清0或测试目的操作数的某些位.
(1)AND DST,SRC;逻辑与运算
;(DST) ←(DST)&(SRC)
注意:SRC,DST均不能为段寄存器,OF=CF=0,正常影响SF,ZF,PF
(2)OR DST,SRC;逻辑或运算
;(DST) ←(DST)|(SRC)
注:OF=CF=0,正常影响SF,ZF,PF
(二)逻辑运算和移位指令
1,逻辑运算指令
(3)NOT DST;逻辑与运算
;(DST) ← (DST)
注意:对标志位无影响
(4)XOR DST,SRC;逻辑或运算
;(DST) ←(DST)^(SRC)
注:OF=CF=0,正常影响SF,ZF,PF
(5)TEST DST,SRC;检测指定位是1还是0
;(DST)&(SRC)
注意:结果不返回目的操作数,仅影响标志;OF=CF=0,正常影响SF,ZF,PF
(二)逻辑运算和移位指令
2,移位指令
(1)SHL DST,count;逻辑左移指令
count可以为1;也可以为CL做移位计数.
注意:正常影响PF,SF,ZF,CF
当count=1时若符号位有变化则OF=1,否则为0.
(2)SAL DST,count;算术左移指令
(二)逻辑运算和移位指令
3,逻辑右移指令
SHR DST,count;
4,算术右移指令
SAR DST,count;
;循环移位只影响CF,OF
5,循环左移指令
ROL DST,count;
(二)逻辑运算和移位指令
6,循环右移指令
ROR DST,count;
7,带进位循环左移指令
RCL DST,count;
8,带进位循环右移指令
RCR DST,count;
串处理指令:对一系列含有字母,数字的字符串进行操作处理,最多可处理64K字节的字符串.
使用字串指令时应注意:
1,字符串指令可以有一个源操作数字符串或一个目的操作数字符串,或二者均有.
2,将字串长度送 CX(计数值)
3,设置方向标志DF的值:若SI,DI是起址,
使DF=0(CLD),地址加 1或加 2修改,若SI,DI是末地址,
使DF=1(STD), 地址减 1或减 2修改.
4,加重复前缀时,指令执行的顺序是:
(1)先判断 CX=0 CX=0 退出,CX≠0,CX-1→ CX
(2)执行字串指令
(3)修改SI,DI 的内容
(4)回到(1)
5.5 串处理指令
1,串传送指令
MOVS DST,SRC
;DST与SRC做类型检查
具体指令:
MOVSB ; ((ES:DI)) ←((DS:SI)),
(SI) ←(SI)±1, (DI)←(DI)±1
MOVSW ; ((ES:DI)) ←((DS:SI)),
(SI) ←(SI)±2, (DI) ←(DI)±2
其中,加,减地址指针SI和DI由FLAG中的DF决定,DF=0地址增加,DF=1地址减少.
(一)数据串传送指令
5.5 串处理指令
2,建立方向标志指令
CLD ;DF←0
STD ;DF←1
3,重复串操作直到(CX)=0
在串操作指令前,可加重复操作REP前缀,使串连续操作直到(CX)=0.
例:
REP MOVSB;以CX寄存器做计数器,每传送一个数(CX)减1,直到(CX)为0.
(一)数据串传送指令
实例
将2000H单元开始的连续200H个字节传送到4000H单元开始的连续单元.
4,存入串指令
STOS DST;DST做类型检查
具体指令:
STOSB ;((ES:DI)) ←(AL), (DI) ←(DI)±1
STOSW ;((ES:DI)) ←(AX), (DI) ←(DI)±2
注:由DF决定方向,可加入前缀REP.默认AL/AX为SRC
5,从串中取指令
LODS SRC;SRC做类型检查
具体指令:
LODSB ; (AL) ←((DS:SI)) ,(SI) ←(SI)±1
LODSW ; (AX) ←((DS:SI)) ,(SI) ←(SI)±2
注:地址增减由DF决定.默认AL/AX为DST
(一)数据串传送指令
1,串比较指令
CMPS SRC,DST ; SRC和DST仅做类型检查
具体指令:
CMPSB ;((DS:SI))-((ES:DI)), (SI) ←(SI)±1, (DI) ←(DI)±1
CMPSW ;((DS:SI))-((ES:DI)), (SI) ←(SI)±2, (DI) ←(DI)±2
注意:(1)串比较仅影响标志.(2)地址增减由DF决定.
(二)字符串扫描和比较指令
2,条件重复前缀
(1)相等或为0时重复
REPZ
REPE
执行操作:若(CX)=0或ZF=0(比较不相等)时退出,否则继续执行.
(2)不相等或不为0时重复
REPNZ
REPNE
执行操作:若(CX)≠0且ZF=0(比较不相等)时继续执行,否则退出.
(二)字符串扫描和比较指令
(二)字符串扫描和比较指令
3,串扫描指令
SCAS DST ;DST做类型检查
具体指令:
SCASB ;(AL)-((ES:DI)),(DI)←(DI)±1,影响标志
SCASW ;(AX)-((ES:DI)),(DI)←(DI)±2,影响标志
地址增减由DF决定.
可加条件前缀.
默认AL/AX为扫描值寄存器
例:REPNZ SCASB
串操作指令实例
比较内存中两个字符串是否相同的指令序列如下:
MOV SI,1500H
MOV DI,0200H
CLD
MOV CX,6
REPE CMPSB
如果DS=2000H,ES=3000H,两字符串如右图(a)和(b)所示,则执行程序段后,
SI= H
DI= H
CX= H
SI= H
ZF= ;
图(a)
6
N
5
O
4
S
3
R
2
E
1
P
0
…
…
6
N
5
O
4
S
3
R
2
E
1
P
0
21500H
30200H
图(b)
6
N
5
O
4
X
3
R
2
E
1
P
0
…
…
6
N
5
O
4
S
3
R
2
E
1
P
0
答案
SI= 1506 H
DI=1506H
CX= 0 H
ZF= 1
SI= 1504 H
DI=1504H
CX= 2 H
ZF= 0
5.6 控制类指令
(一)控制转移指令
1,无条件转移指令
JMP TARGET;转移到目的地址
具体指令:
JMP short_label; (IP)=(IP)+disp8
JMP near_label; (IP)=(IP)+disp16
JMP far_label;(IP),(CS)由指令码给出
JMP memptr16;段内间接转移
JMP regptr16;
JMP memptr32; 段间间接转移
不影响标志位
(一)控制转移指令
2,条件转移指令
均为位移量为8位的段内相对寻址方式(-128~+127)
(1)根据单个标志置位情况转移
JZ short_label ;结果为0转移
JE short_label ;结果相等转移
测试条件:ZF=1
JNZ short_label;结果不为0则转移
JNE short_label;结果不相等则转移
测试条件:ZF=0
2,条件转移指令
(1)根据单个标志置位情况转移
JS short_label;结果为负则转移
测试条件:SF=1
JNS short_label;结果非负则转移
测试条件:SF=0
JNO short_label;结果不溢出则转移
测试条件:OF=0
JO short_label;结果溢出则转移
测试条件:OF=1
JP short_label;奇偶为1则转移
JPE short_label;偶转移
测试标志:PF=1
2,条件转移指令
(1)根据单个标志置位情况转移
JNP short_label;奇偶为0则转移
JPO short_label;奇转移
测试标志:PF=0
JB short_label;有借位转移
JNAE short_label;不大于等于转移
JC short_label;有进位转移
测试条件:CF=1
JNB short_label;无借位转移
JAE short_label;大于等于转移
JNC short_label;无进位转移
测试条件:CF=0
2,条件转移指令
(2)两个无符号数比较转移
根据两数相减或比较后的结果来判断
JB/JNAE/JC ;CF=1
JNB/JAE/JC ;CF=0
JBE short_label;小于等于转移
JNA short_label;不大于转移
测试条件:CF|ZF=1
JNBE short_label;小于等于转移
JA short_label;大于转移
测试条件:CF|ZF=0
2,条件转移指令
(3)两个有符号数比较转移
JL short_label;小于转移
JNGE short_label;不大于等于转移
测试条件:SF^OF=1
JNL short_label;不小于转移
JGE short_label; 大于等于转移
测试条件:SF^OF=0
JNLE short_label;不小于等于转移
JG short_label; 大于转移
测试条件:(SF^OF)|ZF=0
JLE short_label; 小于等于转移
JNG short_label;不大于转移
测试条件:(SF^OF)|ZF=1
3,循环指令
(1)LOOP short_label
;(CX) ←(CX)-1,(CX)≠0则转移
(2)LOOPZ short_label
LOOPE short_label
;(CX) ←(CX)-1,(CX)≠0且ZF=1(为0)则转移
(3)LOOPNZ short_label
LOOPNE short_label
;(CX) ←(CX)-1,(CX)≠0且ZF=0(非0)则转移
(4)测试CX值,为0则转移
JCXZ short_label
;(CX)=0则转移
测试条件:(CX)=0
实例
1,从3500H内存单元开始建立0~15共16个数.
2,将内存3500H单元开始的0~15共16个数转移到3600H单元开始的数据区.
3,将ACSII码表示的十进制数转换为二进制数.被转换的ASCII码十进制存放在3500H~3504H单元中,转换的结果存于 3510H~3511H单元.
4,子程序调用与返回
(1)子程序调用指令
CALL TARGET
具体指令
CALL near_proc;段内调用
CALL far_proc;段间调用
CALL memptr16;
CALL regptr16;
CALL memptr32;
(2)返回指令
RET ;返回指令
RET EXP;带立即数返回,根据表达式的值修改堆栈指针
5,中断调用与返回
(一)控制转移指令
1,中断调用
INT imm8;执行中断号为imm8的中断,FLAG进栈,断点保护,清IF和TF.
INTO ;若溢出,则执行中断指令INT 4.
2,中断返回指令
IRET ;从中断程序返回主程序,恢复断点和FLAG
例:INT 21H (二字节指令)
若该指令的地址是049E:1002H,
则下一条指令的地址是049E:1004H
CS
SP = 01FEH
SP= 01FCH
SS:0
...
....
....
INT 21H 执行前堆栈情况
SP = 01FCH
SP = 01FAH
SP = 01F8H
....
(FLAG)
049EH
SP = 01F6H
1004H
执行情况INT 21H后
SS:0
...
标志寄存器进栈
断点进栈
TF = 0,IF = 0
0:0002H
0:0000H
IP
CS
中断类型 0
0:03FFH
0:03FCH
IP
CS
中断类型255
..
...
0:0084H
0:0086H
中断类型 21H
21H*4 = 84H,85H
86H,87H
IP
CS
FFF0H
FE6EH
中断向量表
主程序
...
...
1002H
1003H
1004H
INT 21H的机器代码
FFF0:FE6EH
...
IRET
断点
(断点)
子程序
1,标志处理指令
(二)处理器控制指令
(1)CLC ;CF←0
(2)CMC ;CF←CF
(3)STC ;CF←1
(4)CLD ;DF←0
(5)STD ;DF←1
(6)CLI ;IF←0
(7)STI ;IF←1
2,处理器控制指令
(二)处理器控制指令
(1)NOP ;空操作
(2)HLT ;停机指令
(3)WAIT ;等待指令
(4)ESC ;交权指令,取出源操作数给协处理器处理.
(5)LOCK ;总线封锁指令
5.1 分别指出下列指令中的源操作数和目的操作数的寻址方式:
(1) MOV SI,200
(2) MOV CX,DATA[SI]
(3) ADD AX,[BX][DI]
(4) AND AX,BX
(5) MOV [SI],AX
(6) PUSHF
5.2 试述指令MOV AX,2010H和MOV AX,DS:[2010H]的区别.
作业
5.3 写出以下指令中内存操作数的所在地址.
(1) MOV AL,[BX+5]
(2) MOV [BP+5],AX
(3) INC BYTE PTR[SI+3]
(4) MOV DL,ES:[BX+DI]
(5) MOV BX,[BX+SI+2]
5.4判断下列指令书写是否正确:
(1) MOV AL,BX(6) MOV BL,F5H
(2) MOV AL,CL(7) MOV DX,2000H
(3) INC [BX](8) POP CS
(4) MOV 5,AL(9) PUSH CS
(5) MOV [BX],[SI]
5.5 设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,试问:
(1) 执行指令PUSH AX后SP=
(2) 再执行PUSH BX及POP AX后SP= AX= BX=
5.6 要想完成把[2000H]送[1000H]中,用指令:
MOV [1000H],[2000H]是否正确 如果不正确,应用什么方法
5.7 假如想从100中减去AL中的内容,用SUB 100,AL是否正确 如果不正确,应用什么方法
5.8 用两种方法写出从88H端口读入信息的指令.再用两种方法写出从42H口输出100H的指令.
5.9 假如AL=20H,BL=10H,当执行CMP AL,BL 后,问:
(1) 若AL,BL中内容是两个无符号数,比较结果如何 影响哪几个标志位
(2) 若AL,BL中内容是两个有符号数,结果又如何 影响哪几个标志位
本文地址:http://www.45fan.com/dnjc/69234.html