8086/8088指令系统

来源:互联网 发布:java web 日志采集 编辑:程序博客网 时间:2024/06/15 19:41

指令系统
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中内容是两个有符号数,结果又如何 影响哪几个标志位
 

原创粉丝点击