第四章
8086/8088的指令系统汇编语言的指令语句与机选指令一一对应,
通过汇编程序将其翻译成机选指令代码(目标代码),CPU执行某种操作。
计算机通过执行指令序列来解决得问题的。
指令就是命令。指令的集合叫指令系统。指令的有序集合就是程序。
指令语言是面向机器的,是根据 CPU硬件特点研制出来的。应用指令语言能够充分开发计算机硬件资源。目标代码,运行速度快。
1,86系列汇编语言指令格式标号地址,助记符 操作数 ;注释逻辑地址符号,
加冒号,可缺省 见词帮助记忆,符号计算机不识别,最终将这些符号化成二进制代码 → 汇编参加运算的数可以是 1
个,2个,也可以没有
2个操作数源操作数目的操作数指令本身 寄存器存储器 外设端口可用语言描述
2.指令长度,1- 4个字节助记符 → 指令代码 → 存储到代码段 →
占用字节数是长度,代码所占用的第一个字节段为指令的首地址。
单字节、双字节、多字节指令的作用就是对操作数进行操作,(操作数存放在不同的地方,要想对操作数进行操作,首先要找到操作数)寻找操作数的方式叫寻址方式。
操作数不同的存储方式,寻址方式也不同。
3.寻址方式基本寻址方式有四种立即数寻址寄存器寻址直接寻址寄存器间接寻址
(1) 立即数寻址操作数直接存放在指令中,紧跟在操作码之后,作为指令的一部分存放到代码段里。这种操作数称为立即数,立即数可以是 8位或 16位 。
如果是 16位 高位字节 存放在 较高字节单元 中,
低位 字节存放在 较低字节单元 中。
MOV AX,1090H ; 1090H→ AX,;(AX)=1090H,(AH)=10H (AL)=90H
MOV AL,80H ; 80H→ AL,(AL)=80H
MOV AL,25 ; 25 → AL,(AL)=19H
MOV AL,’A’ ; ’A’ → AL,(AL)=41H
操作数直接在指令中取得,不需要使用总线周期,速度快注,立即数只能是整数,不能是小数,变量或其他类型的数据,只能作源操作数。
操作数 → 寄存器中( CPU内部)
AX,BX,CX,DX,SI,DI,SP,BP( 16位)
AH,AL,BH,BL,CH,DL,DH,DL( 8位)
MOV BX,AX ;(AX) → BX 或 AX → BX
源操作数目的操作数注,AX中的数不变,只是复制
(2) 寄存器寻址
MOV DL,AL ;(AL) → DL 或 AL → DL
INC CX ;(CX)+1 → CX 或 CX+1 → CX
ROL AH,1 ;(AH) × 2 → AH 或 AH × 2 → AH
寄存器在 CPU内部不需要使用总线周期、速度快。
例 MOV DL,25H
对源操作来说寻址方式为立即数寻址对目的操作来说寻址方式为寄存器寻址操作数 → 存储器中,指令中给出操作数在存储器中的有效地址 (EA)
有效地址 (EA) → 偏移地址,直接包含在指令中,
放在代码段中指令操作码之后,数据一般包含在数据段中,求出操作数的物理地址才能取得操作数 MOV AX,[1000H]
若 (DS)=3000H,[31000H]=6350H
物理地址 =3000H× 16+1000H=31000H
6350H→ AX,AX=6350H ★
(3) 直接寻址采用直接寻址,如果指令中没有说明操作数在哪个段,默认为 DS.假如操作数不在数据段中,
必须加段前缀
MOV AX,ES:[1000H]
ES:MOV AX,[1000H]
若 ES=5000H [51000H]=3428H
物理地址= 5000H× 16+1000H=51000H

