第三章 8088/8086指令系统
3-1 概 述基本知识点
指令:告诉计算机如何处理数据的命令。
一条指令包括如下内容:
1)操作码:指令所执行的操作。
2)操作数:指令操作的对象,包括操作数的来源,操作结果的去向。操作对象通常为存储器地址,寄存器或立即数。
例,MOV AX,03H—————地址码操作码 地址码
AX,03
目的操作数
AX,
源操作数
03H
2、指令系统:
计算机所能执行的全部指令的集合。
RISC(精简指令集)计算机技术。
CISC(复杂指令集)计算机技术。
3、寻址方式:
指令中说明操作数所在地址及获得转移地址的方法。
[ ],地址 例,[DI] [2000]
( ):内容 例,( DI) ( 20000)
操作数的主要来源:
立即数操作数
—可以是 8位,16位的常数。
注:只能做源操作数,不能做目的操作数。
例,MOV AX,1234H
寄存器操作数
—是某个 8或 16位寄存器中的内容。
例,MOV AX,BX
存储器操作数
—来自 1个,2个或 4个存储单元的内容。
例,MOV AX,[1234H]
二、指令的执行时间意义:
在特殊的定时,延时程序中必需了解指令的执行时间。
一条指令的执行时间包括:
取指令、取操作数、执行指令及传送结果因素,用时钟周期表示。
例,对 MOV指令,CPU时钟频率为 5MHZ
则从寄存器到寄存器之间立即数传送到寄存器存储器传送字节到寄存器的传送指令执行的时间为:
寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行时间最长。
3-2、说明操作数所在地址的寻址方式
1、立即寻址,操作数直接包含在指令中。
立即数,所需的操作数由指令的地址码部分直接给出。
立即数可以是 8位( bit)的字节,也可以是 16位的字或 32
位的双字。
例,MOV AX,03H
M




CS,0003
CS,0002
03CS,0001
B8CS,0000
00
00
00特点:取指时,操作码和一个操作数同时被取出,不必再次访问存储器,提高了指令的执行速度,通常用于给某一寄存器或存储单元赋初值。 注:目的操作数不能为立即数。
播放
2、寄存器寻址,操作数包含在 CPU 的内部寄存器中。
例,MOV DS,AX
播放
3、直接寻址,操作数的偏移地址放在地址码存储器的数据段中。
例,MOV AX,DS,[2000H]
MOV AX,[2000]
M