CS:MOV BX,[2000H]
若 CS=5000H,求源操作数的物理地址。
将 CS段的 2000H和 2001H两单元内容送 BX。
本指令执行时是将 52000H和 52001H两单元的内容送 BX.
物理地址 =16× 5000H+2000H=52000H
练,
( 4)寄存器间接寻址 (重点 )
操作数在存储器中,操作数的有效地址放在寄存器中,要想找到操作数地址,必须先到寄存器中取出操作数地址,根据地址找到操作数,( 二级跳 )能够作寄存器间址的只能是 BX,BP,SI,DI.
如果指定的寄存器是 BX,BP或 DI则默认为 DS,
BP时默认为 SS,如果不在默认的段中必须加段前缀,
物理地址 =16× (DS)+(SI/DI/BX)
=16× (SS)+(BP)
MOV AX,[BX]
若 (AX) =1234H,(DS)=3000H,(BX)=1000H,
(31000H)=5678H,执行指令后 AX=?
物理地址 =3000H× 16+1000H=31000H
(AX) =5678H
MOV AH,[BX] ;(AH)=78H,(AL)=xxH 不影响可用于表格处理(即访问连续存储单元)执行一条指令后,只要修改寄存器内容就可以取出表格的下一项。
① 寄存器相对寻址操作数有效地址 EA是指定寄存器的内容加上指令中指定的 8位或 16位偏移量。
物理地址 =16× ( DS) +( SI/DI/BX) +8位或 16位偏移量
=16× ( SS) +(BP)+ 8位或 16位偏移量
MOV AX,08H[SI]
MOV AX,[SI+08H]
若 (DS)=3000H,(SI)=2000H,(32008H)=1234H,
指令执行后 AX=?
EA=
[BX]
[BP]
[SI]
[DI]
+8位或 16位物理地址 =3000H× 16+2000H+08H=32008H
AX=1234H
② 基址变址寻址操作数有效地址 EA是一个基地址寄存器和一个变址寄存器之和,两个寄存器均由指令指定。
BX,BP 为基址寄存器 基址和变址组合就是基址
SI,DI 变址寄存器 变址
EA= [BX][BP] + [DI][SI]
物理地址 =16× (DS)+(BX)+(SI)或 (DI)
=16× (SS)+(BP)+(SI)或 (DI)
MOV,AX,[BX][SI]
MOV,AX,[BX+SI]
若 (DS)=3000H,(BX)=1200H,(SI)=4100H
(35300H)=1234H,指令执行后 AX=?
MOV DL,[BX+SI] ; (DL)=34H
AX=1234H
物理地址 =3000H× 16+1200H+4100H=35300H
基址变址 寻址方式同样适用于数组表格处理,
首地址放在基址寄存器中而用变址寄存器来访 问数组中的各个元素。
MOV AX,ES:[BX][SI]
物理地址 =16× (DS)+ (BX)+(SI/DI)+8位或 16位偏移量
=16× (SS)+(BP)+(SI/DI)+8位或 16位偏移量
③ 相对基址变址寻址操作数的有效地址 EA是一个基地址寄存器内容和一个变址寄存器的内容和 8位偏移量相加之和,
若 (SS)=3000H,(BP)=1000H,(DI)=2000H,
COUNT=2100H,(35100) =1234H,指令执行后
AX=?
MOV AX,CONUT[BP][DI]
MOV AX,[COUNT+BP+DI]
MOV AX,COUNT [BP+DI]
物理地址 =3000H× 16+1000H+2000H+2100H
=35100H
AX=1234H
相对基址变址寻址方式为堆栈处理提供了方便。一般 BP可指向栈顶,从栈顶到数组首地址可用偏移量来表示。变址寄存器可用来访问数组。
4.8086/8088的指令系统数据传送指令算术运算指令逻辑运算指令串操作指令控制转移指令控制转移指令处理器控制指令功能数据操作类指令
① 最基本的传送指令
MOV 指令是形式最简单,用量最多的指令。它可以实现 CPU内部寄存器之间的数据传送。寄存器和内存之间的数据传送,还可以把一个立即数送给 CPU的内部寄存器和内存单元。
( 1) 数据传送指令
MOV 目的操作数,源操作数
MOV AL,BL; BL→ AL
MOV ES,DX; DX→ ES
MOV AX,[BX]; [BX] → AL,[BX+1] → AH
MOV [DI],AX; AL→ [DI],AH→ [DI+1]
MOV CX,[1000H]; [1000H] → CL,; [1001H] → CH
MOV BL,40H; 40H→ BL
MOV DX,5040H ; (DX)=5040H,; (DH)=50H,(DL)=40H
MOV WORD PTR[SI],6070;6070 → [SI]
写一个字而不是一个字节,不能明确表示数据类型要加前缀。
PUSH 源操作数将十六位源操作数入栈,目的地址是栈顶,即由 SP指示的字单元。
8086/8088的堆栈结构规定栈底地址大于栈顶,
即随着数据的压入,栈指针 SP的内容减少,SP
的内容减少,SP指向栈顶,而栈顶是刚存入的数据单元。栈的宽度为两个字节。
② 堆栈操作指令
a.(SP) ← (SP)-2;
b.将源操作数送到由 SS和 SP确定的存储单元。
PUSH BX; BX 内容压入堆栈,(SP)=SP-2
PUSH DS ;DS内容压入堆栈,(SP)=SP-2
POP 目的操作数 ;
将 SP所指的栈顶单元的一个地址弹出送至目的操作数且 (SP)=(SP)+2
POP AX ;将栈顶数据字弹出,送到寄存器 AX.;(SP)=(SP)+2
POP ES ; 将栈顶数据字弹出,送到寄存器 ES.; (SP)=(SP)+2
注,POP指令目的操作数不能是 CS,IP,否则程序就乱了!形成新的代码段 !
堆栈内容是 先进后出 的,可以利用该特点进行数据交换 !
将源操作数和目的操作数的内容相互交换。
实现字节交换,也可以实现字交换,交换过程可以在 CPU内部之间进行,可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间进行,段寄存器也不能作为操作数。
③ 交换指令 XCHG
XCHG [2531H],[2532H];不合法
XCHG DS,CS ;不合法
XCHG BX,CX; (BX) (CX)
XCHG AL,BL; (AL) (BL)
XCHG [2530H],CX;[2530H]和 [2531H]两单;元内容与 CX交换将 AX,BX寄存器内容相互交换方法一,XCHG AX,BX
方法二,MOV DX,AX
MOV AX,BX
MOV BX,DX
方法三,PUSH AX
PUSH BX
POP AX
POP BX
④ 输入 /输出数据传送指令输入输出指令用来完成累加器( AX/AL)
与 I/O端口之间的数据传送功能。执行输入指令时,
CPU可以从一个 8位端口读入一个字节到 AL中,也可以从两个连续的 8位端口读一个字到 AX中,通常,16位端口地址设置在偶数地址上,若采用 16位端口地址 必须用 DX寄存器做间接寻址。
执行输出指令时,CPU可以将 AL中的一个字节写到一个 8位端口中或者将 AX中的一个字写到两个连续的 8位端口中。
IN AL,50H; 50H端口 → AL
IN AX,70H; 70H端口 → AL,71H端口 → AH
IN AL,DX; DX 端口 → AL
IN AX,DX; DX端口 → AL DX+1端口 → AH
OUT 44H,AL; (AL) → 44H端口
OUT 80H,AX; (AH) → 81H端口,(AL) → 80H 端口
OUT DX,AX; (AL) → DX端口,(AH) → DX+1端口如果指令中使用一个立即数,只可寻址前面的 256个端口,如果在 DX寄存器指定一个端口,
则可访问所有 65536个端口。
⑤ 换码指令 (XLAT)
将 BX中的内容与 AL中的内容相加,作为有效地址 EA,并在一个表格中找出该单元的内容,将其放入 AL中,通常 BX存放表格的起始地址。
注意,由于 AL寄存器只有 8位,所以表格的长度不能超过 256
⑥ 目标地址传送指令用来传送操作数的段地址或偏移地址,共包含 3
条指令。
取有效地址指令 LEA
将存储器地址送到一个寄存器,源操作数必须是内存单元地址。
LEA AX,[2728H]
LEA BX,[BP+SI]
LEA SP,[0482H]
把 4个字节的地址指针 (段地址和偏移量 )传送到两个目的寄存器,其中,地址指针之后两个字节即段地址一定送到 DS中。
将地址指针装到 ES和另一个寄存器的指令 LES
将地址指针装到 DS和一个寄存器的指令 LDS
LDS DI,[2130H]
LES SI,[ 2500H]
⑦ 标志传送指令
a,读取标志传送指令 LAHF
执行时,标志寄存器中的低 8位 → AH
b,设置标志指令 SAHF
执行时,AH→ FR中的低 8位用于子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
c,标志寄存器的压入堆栈指令和弹出堆栈指令
PUSHF (FR) → 栈顶 SP-2 FR 不变
POPF 栈顶 → (FR) SP+2 FR 变
①,算术运算类指令加减乘除,有 \无符号,以及 BCD码。
( 2) 数据操作类指令
i.不带进位位的加法指令 ADD
源+目 → 目,影响标志位
ADD AX,2345H;(AX)+2345H →AX
ADD AL,50H; (AL)+50H → AL
a.加法指令
ADD [2000H],[3000H];
ADD DI,SI; (DI)+(SI) →DI
ADD [2000H],BX; [2000H]+BX →[2000H]
ADD CX,[5000H]; (CX)+[5000H] →CX
不合法,操作数不能同为存储器,目的操作数不能是立即数。
影响标志位 CF,OF,SF,PF,ZF,AF
CF无符号溢出,OF有符号数的溢出。
b.带 进位位的加法指令 ADC
源 +目 +CF → 目,影响标志位
ADC指令执行时,CF和操作数一起相加
ADC AX,SI; (AX)+(SI)+CF → AX
一般用在多字节数的相加中,将低字节的进位传送到高字节加法中去。
例,两个四字节数分别存放在 1200H和 1400H开始的存储单元中,低位在前,高位在后求两数之和并将结果放在 1200H开始的单元中。
MOV AX,[SI]
ADD AX,[DI]
MOV [SI],AX
MOV AX,[SI+2]
ADC AX,[DI+2]
MOV [SI+2],AX
CLC
MOV SI,1200H
MOV DI,1400H
注,目的操作数不能是立即数,不影响 CF
c,增量指令 INC
目 +1 → 目 ;影响 CF以外的标志位
INC AL
INC CX
INC BYTE PTR[BX+DI+500H];
[BX+DI+500H]+1→ [BX+DI+500H]
② 减法指令
ⅰ 不带借位的减法指令 SUB
目 - 源 → 目,影响标志位
SUB BX,CX ;BX- (CX) → BX
SUB AX,1200H ;(AX) - 1200H→ AX
目的操不能是立即数,影响标志位
OF=1有溢出,CF=1有借位。
ⅱ 带借位的减法指令 SBB
目 - 源 -CF → 目 影响标志位 用于多字节减法指令
ⅲ 减量指令 DEC
目 -1 → 目,不影响 CF
DEC BX; (BX-1) → BX
ⅳ 取补指令 NEG
操作数取补码,结果送回,
操作数补码 =0-操作数,NEG是减法指令。
NEG 目 ;不能是立即数
NEG AL;( AL)求补 → AL
NEG CX;( CX)求补 → CX
注,执行时,CF=1;操作数为 0则 CF=0
(AL)=01011111B;
NEG AL;
则 (AL)=10100001B
CF=1,OF=0,SF=1,ZF=0
ⅴ 比较指令 CMP
执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位目 - 源 ≯ 目 设置标志位注,比较两个数的大小,目的操作数不能是立即数有符号时目 ﹥ 源 ZF=0且 SF=OF
目 ≥源 SF=OF或 ZF=1
目 =源 ZF=1
目 ≤源 ZF=1或 SF≠OF
目 <源 SF≠OF
无符号时目 ﹥ 源 CF=0且 ZF=0
目 ≥源 CF=0或 ZF=1
目 =源 ZF=1
目 ≤源 CF=1或 ZF=1
目 <源 CF=1且 ZF=0
CMP AX,2000H;
CMP AL,50H;
CMP AX,[BX+DI+100]
CMP DX,DI
一般其后跟一条转移指令,用来检查标志位的状态是否满足了某种关系 。
③,乘法指令 MUL,IMUL
完成 8/16位二进制的相乘功能,双操作数指令,只指定一个操作数,另一个操作数是隐含的。 被乘数 一般含在 AL/AX中,乘数可以是 8/16位通用寄存器或存储器操作数。积按高位与低位两部分分别存放到 AH与 AL或
DX与 AX中,也就是说,8位乘法,16位积的高 8位存放于 AH中,低 8位存放于 AL中,16位数相乘其 32位积,高
16位存放于 DX中,低 16位存于 AX中。
若运算结果高位字节或高位字有效(即 AH≠0 或
DX ≠0)则将 CF和 OF两标志位同时置 1。
MUL [BX+2AH]
(AL)=12H,源操作数 =66H,则积 =070CH → AX
AH≠0,CF=1,OF=1
有符号乘法 IMUL,高位放的是符号扩展
④ 除法指令 包括 DIV IDIV
被除数整合在 AX或 DX\AX中,余数始终与被除数同号,商是向 0靠拢的。
除数是 8位,则被除数是 16位除数是 16位,则被除数是 32位不过扩展时,有符号数与符号位以同扩展。
01110000B 0000000001110000B
11110000B 1111111111110000B
CBW CWD 字扩展
DIV 商是 AL( AX) 余数 AH (DX)
(AX)=0123H (BL)=12H
DIV BL;(AL)=10H,(AH)=03H
字节相除时,最大商 +127,最小负数 -127( 81H)
字相除时,最大商 +32767( 07FFFH)最小负数
-32767( 8001H)
如果除数 0或商超出累加器的范围,则产生除法错误提示。
⑤ 十进制调整指令
ⅰ DAA
DAA是十进制数( BCD码)加法指令,它通常跟在 ADD和 ADC指令之后使用,只能对 AL中的运算结果进行 BCD码调整。
例,ADD AL,BL
DAA ;对 AL调整
MOV CL,AL ;将 AL 暂存到 CL
MOV AL,AH
ADC AL,BH ;做高位加法
DAA
MOV AH,AL ;存高位结果
MOV AL,CL ; 恢复低位结果
( 2),逻辑运算指令和移位指令
①,逻辑运算指令 AND OR XOR NOT TEST
AND OR XOR TEST 都是双操作数指令,
可对 8位或 16位操作数。 NOT不影响标志位,其余四个指令将使 CF或 OF为 0,AF位无定义而
SF,ZF,PF则根据运算结果设置。
AND 目,源该指令用于截取(或屏蔽)若干位二进制数例 屏蔽 4,7位,其他位不变。
MOV AL,0FFH
AND AL,6FH
则指令执行后( AL) =6FH
用 AND指令可以使操作数的某些位被屏蔽,
只要把 AND指令的源操作数设置成一个立即数。
屏蔽位置为 0,其余为 1。执行后相应位就可清零,其他位不变。
该指令可用于组合成某个字,或将某位置 1。
OR 目,源源操作数为立即数,需要置 1的位设为 1,其它位为 0.
例 置第 7为 1,其他位不变。
MOV AL,52H
OR AL,80H
若 (AL)=11111111H NOT AL
则 (AL)=000000000H
NOT 目 按位取反
XOR 目,源该指令可用于对某个二进制位取反,或对某个寄存器清 0.
源操作数为立即数,需要取反位置 1,其余位置 0,就可以达到目的,
MOV AL,11H
XOR AL,80H ; (AL)=91H
最高位变反,其余不变用于检测两个数是否相等
XOR AX,1234; (Ax)=1234
JZ NEXT
TEST 目,源
TEST指令和 AND指令执行同样操作,但 TEST
指令不送回结果,仅仅影响标志位,目不变,
常用于判断(测试)寄存器中数的某位是,0”,
还是,1”。
TEST AX,8000H ; (AX)中最高位为 1时,; ZF=0,否则 ZF=1
TEST AL,01H ; (AL)中最低位为 1时,; ZF=0,否则 ZF=1
要测试某位是否为,1”,则先把操作数取反,然后再测试。如 AL中第四位是否为 1,为 1则转移 NEXT。
MOV AL,35H
TEST AL,51H ;(AL)=35H,ZF=0,所需测试位不全 0
MOV DL,AL
NOT DL
TEST DL,00010000H
JZ NEXT
若 (AL)=33H 则 ZF=1 说明 4位为 1,从而转向 NEXT
② 移位指令非循环移位指令循环移位指令
SHL 逻辑左移
SAL 算术左移
SHR 逻辑右移
SAR 算术右移
ROL 循环左移
ROR 循环右移
RCL 带进位循环左移
RCR 带进位循环右移移位次数可以是 1或 CL,为 1时二进制数各个数位只移一位。如需要移位的次数大于 1,必须将移位次数送 CL寄存器,再执行移位指令
a,SHL 目,1或 CL (无)
SAL 目,1或 CL (有)
每移位一次,在后面补,0”,而最高位进入标志位 CF。
* 左移一次相当于乘以 2
MOV AL,00010011B
SHL AL,1 ; (AL)= 00100110B
MOV CL,3
MOV AH,00001110B
SHL AH,CL ; ( AH) =01110000B,; ( CL) =03H
左移位后,最高位和 CF不同则 OF=1,对有符号,可知移位后的符号与移位前的符号不同的,若相同,则 OF=0,前后符号没变。
b,SHR 目,1或 CL(无)
SAR 目,1或 CL(有) 每移动一位,最高位补 0,移出的位进 CF
最高位保持不变右移一次,相当于除于 2
若需要带符号的数乘以(或除以 2)的整数次幂,
可用算术移位若需要无符号的数乘以(或除以 2)的整数次幂,
可用逻辑移位
MOV CL,5
SHR AL,CL; 相当于 (AL)=(AL)/32
c.ROR/ROL 目,1或 CL 不带进位目的操作数每左 /右移一次,移出位以左 /右端进入 CF标志位,同时还循环移入之后操作数中,即移位后的操作数不丢失。
MOV CL,4 ROR AL,CL
(AL)=01001000B; → 10000100B
d,RCL/RCR
循环左移指令( RCL)和循环右移( RCR)是带进位的循环。移动指令可将 8位,16位通用寄存器或存储器连同进位标志位 CF一起循环左移 /右移 1~255
位,
例,CF =1,(AL)=01010000B;
MOV CL,2;
RCL AL,CL;
CF=1,(AL)=50H,CL=9
(AL)=01000010B,CF=1
CF=1,(AL)=50H
MOV CL,9;
RCL AL,CL;
移位指令,可以是 8位或 16位二进制,执行结果影响 CF标志;
当移位次数为 1且移动后最高有效位的值发生变化时,OF位置 1,否则 OF=0;
左移 1位相当于将操作数乘 2,右移 1位,相当于将操作数除 2,乘除法需要时间长。移动指令速度快 。
例 将 AL中的数乘以 10
SAL AL,1
MOV BL,AL
MOV CL,2
SAL AL,CL
ADD AL,BL
转移指令,调用指令,返回指令,CPU 控制。
① 转移指令
a,无条件转移指令:无条件转移到指令指定的地址,必须指定目的地址绝对转移:指令中直接给出目标地址
-128~+127,相对于本条指令下一条指令(参数)地址转移的距离
JMP
段间转移 FAR
段内相对转移 SHORT
段内转移 NEAR
默认
(3),控制转移指令
ⅰ 段间转移 用于一个源程序中的代码段不只一个的情况直接远转移 JMP FAR PTR OPR
OPR所在段的段内偏移地址 → ( IP)
OPR所在段的段地址 → ( CS)
( EA) → ( IP),(EA+2) → (CS)
EA由 OPR寻址方式定,除立即数及寄存器方式之外的任何存储器寻址方式。
段间间接转移 JMP DWORD PTR OPR
ⅱ 段内转移段内直接短转移 JMP SHORT OPR ;
(IP) + 8位偏移量 → IP
相对转移 - 128 ~ +127
三要素
① 参考点
② 方向(向上负,向下正)
③ 距离直接转移 (默认)
JMP OPR JMP AA
JMP AA MOV AL,35H


AA:MOV AL,35H AA
段内间接转移(绝对转移)
JMP WORD PTR OPR
( EA) → ( IP)
EA由 OPR寻址方式定,除立即数以外的任何寻址方式
b.条件转移指令条件转移指令根据上一条指令所设置的条件标志位码来判别测试,满足测试条件,则转移。不满足条件则顺序执行。
条件转移指令完成的都是短距离相对转移。超过此距离必须采用二级跳。
对于无符号数和有符号数,条件转移指令前面一般是 SUB或 CMP。
② 循环控制指令
LOOP 用 CX作为计数器,先使 CX自动减 1,
若减 1后不为 0,则转移到目标地址,否则顺序执行下去。
如果进入 LOOP指令时,CX寄存器为 0,则
LOOP执行最大限度次数( 65536次)有时是程序员故意设计的,有时不慎发生。
如果不希望在 CX=0时发生循环,可在 LOOP
之前加 JCXZ的指令
a.LOOP OPR ;
( CX) - 1 → CX 若 CX≠0则循环
b,LOOPZ/LOOPE OPR
测试条件( CX) ≠0且 ZF =1
c,LOOPNZ/LOOPNE OPR
测试条件 ( CX) ≠0且 ZF=0
③ 子程序调用返回指令
a,CALL 调用指令
ⅰ 段内直接调用先将 CALL指令下一条指令的地址(即返回地址)
压入堆栈。 SP的内容减 2修改指向新的栈顶,再将子程序所在段的偏移地址送入 IP,则转执行
CALL OPR ; 在汇编过程中 OPR为子过程名。
ⅱ 段内间接调用,类似段内间接转移
ⅲ 段间直接调用先将返回地址 (段地址和偏移地址 )压入堆栈,SP内容减 4修改,指向新栈顶,再将子过程所在段的偏移地址和段地址送 IP和 CS,则转去执行子过程;
CALL OPR
段间间接调用,类似段间间接转移。
b,RET 返回指令必须放在子过程末尾,并且当前的栈顶单元内容是返回地址。
ⅰ 段内返回 RET
RET指令的操作是返回地址送 IP寄存器,即返回到调用程序处继续执行。 SP的内容加 2修改指向新的栈顶。
ⅱ 段内带立即数返回如果当前栈顶单元内容不是返回地址,返回地址在较高地址区,则上一级返回需要用带立即数返回指令,操作是栈顶单元的返回地址送 IP,SP
加 2加 EXP修改。
RET EXP,EXP 是一个表达式,根据它的值计算出来的常数表示栈顶到返回地址所在单元之间的距离。
ⅲ 段间返回返回地址出栈送 IP或 CS寄存器,并且 SP的内容加 4
修改以指向所在的栈顶。
RET
段间带立即数返回
RET EXP
③ 中断调用返回指令
INT 中断指令
INT TYPE
中断类型号
0~255
将 IF,TF 清 0,不影响其余的标志位。
先将标志寄存器,CS和 IP寄存器内容依次压入堆栈,SP内容减 6修改,再将( type*4)单元内容送 IP寄存器,(TYPE*4+2)单元内容送 CS寄存器,
即转入中断处理程序。
INTO 当测试到 OF=1则产生中断。执行的操作数类似 INT指令溢出中断类型号式 04H.溢出中断的终端处理程序一般只有一条 IRET指令。
IRET 将栈顶单元内容依次弹入 IP,CS和标志寄存器。 SP的内容加 6修改。该指令的标志位由堆栈中取出的值来设置,IRET指令必须放在中断处理程序的末尾。
设置 CX
设置源串首址 (SI),目的串首地址 DI
设置方向 (DF)
串操作指令就是用一条指令实现对一串字符或数据的操作。
三要素特点,P50
(4).串操作指令
① 串 传送指令
MOVSB/MOVSW
DS内 SI取一个字节 /字 → ES内 DI中根据 DF对
SI/DI进行加 /减,以指向下一个字节目 >源 DF=1 减目 <源 DF=0 增两操作数均在存储单元中
MOVS ES,BYTE PTR [DI],DS,[SI]
MOVS ES,WORD PTR[DI],DS,[SI]
MOVSB
MOVSW
② REP MOVSB/REP MOVSW
REP 是无条件重复前缀:执行一次 (CX) -1 → CX,
直到 (CX)=0为止。
执行该指令前,应该先做好以下准备
REP具体执行过程
a.如 (CX)=0则退出 REP,否则 b;
b,(CX) - 1 → CX ;
c,执行 MOVS ;
d,重复 a~c。
执行该指令前,应该先做好以下准备
a,DS源首 (末 ) → SI
b,ES目首 (末 ) → DI
c,长度 → CX
d,建立 DF
CLD ; DF=0 自动增
STD ; DF=1 自动减例:自 1000H 地址开始有一个字符串,串长 36H个字节,编程将该串传送到 1200H地址开始的存储器中
MOV SI,1000H
MOV DI,1200H
MOV CX,36H
CLD
REP MOVSB;无条件重复执行,直到 (CX)=0
② 串 比较指令
a,CMPSB/CMPSW
取 DS中源串的一个字节 /字,与 ES中的目的串一个字节 /字相减,不回送结果,只根据结果设置标志位,并修改串地址指针,指向一个字节 /字单元。
CMPS ES,BYTE PTR [DI],DS:[SI] = CMPSB
CMPS ES:WORD PTR [DI],DS:[SI] = CMPSW
REPE/REPZ— CMPSB/CMPSW
执行操作,a,(CX)=0或 ZF=0 (不等 ) 时退出,否则 b;
b,(CX)-1→(CX),不影响 ZF;
c,执行其后 CMPS,影响 ZF;
d,重复 a~ c。
例:自 1000H和 1200H地址开始的两个字符串,串长为 35字节,编程比较两串是否相同,若相同,则
( AL)=7FH;若不同( AL) =80H。
MOV SI,1000H
MOV DI,1200H
CLD
MOV CX,35H
REPZ CMPSB
JZ EXIT
MOV AL,80H
JMP END1
EXIT,MOV AL,7FH
END1,HLT
a,SCASB/SCASW
字符串搜索指令,关键字放在 AL/AX中,操作时
AL/AX中的关键字减去 DI所指向附加串的目的串的一个数据,不保留结果,只根据结果设置标志位,
并修改 DI的内容,指向下一个字节 /字单元。
③ 串扫描指令
SCAS ES:BYTE PTR [DI]= SCASB
SCAS ES:WORD PTR [DI]= SCASW
b,REPNE/REPNZ SCASB/SCASW
不相等 /不为零重复串操作
REPNE SCASB
REPNE SCASW
执行操作,a,CX=0或 ZF=1(相等)退出,否则 b;
b.( CX) -1→CX ;
c,执行 SCAS;
d,重复 a~ c。
MOV DI,1000H;
MOV AL,‘ #’
MOV CX,32H
CLD
REPNE SCASB
JZ EXIT
例 自 1000H地址开始有一个 50个字节长的字符串,
编程查找其中是否有‘ #’字符地址送 BX寄存器,
若没有‘ #’字符,则将 8000H送 BX
MOV BX,8000H
JMP END2
EXIT,DEC DI
MOV BX,DI
END2,HLT
a.LODSB/LODSW
用来将数据段中源串的 SI所指向的存储单元的一个字节 /字取到 AL/AX寄存器中,修改 SI的内容,
指向下一个字节 /字单元。该指令不加重复前缀,
不影响标志位
④ 取串指令和存串指令
b.STOSB/STOSW
存字符串指令时将 AL/AX中的一个字节 /字,存入到由 DI所指向的目的串的存储单元,并修改 SI
内容,指向下一个字节 /字单元。该指令一般不加重复前缀,不影响标志位,目的串在附加段。
例,将存储器中一个 50字节的非零组中的正负数分开,数组存放的首地址是 1000H,存放正负数的首地址分别是 2000H和 3000H
CLD
MOV SI,1000H
MOV DI,2000H
MOV BX,3000H
MOV CX,32H
LOOP1:LODSB
TEST AL,80H
JNZ LL
STOSB
JMP LR
LL,XCHG BX,DI
STOSB
XCHG BX,DI
LR,DEC CX
JNZ LOOP1
HLT
① 标志处理指令存 CF,DF,IF进行设置或清除,并且不影响其它标志位。 P135
② 其它处理指令
a,NOP 无操作指令该指令不执行任何操作,其机选码占有一个字节单元。代码为 0000H
( 5)处理器控制指令
b,HLT 停指令该指令可使机选暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束科继续执行下面的程序。
c.WAIT 等待指令该指令使处理机处于空转状态,它是可以用来等待外部中断发生,但中断结束后仍返回 WAIT指令继续等待
d.ESC 高权指令
e.LOCK 封锁指令