::
::
:CS,0003
20CS,0002
00CS,0001
A1CS,0000
若,DS=0100
::
::
::
030100,2000
:0100,1FFFPA=( DS) × 16+[ 偏移地址 ]
播放
4、寄存器间接寻址,操作数在存储器中,
但存储单元的偏移地址放在寄存器( SI、
DI,BP,BX)之一中。
1)当寄存器为 SI,DI,BX时; 例,MOV AX,[ SI ]
PA=( DS) × 16 + [ SI,DI,BX ]
若,DS=2000; SI=1000 则操作数的物理地址为?
2)当寄存器为 BP 时; 例,MOV AX,[ BP ]
PA=( SS) × 16 + [ BP ] (段超越时例外)
已知,SS=3000H,BP=2000H,则 操作数的物理地址?
播放
5、寄存器相对寻址,操作数在存储器中,
操作数的偏移地址由指令指定的寄存器
BX,BP,SI,DI和指令中给定的位移量
( DISP)相加获得。
例,MOV AX,[DI+1000H]
MOV AX,[ DI ][ 1000 ]
PA=( DS) × 16 + [ SI,DI,BX ]+ 位移量
PA=( SS) × 16 + [ BP ]+ 位移量播放
6、基址、变址寻址,由基址寄存器
( BX,BP)和变址寄存器( SI,DI)联合提供操作数的偏移地址。
例,MOV AX,[ BX ][ SI ]
PA=( DS) × 16 +[BX]+ [ SI,DI]
PA=( SS) × 16 + [BP]+ [ SI,DI]
播放
7、基址、变址、相对寻址:
操作数的偏移地址由基址寄存器、变址寄存器和指令中给定的位移量相加得到。
例,MOV AX,[ BP ][ SI ][ 2000H ]
PA=( DS) × 16 +[BX]+ [ SI,DI]+偏移量
PA=( SS) × 16 + [BP]+ [ SI,DI]+偏移量播放
8、隐含寻址,操作数的地址隐含在指令操作码中。
例,MUL BL
DIV DL
例 1:已知 DS=1000H,ES=2000H,SS=3800H,
SI=1010H,BX=0200H,BP=0020H,请指出下列指令的源操作数字段是什么寻址方式?源操作数字段的物理地址是多少?
1) MOV AL,[1000H]
2) MOV AH,[SI]
3) MOV AX,[BP]
4) MOV AL,BYTY PTR [BX][SI]
5) ADD AX,[BP+10]
6) ADD AL,ES,[BX]
7) MOV AL,[BX][SI+8]
8) MOV AL,ES,[BX+SI]
例 2、设有关寄存器及存储单元内容为,DS=1000H,
ES=1110H,BX=0110H,SI=0002H,试说明下列各条指令执行完后 AX中的内容。 10103 55
10110 22
10111 33
10112 44
11210 0AA
11211 0BB
11212 0CC
11213 0DD
1) MOV AX,ES,[BX]
2) MOV AX,ES,[BX][ SI ]
3) MOV AX,1200H
4) MOV AX,BX
5) MOV AX,[ 1210H ]
6) MOV AX,[BX]
7) MOV AX,1100H [ BX ]
8) MOV AX,[BX+SI]
9) MOV AX,[BX+SI+1100H]
10) MOV AX,SI
作业:
152页 3-1,3-2
3-3 8086 的指令系统
数据传送指令
算术运算指令
逻辑运算指令
串操作指令
程序控制指令
处理器控制指令常用符号
OPRD( OP1,OP2) ——操作数
mem—— 存储器操作数 [ ]
acc——累加器操作数
dest——目的操作数
src——源操作数
disp——偏移量,用符号地址表示
DATA——立即数
port——输入输出端口,可用数字或表达式。
( ) [ ]
一、数据传送指令
1,MOV指令格式,MOV OP1,OP2
操作码 目的 源功能,把一个字节或一个字的 OP2送到
OP1中。
说明,源操作数可以是寄存器、存储器以及立即数,而目的操作数可以是寄存器和存储器。
通用寄存器
AX,BX,CX,DX,BP、
SP,SI,DI,AL,AH,BL、
BH,CL,CH,DL,DH
存储器立即数段寄存器
CS,DS
ES,SS
CS只能作源操作数
MOV指令举例:
1) CPU内部寄存器之间传送数据:
MOV AL,BL ; 8位数据传送指令( 1字节)
MOV AX,DX ; 16位数据传送指令( 1字)
MOV SI,BP ; 16位数据传送指令( 1字)
2)立即数传送至通用寄存器:
MOV CL,4 ; 8位数据传送
MOV AX,03FFH ; 16位数据传送
MOV指令举例:
3)寄存器( CS和 IP除外)与存储器间的数据传送
MOV AL,BUFFER
MOV AX,[SI]
MOV [DI],CX
MOV SI,BLOCK [BP]
MOV DS,DATA[SI+BX]
MOV DEST[BP+DI],ES
注意:
1,MOV指令不能在两个存储器之间进行数据直接传送。
2,MOV指令不能在两个段寄存器之间进行数据直接传送。
3,立即数不能直接传送给段寄存器。
4,目的操作数不能为 CS和 IP。
其中( 1) —( 3)的传送可用通用寄存器作为中介,用两条传送指令;
例,MOV AL,AREA1
MOV AREA2,AL
例:将内存中以 AREA1为首地址的 100个字节数据搬移到以 AREA2为首地址的内存中去。
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,100
AGAIN,MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ AGAIN
。。。。。。
。。。。。。
。。。。。。
。。。。。。
。。。。。。
。。。。。。
。。。AREA2
。。。。。。
。。。。。。
。。。。。。
。。。。。。
44。。。
33。。。
22。。。
11AREA1
2、交换指令
XCHG指令格式,XCHG OP1,OP2
功能,交换两个操作数。
说明,指令中的两个操作数可以是两个寄存器操作数,或一个寄存器与一个存储器操作数。
(段寄存器不能作为一个操作数)
举例,XCHG AL,CL
XCHG AX,DI
XCHG BX,SI
XCHG AX,BUFFER
3、地址传送指令
1) LEA指令格式,LEA OP1,OP2
功能,将 OP2的偏移地址送入通用寄存器 OP1。
说明,OP1必须是通用寄存器,OP2必须为存储单元。(传送的是 OP2的偏移地址,不是内容)
举例,LEA BX,BUFR ;将 BUFR的偏移地址送入 BX中 。
3、地址传送指令
2) LDS指令格式,LDS OP1,OP2
功能,完成一个地址指针的传送。(段地址和偏移地址的传送)段地址送入 DS,偏移地址送入一个 16位的指针寄存器或变址寄存器。
说明,OP1为一个 16位的指针或变址寄存器,
OP2为存储器。
举例,LDS SI,[ BX ]
3) LES指令与 LDS指令相同,只是段地址送入 ES。
4、堆栈指令堆栈是内存中的一个特定区域,由 SS的内容和 SP
的内容来决定。堆栈操作具有先入后出的特点。
PUSH堆栈压入指令格式,PUSH OP
功能,将 OP中的内容放入堆栈段中
POP 堆栈弹出指令格式,POP OP
功能,将堆栈段中的内容弹出到 OP。
说明,OP可以是段寄存器( CS除外)、通用寄存器或内存的字。
8000,2005H
8000,2004H
8000,2003H
8000,2002H
8000,2001H
8000,2000H
8000,1FFFH
8000,1FFEH
8000,1FFDH
8000,1FFCH
8000,1FFBH
8000,1FFAH
SS=8000H SP=2004H
SS,SP
A B C D E F G H
A
B
C
D
E
F
G
H
SS,SP
SS,SP
SS,SP
压栈时,SP-1,高字节送入 SP 所指单元 ~~。
出栈时,SP 所指单元内容弹出到低位;
SP-1~~~~。
8000,2005H
8000,2004H
8000,2003H
8000,2002H
8000,2001H
8000,2000H
8000,1FFFH
8000,1FFEH
8000,1FFDH
8000,1FFCH
8000,1FFBH
8000,1FFAH
堆栈操作举例:
MOV AX,8000H
MOV SS,AX
MOV SP,2000H
MOV DX,3E4AH
PUSH DX
PUSH AX
POP DX
POP AX
3E
4A
80
00
AX=3E4AH DX=8000H
课堂练习:
判断下列指令是否正确,若错误,为什么?
1,PUSH DS
POP CS
2,MOV CL,1000
3,MOV [BX],[SI]
4,MOV AH,BH
5,MOV AX,[SI]
6,PUSH AL
7,MOV CL,AX
8,MOV CS,AX
二、算术运算指令存储器通用寄存器通用寄存器 立即数 存储器通用寄存器通用寄存器 存储器

二、算术运算指令
1、加法和减法指令
1) ADD加法指令和 SUB减法指令格式,ADD OP1,OP2
功能,OP1+OP2送 OP1
格式,SUB OP1,OP2
功能,OP1-OP2送 OP1
注:这些指令执行时对标志位 CF,OF,
PF,SF,ZF和 AF都会产生影响。
举例:
ADD AL,30
ADD AX,SI
ADD SI,AX
ADD BX,3FFH
ADD BETA[SI],100
SUB CX,BX
SUB AX,2AH
二、算术运算指令
2)带进位加法指令 ADC和带借位减法指令 SBB。
格式,ADC OP1,OP2
功能,OP1+OP2+CF送 OP1
格式,SBB OP1,OP2
功能,OP1-OP2-CF送 OP1
说明:与 ADD和 SUB相类似,只不过还要加或减去 CF的当前值,主要用于多字节的加减运算。
举例:
计算 45678998H+56789012H,并将结果保存到 [0010]。
MOV AX,8998
ADD AX,9012
MOV [0010],AX
MOV AX,4567
ADC AX,5678
MOV [0012],AX
DS,0010 AA
DS,0011 19
Ds,0012
Ds,0013
E0
9B
9BE019AA
对标志位 C,S,O,A,Z,P有影响。
AX=19AA
CF=1
Ax=9BDF+1
=9BE0
3) INC加 1和 DEC减 1指令格式,INC OP DEC OP
功能,OP+1送 OP OP-1送 OP
说明:常用于循环程序中修改地址指针和循环次数。 OP可以是通用寄存器,也可以是内存单元。对标志位 A,O,P,S和 Z有影响,对 CF
不产生影响。
举例,INC AL DEC BX
INC BYTE PTR [SI] DEC BYTE PTR [DI]
4) NEG求补指令格式,NEG OP
功能,对 OP求补码( 0-OP),结果送回 OP。
说明:对 -128或 -32768求补时,操作数不变,但标志位 OF=1。该指令对 A,O,C,P,S,Z有影响,一般总会使 CF=1,除非在 OP=0时 CF=0。
补码正数补码 求反 +1 负数补码
0 00000000 11111111+1 00000000 0
1 00000001 11111110+1 11111111 -1
2 00000010 11111101+1 11111110 -2
3 00000011 11111100+1 11111101 -3
126 01111110 10000001+1 10000010 -126
127 01111111 10000000+1 10000001 -127
10000000 -128
例:对 3求补
00000000
— 00000011
11111101
MOV AX,03H
NEG AX
CF=1,AF=1,SF=1
PF=0,OF=0,ZF=0
5) CMP比较指令格式,CMP OP1,OP2
功能,比较 OP1,OP2的大小( OP1-OP2),只影响标志位,不影响 OP1和 OP2的内容。
说明,OP1可为寄存器和内存单元; OP2可为立即数、通用寄存器或内存单元。常用于条件转移指令的条件判断。
举例,MOV AX,04FFH
CMP AX,1234H
0000010011111111
— 0001001000110100
1111001011001011AX=?
C,A,P,O,Z,S
CMP指令判断的条件:
OP1=OP2时
当操作数为无符号数时(不会溢出 OF=0)
若 CF=0 则 OP1>OP2 ; CF=1则 OP1<OP2
当操作数为有符号数时
OP1与 OP2符号相同时(不会溢出 OF=0)
则 SF=0时 OP1>OP2,SF=1时 OP1<OP2
OP1与 OP2符号不相同时(有可能溢出)
当 OF=0时,则 SF=0时 OP1>OP2,SF=1时 OP1<OP2
当 OF=1时,则 SF=0时 OP1 < OP2,SF=1时 OP1>OP2
ZF=1
OF SF=0时 OP1>OP2; OF SF=1时 OP1<OP2;+ +
举例:
求最大值,若自 BLOCK开始的内存单元中,有 100个带符号数 (16位数据 ),希望找到其中最大的一个值,并将它放到 MAX单元中。
MOV BX,OFFSET BLOCK
MOV AX,[BX]
INC BX
INC BX
MOV CX,99
AGAIN,CMP AX,[BX]
JG NEXT
MOV AX,[BX]
NEXT,INC BX
INC BX
DEC CX
JNZ AGAIN
MOV MAX,AX,
.
.
.
.
.
.
.
.BLOCK
二、算术运算指令
1、乘法指令无符号数乘法指令 MUL和带符号数乘法指令 IMUL
格式,( I) MUL OP
功能,字节、字的(带符号)无符号相乘。
说明,被乘数放在 AL或 AX中,乘数为 OP,
16位乘积保存在 AX中,32位乘积的高 16
位保存在 DX中、低 16位保存在 AX中。
注:这些指令执行时对标志位 CF,OF会产生影响。
例,3FH× 64H
MOV AL,3F
MOV BL,64
MUL BL
AX=189CH
当结果的高半部分不全为 0 时,
CF=1,OF=1
00111111
01100100
00011000 10011100
2、除法指令无符号数除法指令 DIV和带符号数除法指令 IDIV。
格式,( I) DIV OP
功能,除法说明:
被除数
16位放在 AX
32位,高 16位放在
DX,低 16位放在 AX
除数
8位
16位放在 OP中结果
8位商存放在 AL,余数放在 AH
16位商存放在 AX,余数放在 DX
IDIV 余数符号与被除数相同
3,BCD码调整指令
AAA
AAS
AAD
AAM
DAA
DAS
ASCII算术运算指令
BCD算术运算指令
MOV AX,31H ;装入 ASCII 1
ADD AL,39H ;装入 ASCII 9
AAA ;调整
ADD AX,3130H ;结果变成 ASCII码压缩的和非压缩的 BCD数据十进制 压缩的 非压缩的
12 0001 0010 0000 0001 0000 0010
623 0000 0110 0010 0011 0000 0110 0000 0010 0000 0011
910 0000 1001 0001 0000 0000 1001 0000 0001 0000 0000
计算压缩的 BCD码 1234+3099
MOV DX,1234H ;装入 1234
MOV BX,3099H ;装入 3099
MOV AL,BL ; BL和 DL之和
ADD AL,DL
DAA ;调整
MOV CL,AL ;结果送 CL
MOV AL,BH ; BH,DH及进位位之和
ADC AL,DH
DAA ;调整
MOV CH,AL ;结果送 CH
AL=CDH
AL=33H
1234+3099=4333
1)“与”运算指令 AND
格式,AND OP1,OP2
功能,对 OP1,OP2按位相“与”
说明,自己与自己相“与”,操作数不变,但可以使进位标志位 CF清 0。常用于使指定位数置 0的操作中。
举例,MOV AL,63H ;输入 0110 0011
AND AL,0FH ;使 AL高四位为 0,
低四位不变。
将 AL的最高位设为 0,AND AL,
7FH
该指令使 CF=0,OF=0,影响标志位 P,S,Z
三、逻辑运算和移位运算
1、逻辑运算指令
2)逻辑“或”指令 OR
格式,OR OP1,OP2
功能,对 OP1,OP2按位相“或”。
说明,操作数自身相“或”将不改变操作数的值,但可使 CF=0;通常用于使指定位数置 1的操作。
举例,使 AL中的最低两位置 1。
OR AL,03H ; AL―或” 0000 0011
该指令使 CF=0,OF=0,影响标志位 P,S,Z
3)求反指令 NOT
格式,NOT OP
功能,对 OP求反码说明,OP可以是寄存器或存贮器的内容,该指令不影响标志位。
举例,NOT AL
NOT AX
4)逻辑“异或”指令 XOR
格式,XOR OP1,OP2
功能,对 OP1,OP2按位相“异或”。
说明,操作数自身相“异或”结果为 0,且使 CF=0;
通常用于使指定寄存器清 0操作或使指定位取反操作。
举例,XOR AX,AX ; AX累加器清 0
XOR SI,SI ; SI寄存器清 0
若 CX=4D7AH=0100 1101 0111 1010B
OR CX,0600H
AND CX,0FFFCH
XOR CX,1000H;置位 CX的第 9,10位;清除第 0,1位;第 12位取反。
A B T
0 0 0
0 1 1
1 0 1
1 1 0
0000 0110 0000 0000
0 1 1
1111 1 1 1111 110
1000B
000 0000 0000 0 0
0101
5)测试指令 TEST
格式,TEST OP,im ;( im立即数)
功能,对 OP,im按位相“与”,只影响标志位,
不改变结果。
说明,通常用于检测某一位或某几位的状态,而不希望改变结果的情况下。
举例,检测 AL中的最低位是否为 1,如为 0则转移。
TEST AL,01H ; AL―与” 0000 0001
JNZ THERE ; ZF≠0转移到 THERE
THERE,MOV BL,05H
2、移位指令
1)算术左移和逻辑左移指令 SAL/SHL
2)算术右移和逻辑右移指令 SAR/SHR
格式,操作码 OP,m ( m是移位次数)
功能,对寄存器或内存单元中的操作数进行指定次数的移位,可进行字节或字的操作;常用于完成乘或除 2n的操作。
注,可以一次只移 1位,大于 1次时要由 CL寄存器指定移位的次数。
SAL AH,1 MOV CL,4
SAL AH,CL
SAL/SHL
例:
MOV AL,7BH
SAL AL,1
0 1 1 1 1 0 1 1
0 1 1 1 1 0 1 1 0
AL=0F6H CF=0 OF=1
左移 1位相当于乘 2,右移 1位相当于除 2
SAR
例:
MOV AH,7BH
SAR AH,1
0 1 1 1 1 0 1 1
10 0 1 1 1 1 0 1
AH=3DH CF=1
SHR
例:
MOV AH,7BH
SHR AH,1
0 1 1 1 1 0 1 1
10 0 1 1 1 1 0 1
3、循环移位指令
左循环移位指令 ROL OP,m
右循环移位指令 ROR OP,m
带进位左循环移位指令 RCL OP,m
带进位右循环移位指令 RCR OP,m
注:以上指令只影响标志位,CF和 OF
左移循环指令 ROL
当规定的循环次数为 1时,若循环以后的操作数的最高位不等于标志位 CF,则 OF=1;否则 OF=0。
可以用来判断移位前后的符号位是否改变。
1 0 1 1 1 1 0 0
01111001 CF=1 OF=1
右循环移位指令 ROR
当规定的循环次数为 1时,若循环移位后,操作数的最高位和次高位不相等,则标志位 OF=1;否则
OF=0。可以用来判断移位前后操作数的符号是否有改变。
0 1 1 0 1 0 1 1
10110101 CF=1 OF=1
带进位左移循环指令 RCL
110110110
10110110 CF=1 OF=0
带进位右循环移位指令 RCR
00110110 1
10011011 CF=0 OF=1
SAL/SHL
SAR
SHR
ROL
ROR
单向移位小循环大循环
RCL
RCR
四、串操作指令
串:在存储器中连续存放的一串字节或字。
注意:在串操作中,一般假定源串在数据段
( DS)中,而目的串在附加段( ES)中,用
SI作指针对源串寻址,而用 DI作指针对目的串寻址。每作一次串操作后,SI和 DI自加或自减。若 DF=0则作加,否则若 DF=1则作减。
串操作前可用指令 STD使 DF=1;或用指令
CLD使 DF=0。
若有重复操作,则用 CX记数,每执行一次,
CX自动减 1。
1、串传送指令 MOVS/MOVSB/MOVSW
格式,MOVS OP1,OP2 或 MOVSB ; MOVSW
功能,将源串 OP2的一个字节或字传送到目的串 OP1。
2、串比较指令 CMPS/CMPSB/CMPSW
格式,CMPS OP1,OP2地 或 CMPSB; CMPSW
功能,与 CMP相似,但串比较时用源 OP2—目的 OP1。
3、串扫描指令 SCAS/SCASB/SCASW
格式,SCAS OP 或 SCASB; SCASW
功能,用 AL或 AX的值减去 OP目的串字节或字,结果改变标志位,不改变操作数的值,用于寻找内存中指定的数据或字符。
4、串装入指令 LODS/LODSB/LODSW
格式,LODS OP 或 LODSB; LODSW
功能,将源串 OP的一个字节或字装入到 AL或 AX中。
5、串存贮指令 STOS/STOSB/STOSW
格式,STOS OP 或 STOSB; STOSW
功能,将 AL或 AX中的字节或字存储到目的串 OP。
6,重复执行串前缀 REP
功能,重复执行串操作指令。
7,条件重复串前缀 REPE/REPNE
REPE( REPZ)相等重复指令,ZF=1且 CX≠0重复执行。
REPNE( REPNZ)不相等重复,ZF=0且 CX ≠0则重复。
例:将 1000个字符的字符串从内存的 BUFFER1
搬移到内存的 BUFFER2中去。
MOV SI,OFFEST BUFFER1
MOV DI,OFFEST BUFFER2
MOV CX,1000D
REP MOVS BUFFER2,BUFFER1
已知,CS=2000H,IP=0100H,DS=1000H,DI=0000H,
SI=0200H,ES=3000H,设 BUFFER1的偏移地址 =0010H,
BUFFER2的偏移地址 =0400H。
试问,BUFFER1和 BUFFER2的首地址各为多少?
例:将数据段中的 100个字的数据块 BLOCK1搬移到同一个数据段的 BLOCK2中去。
PUSH DS
POP ES
LEA SI,BLOCK1
LEA DI,BLOCK2
MOV CX,0064H
CLD
REP MOVSW
例:比较 DEST和 SOURCE中的 500个字节,找出第一个不相同的字节,如果找到,则将 SOURCE中的这个数送 AL中。
CLD
LEA DI,ES,DEST
LEA SI,SOURCE
MOV CX,500
REPE CMPSB
JCXZ NEXT
MATCH,DEC SI
MOV AL,BYTE PTR [ SI ]
NEXT:
DEST
1000,0010 M
1000,0011 Y
1000,0012 N
1000,0013 A
1000,0014 M
1000,0015 E
SOURCE
2000,3000 M
2000,3001 Y
2000,3002 N
2000,3003 E
2000,3004 M
2000,3005 E
五、程序控制指令
1、无条件转移、调用和返回指令
1)无条件转移指令 JMP
直接转移
短程转移 JMP SHORT NEXT -128~+127
近程转移 JMP NEAR PTR LOOP1 同一段内
远程转移 JMP FAR PTR LOOP2 不在同一段间接转移
段内间接转移 JMP CX
段间间接转移 JMP DWORD PTR [BP][DI]
2)调用 CALL和返回 RET指令
CALL指令 用来调用一个子程序。
格式:
段内调用,CALL NEAR PTR OP (对 IP压栈)
段间调用,CALL FAR PTR OP (对 CS和 IP压栈)
OP 为被调用的子程序或过程的首地址。
RET指令 用来返回原程序。
调用结束后,用 RET指令弹出堆栈中的数据给 IP和 CS,使程序返回主程序。
已知:当前在执行 CALL指令前各寄存器的状态为,AX=0100,
BX=0200,CX=0300,DX=0400,SI=0500,DI=0600,SP=0700,
BP=0800,IP=0900,CS=1000,DS=2000,ES=3000,SS=4000,
[ PROAD ]=2345,[ ARY]=1000,COUNT=03
1000,0900 CALL NEAR PTR PROAD
1000,0903
SS,SP 堆栈段
4000,0700
CS,IP
4000,06FE 03
09
1000,2345 PUSH AX
00
01
1000,2347 PUSH CX
00
03
1000,2349 PUSH SI
00
05
1000,234B
1000,234D
LEA SI,ARY
ARY
2000,1000 04
2000,1001 07
2000,1002 09
2000,1003 03
2000,1004 02
2000,1005 04
1000,234F
MOV CX,COUNT
1000,2352
XOR AX,AX
1000,2354
NEXT,ADD AX,[SI]
1000,2357
ADD SI,2
LOOP NEXT
4000,06FA
4000,06FC
4000,06F8
SI=1000
CX=3
AX=0
AX=0704
SI=1002
CX=
IP内容压栈,将子程序入口偏移地址送 IP
IP=2345
已知:当前在执行 CALL指令前各寄存器的状态为,AX=0100,
BX=0200,CX=0300,DX=0400,SI=0500,DI=0600,SP=0700,
BP=0800,IP=0900,CS=1000,DS=2000,ES=3000,SS=4000,
[ PROAD ]=2345,[ ARY]=1000,COUNT=03
SS,SP 堆栈段
03
09
00
01
00
03
00
05
ARY
2000,1000 04
2000,1001 07
2000,1002 09
2000,1003 03
2000,1004 02
2000,1005 04
4000,06F8MOV SUM,AX
POP SI
POP CX
POP AX
RET
PROAD ENDP
SI=0500
CX=0300
AX=0100
执行 RET指令,弹出堆栈内容给 IP
4000,06FA
4000,06FC
4000,06FE
IP=0903
4000,0700
CS,IP 1000,0903
2、条件转移指令根据标志寄存器中各标志位的状态,决定程序是否进行转移,条件转移指令只能在现行代码段( CS)内,并且在 IP的 +127— -128之内。
ZF=0JNE/JNZ
条件转移中的测试条件
PF=0JNP/JPO
CF=0JNCSF=0JNS
PF=1JP/JPEOF=0JNO
ZF=1JE/JZSF=1JS
CF=1JCOF=1JO
CF=1或 ZF=1JBE/JNAZF=0且 OF SF=0JLE/JNG
CF=1且 ZF=0JB/JNAEZF=0且 OF SF=0JL/JNGE
CF=0或 ZF=1JAE/JNBZF=0且 OF SF=0JGE/JNL
CF=0且 ZF=0JA/JNBEZF=0且 OF SF=0JG/JNLE
+
+
+
+
3、循环控制指令 LOOP
用 CX作计数器控制程序的循环。
格式,LOOP OP ; CX≠0循环
LOOPNE OP ; CX≠0且 ZF=0循环
LOOPE OP ; CX ≠0且 ZF=1循环
4、软中断指令 INT及中断返回指令 IRET
INT:中断当前程序的执行,转向中断入口去执行。
IRET:返回原程序,从断点处继续执行原程序。
INTO:溢出中断指令,当 OF=1时进入溢出中断处理程序。
六、处理器控制指令
1、标志位操作指令用于修改标志寄存器( CF,DF,IF)。
2、外部同步操作指令七、输入 IN和输出 OUT指令用于对 I/O端口与 CPU之间的信息交换。
格式,IN ACC,OP ; ACC为 AX或 AL
OUT OP,ACC ; OP为端口地址注意,8088可寻址 64K个端口,当 OP为立即数(端口号)
时,只能寻址 00H~FFH 的 256个端口,大于 FFH时必须用 DX表示。 例,MOV DX,1A35H
IN AX,DX
作业:
1,已知 ( DS)=091DH,( SS)=1E4AH,( AX)=1234H,
(BX)=0024H,(CX) =5678H,( BP)=0024H,( SI)=0012H,
( DI) =0032H,[ 09226H ]=00F6H,[ 09228H ]=1E40H,
[ 1E4F6H ]=091DH,试求下列各指令单独执行后的结果。
1) MOV CL,20H [ BX ] [ SI ] ;( CL) =?
2) MOV [ BP ] [ DI ],CX ; [ 1E4F6H ]=?
3) LEA BX,20H [ BX] [ SI ] ;( BX) =?
MOV AX,2 [ BX ] ;( AX) =?
4) LODS SI,[ BX ] [ DI ]
MOV [ SI ],BX ; [ SI ]=?
5) XCHG CX,32H [ BX ]
XCHG 20 [ BX ] [ SI ],AX ;(AX)=? [ 09226H]=?
2、试用 CMP指令和条件转移指令实现以下判断。
1) AX和 CX中的内容为无符号数
a,( AX) >( CX)则转至 BLGER标号执行。
b,( AX) <( CX)则转至 LESS标号执行。
2) BX和 DX中的内容为带符号数
a,( BX) >( DX)则转至 BLGER标号执行。
b,( BX) <( DX)则转至 LESS标号执行。
指出下列指令的错误,并加以改正。
1,MOV DS,1000H
2,MOV 1020H,DX
3,SUB [1000H],[ SI ]
4,PUSH AL
5,MOV DS,ES
6,SHR DX,4
7,OUT 380H,AX
8,ADD AL,BX
9,POP CS
10,MOV CL,3300H
不能将立即数送给段寄存器。
立即数不能做目的操作数。
两个存储单元间不能直接传送数据堆栈操作必须是一个字数据两个段寄存器间不能直接传送数据移位次数大于 1时用 CL表示。
端口号大于 256时,必须用 DX表示传送数据位数不匹配
CS不能做目的操作数传送数据位数不匹配第四章 汇编语言程序设计汇编语言是一种介于 机器语言 和 高级语言 之间的计算机编程语言,是一种面向机器的语言。它和机器码有一一对应的关系,
所以允许程序员用汇编语言直接对寄存器、
存储器,I/O端口以及 CPU内部的许多硬件进行操作,因此用汇编语言可以编写出高质量的程序,用汇编语言编写的程序占用内存少,执行速度快。
机器码指令构成的指令系统叫机器语言(二进制代码)。机器语言是能被计算机识别的惟一语言。
例如:
MOV AX,im ( B8)
MOV DX,im ( BA)
MOV CX,im ( B9)
MOV BX,im ( BB)
PUSH AX ( 50)
PUSH DX ( 52)
PUSH CX ( 51)
PUSH BX ( 53)
POP AX ( 58) POP DX ( 5A)
POP CX ( 59) POP BX ( 5B)
汇编语言程序必须先翻译成机器语言程序才能执行。
由汇编语言程序翻译成机器语言程序的过程,
称为 汇编。 完成汇编过程的系统程序称为 汇编语言程序 或称为 源程序。
汇编语言程序翻译 机器语言程序执行汇编程序
ASM 小汇编
MASM 宏汇编推荐两个汇编网站
http://www.x86asm.com
http://www.aogosoft.com
一、汇编语言的语句格式语句格式:
[标号 ] 指令助记符 [操作数 ] [;注解 ]
例:
BINASC,MOV AX,BX ;将 BX的内容传送给 AX
MOV AX,BX ;将 BX的内容传送给 AX
PUSH AX ;将 AX中的内容压栈
RET ;返回主程序
MOV AX,1234H
源程序的书写格式:
各部分之间至少用一个空格分开,各语句间隔均匀。
1、标号:给某一存储单元地址所起的名字。
字母,A~Z
数字,0~9
特殊字符:?,@ _ $
例,BINASC,MOV AX,BX
S2,MOV AX,BX
BIG?,MOV AX,BX
注意,数字不能作名称的第一个字符。圆点只能用作第一个字符,标号最长为 31个字符。当名称后跟:时,
表示是标号,它代表该行指令的起始地址。当名称后不带:时,也可能是变量。伪指令和段间调用时标号不带冒号。
例,S5 IN AL,DX DATA DB 10 DUP( 0)
2、指令助记符
8088指令助记符,8088指令。表示要
CPU完成什么具体操作,必要时可在助记符前加前缀。
例,MOV,ADD,SHL; REP RCL
伪指令(指示语句),不要求 CPU执行某种操作,汇编时也不产生对应的机器代码,而仅仅给汇编程序提供汇编信息。
3、操作数:指令执行的对象。
可有一个,两个或没有。对伪指令可有多个操作数,操作数之间用逗号分开。操作数可以是常数、寄存器名、标号、变量、也可以是表达式。
4、注解:对源程序语句的注解。
注解一般都用英语,在支持汉字的操作系统中,也可使用中文。
二、常数汇编语言语句中可使用的常数:
1、二进制数 例,01001010B
2、八进制数 例,112Q或 112O
3、十进制数 例,85D 或 85
4、十六进制数 例,10H,2AH,0ABH,0F123H
5、十进制浮点数 例,12E – 2
6、十六进制实数 例,0FFFFFFFFR
7、字符和字符串 例:‘ A‘、‘ 3‘、‘ X‘
三、伪指令
1、定义数据伪指令:用来定义存储空间及其所存数据的长度。
DB—定义字节数据
DW—定义字数据
DD—定义双字数据
DQ—定义 4个字长数据
DT—定义 10个字长数据例,DATA1 DB 5,6,7
DATA2 DW 1,2,1A34H
DATA3 DD 5,6,1A34H
DATA1 05
06
07
DATA2 01
00
02
00
34
1A
DATA3 05
00
00
00
06
2、符号定义伪指令 EQU
EQU:给符号定义一个值。
例,S2 EQU 50
MOV CX,S2
3、段定义伪指令 SEGMENT和 ENDS
一个完整的源程序由 3个段组成:堆栈段、
数据段、代码段。
SEGMENT:定义一个段开始。一个段必须有一个名称来标识。
ENDS:说明一个段的结束,和 SEGMENT成对使用。
格式,段名 SEGMENT [定位类型 ] [组合类型 ] [类别 ]
段名 ENDS
SEGMENT伪指令的书定格式:
段名,给定义的段所起的名字。
例,STACK SEGMENT STACK
DW 20 DUP(?)
STACK ENDS
定位类型,表示该段起始地址开始于何处,可以是字节型(段起始地址可以位于任何地方)、
字型(段起始地址必须位于偶数地址)、节型
( PARA,段起始地址必须能被 16除尽)、页型( PAGE,段起始地址可被 256除尽),当定位类型缺省时,默认为是节型。( XXXX0H)
组合类型,告诉连接程序,该段和其它段的组合关系,
连接程序可以将不同模块的同名段进行组合。
NONE—表明本段与其它段逻辑上不发生关系。
PUBLIC—表明本段与其它模块中用 PUBLIC说明的同名段连接成一个逻辑段,运行时装入同一个物理段中,
使用同一个段地址。
STACK—每个程序模块中,必须有一个堆栈段。将具有
STACK类型的同名段连接成一个大堆栈,由各模块共享。
COMMON—连接时重叠放在一起。
MENORY—连接时,将被放在所装载程序的最后存储区。
AT表达式 —表明该段的段地址是表达式所给定的值。
类别:表明该段的类别。
代码段( CODE)、数据段( DATA)、堆栈段
( STACK)
ASSUME 段分配伪指令格式,ASSUME 段寄存器:段名 [,段寄存器:段名,……]
用于说明源程序中定义的段或组由哪个寄存器去寻址,
即建立寄存器与段间的对应关系。
例:
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
MOV AX,DATA
MOV DS,AX
CODE ENDS
一般放在最后一个段定义语句中其中 DOS的装入程序负责把 CS
和 SS初始化为正确的地址,因此用户在程序中不必设置。但是由于 DS寄存器被用作其它用途,因此,用户必须用两条指令对 DS进行初始化,以装入用户的数据段地址,当使用附加段 ES
时,也要赋给段地址。
4、定义过程的伪指令 PROC和 ENDP
过程:具有一定功能的程序段(相当于一个子程序)
格式,过程名 PROC [类型 ]
RET
过程名 ENDP
说明,过程体内应至少有一条 RET指令,以便返回被调用处。一个过程可以调用另一个过程,
也可以调用过程本身。
举例:
FAR
NEAR
一个延时 100ms 的子程序,过程定义为:
SOFTDLY PROC
MOV BL,10
DELAY,MOV CX,2801
WAIT,LOOP WAIT
DEC BL
JNZ DELAY
RET
SOFTOLY ENDP
PUSH BX
PUSH CX
POP CX
POP BX
小循环大循环
CODE2 SEGMENT
ASSUME CS,CODE2
CALL FARPROC
CALL NEARPROC
NEARPROC PROC NEAR
RET
NEARPROC ENDP
CODE2 ENDS
CODE1 SEGMENT
ASSUME CS,CODE1
FARPROC PROC FAR
RET
FARPROC ENDP
CODE1 ENDS
CODE2 SEGMENT
ASSUME CS,CODE2
CALL FARPROC
CALL NEARPROC
NEARPROC PROC NEAR
RET
NEARPROC ENDP
CODE2 ENDS
CODE1 SEGMENT
ASSUME CS,CODE1
FARPROC PROC FAR
RET
FARPROC ENDP
CODE1 ENDS
5、模块间通讯的伪指令 PUBLIC和 EXTRN
PUBLIC
格式,PUBLIC 名称 [,名称,……]
功能,用于将一个标号定义为公用的,以便供其他模块使用。
说明,名称可以是标号、变量名、过程名等。
EXTRN
格式,EXTRN 名称:类型 [,名称:类型 ….]
功能,在本模块中引用了在外模块中用 PUBLIC说明的名称时,必须用 EXTRN说明。
说明,EXTRN和 PUBLIC是互相对应的。
6、汇编结束伪指令 END
格式,END [表达式 ]
功能,表示源程序到此结束。
说明,一个源程序必须有且只能有一个
END语句,一般放在程序最后一行。
[ 表达式 ] 表示该汇编程序中第一条可执行语句的标号,当有多个模块时,只有主模块可以有 [ 表达式 ] 。
SEGMENT ENDS 段定义
PROC ENDP 过程定义
MACRO ENDM 宏定义四、汇编语言的运算符
1、取值运算符 SEG和 OFFSET
功能,分别给出一个变量或标号的段地址和偏移量。
举例,SLOT DW 25 ;定义标号
MOV AX,SLOT ;
MOV AX,SEG SLOT ;
MOV AX,OFFSET SLOT ;
从 SLOT地址中取一个字送入 AX中将 SLOT标号所在段的段地址送入 AX中。
将 SLOT标号在段内的偏移地址送入 AX中
2、属性运算符对指令中的操作数指定一个临时属性,而暂忽略当前的属性。
指针运算符 PTR
功能,忽略操作数当前的类型(字节或字)及属性( NEAR或 FAR),而给出一个临时的类型或属性。
SHORT运算符功能,仅用于无条件转移指令,指出转移的标号不仅是 NEAR型,并且是在下一条指令的
-128~+127个字节范围内。
SLOT DW 25
MOV AL,BYTE PTR SLOT
JMP FAR PTR STEPMOV [ BX ],5
BYTE P [ BX ],5
MOV WORD PTR [ BX ],5
H1:
JMP H1
JMP SHORT H2
H2,MOV AX,0
五、宏指令宏,如同过程一样,也是执行某一任务的指令组,它们的区别是过程通过,CALL‖指令访问,而宏及所有宏内定义的指令组,被插入到程序中使用它的部位。
在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生原程序所需的机器码。
宏定义格式:
宏指令名 MACRO [ 形式参量 1,形参 2,……]
ENDM
宏指令名是一个宏调用的依据(必须要写,与标号规定一致)
[ 形式参量表 ] 可有可无,可以是一个,也可以有多个,
在有多个时,各参量之间应用逗号分开。
宏定义符 MACRO和宏定义结束符 ENDM成对出现。
宏体,MACRO~~ENDM之间。
宏体宏调用格式:
宏指令名 [ 实参 1,实参 2,……… ]
宏调用中的实参应与宏定义中的形参一一对应,但在 IBM宏汇编中,数量上不一定一致,若实参多于形参,则多余部分被忽略,若实参少于形参,则多余的形参按空对待。
例,若对 AL中的数据进行算术左移 4位的操作,在某程序中被多次使用,可对该指令组进行宏定义。
SHIFT MACRO
MOV CL,4
SAL AL,CL
ENDM
宏体
MOV AL,02H
SHIFT
例:
宏定义 GADD MACRO X,Y,ADD
MOV AX,X
ADD AX,Y
MOV ADD,AX
ENDM
X,Y,ADD都是形参宏调用 GADD DATA1,DATA2,SUM
DATA1,DATA2,DATA3,DATA4都是实参。
MOV AX,
ADD AX,
MOV
DATA1
DATA2
SUM,AX
例:用宏定义一个梯形面积公式。设上底为 x,
下底为 y,高为 h x
y
h
MOV AL,X
ADD AL,Y
MUL h
SAR AL,1
MOV AREA,AL
TAREA MACRO X,Y,h,AREA
ENDM
现已知一梯形上底为 8,下底为 10,高为 5。求此梯形面积。
TAREA 08H,0AH,05H MOV AL,08H
ADD AL,0AH
MUL 05H
SAR AL,1
,BX,34H
定义重复变量伪指令 DUP
格式:

DATA1 DB 10 DUP ( 0);定义 DATA1为 10个,0‖组成的字节变量
DATA2 DW 2 DUP (?);定义 DATA2为 2个不确定数值的字变量
DATA3 DB 4 DUP ( 1,2 DUP( 50H));定义 DATA3为( 1,50H,50H)重复 4次共 12个字节的字节变量
DB
DW
DD
变量名 n DUP (表达式)
六、汇编语言源程序的结构一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以 SEGMENT开始,以 ENDS结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。
注意:一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。段定义时一般最后定义代码段。
STACK SEGMENT PARA STACK?STACK‘
DB 500 DUP( 0)
STACK ENDS
DATA SEGMENT
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS,CODE,DS,DATA,
ES,DATA,SS,STACK
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
RET
MAIN ENDP
CODE ENDS
END MAIN
定义堆栈段定义数据段定义代码段
SEG ENT
SEG ENT
ENDS
SEGMENT
ENDS
I PR C
MAIN ENDP
END MAIN
STACK SEGMENT PARA STACK?STACK‘
DB 500 DUP( 0)
STACK ENDS
DATA SEGMENT
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS,CODE,DS,DATA,
ES,DATA,SS,STACK
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
RET
MAIN ENDP
CODE ENDS
END MAIN
1、必须用 ASSUME伪指令告诉汇编程序,哪一个段和哪一个段寄存器相对应,即某一个段地址应由哪个段寄存器提供段地址。 CS,CODE,DS,DATA,ES,DATA,SS,STACK
2、对 DS,ES 寄存器进行初始化。 CS 和 SS 由 DOS的装入程序自动分配正确的地址

将段地址赋给相应的段寄存器
3、程序在执行时由 DOS的装入程序将源程序装入内存,并建立一个 256字节的段前缀 PSP,同时设定各段寄存器的值。
一个源程序执行的过程第一步:编写汇编源程序
使用工具,可使用各种文本编辑工具(记事本、
写字板,WORD等),我们使用 DOS下的
EDIT文本编辑器。
功能,产生一个存储源程序的文本文件。
使用方法,在 DOS下运行 EDIT.EXE程序。
1,C,\EDIT
2,输入汇编源程序并保存为,asm文件。
第二步:对源程序进行编译
使用工具,使用 MASM5.0编译器
功能,使用编译器对源程序文件进行编译,生成包含机器代码的目标文件 (,obj)。
使用方法,在 DOS下运行 MASM.EXE程序。
1,C,\ MASM \ MASM.EXE
2、输入要进行编译的源程序文件路径及名称。
3、输入进行编译后产生的目标文件保存的路径及名称。
4、输入列表文件名:
5、输入交叉文件名:
第三步:对目标文件进行连接
使用工具,使用 LINK,EXE连接器
功能,对目标文件进行连接,从而得到一个可执行文件,EXE 。
使用方法,在 DOS下运行 LINK,EXE程序。
1,C,\ MASM \ LINK,EXE
2、输入要进行连接的目标文件路径及名称。
3、输入进行连接后产生的可执行文件,Exe 保存的路径及名称。
4、输入映像文件名:
5、输入库文件名:
第四步:跟踪、调试、运行程序
使用工具,Debug
使用方法,在 DOS下运行 DEBUG,EXE程序。
1,C,\ DEBUG xxx.EXE
以简化的方式进行编译和连接忽略中间文件,将产生的目标文件和可执行文件保存在当前路径下。
C:\ MASM \ MASM XXX;
C:\ MASM \ LINK XXX;
连接的作用:
当源程序较大时,编译器会将源程序文件分成多个部分来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件。
程序中调用了某个库文件中的内容时,需要将这个库文件和该程序生成的目标文件连接在一起。
一个源程序编译后,得到了存有机器码的目标文件,目标文件中有的内容不能直接生成可执行文件,必须通过连接程序将这些内容处理为最终可执行的信息。
可执行文件中的程序装入内存并运行的原理
CPU
内存硬盘
DATA SEGMENT
DATA ENDS
CODE SEGMENT
CODE ENDS
command
操作系统的外壳
操作系统是由多个功能模块组成的庞大、复杂的软件系统。
任何通用的操作系统,都要提供一个称为外壳( shell)的程序,用户使用这个程序来操作计算机系统进行工作。
DOS中有一个程序 command.com,在 DOS中称为命令解释器,也就是 DOS系统的外壳。
DOS启动时,先完成其他重要的初始化工作,然后运行
command,command 运行后,在屏幕上显示出,C:\‖,
然后等待用户的输入。
如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置 CS,IP指向程序的入口。此后,command 暂停运行,由 CPU运行程序。
程序运行结束后,返回到 command中。
在 DOS中可执行文件,EXE中程序加载的过程内存
xxxx:0000 PSP
xxxx+10h:0000
程序
1、找到一段起始地址为 xxxx:0000
的容量足够的空闲内存区。
2、在这段内存区的前 256个字节中,
创建一个称为程序段前缀( PSP)
的数据区,DOS要利用 PSP来和被加载的程序进行通信;
3、从 xxxx+10H:0开始,将程序装入,程序的地址被设为 xxxx+10H:0
4、将该内存区的段地址存入 DS中,
初始化其他相关寄存器后,设置
CS,IP指向程序入口。
注意,PSP区和程序区虽然物理地址连续,但为更好的区分,DOS将它们划分到不同的段中。
程序加载后,ds=xxxx 为程序加载的段地址。
数据区堆栈区代码区