4.2.4 串操作指令

42
4.2.4 串串串串串 串串串串串串 5 串 串串串 串串串 串串串 串串 、、、、 串串串串串串 1 SI 串串串串串串 串串串串 DS DI 串串串串串串串 串串串串 ES CX 串串 串串串2 串串串串串串 ), SI DI 串串串串DF=0 SI DI 串 1 串+2 ), DF=1 SI DI 串 1 串-2 )。 3 串串串串串串串串串串串 串串串串 * REP 串串串串串串 串串串串串串串串串串串串 串串 :(, CX 0 * REPE 串串串串串串 :( ZF 1 CX≠0 串串串* REPZ 串串串串串串串串 :( ZF 1 CX≠0 串串串* REPNZ 串串串串串串串 :( ZF 0 CX≠0 串串串* REPZ 串串串串串串串串串 :( ZF 0 CX≠0 串串串

Upload: chet

Post on 11-Jan-2016

65 views

Category:

Documents


4 download

DESCRIPTION

4.2.4 串操作指令. 串操作指令有 5 种 :传送、比较、扫描、装入、存储 串操作的特点 1 ) SI 寻址源操作数,段地址在 DS ; DI 寻址目的操作数,段地址在 ES ; CX 存放串长度。 2 )每次操作后, SI 、 DI 自动修改: DF=0 , SI 、 DI 加 1 或( +2 ), DF=1 , SI 、 DI 减 1 或( -2 )。 3 )通过重复前缀实现串操作. 重复前缀 * REP :无条件重复(重复执行指令规定的操作,直到 CX = 0 ) * REPE :相等时重复( ZF = 1 ,且 CX≠0 时重复) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 4.2.4  串操作指令

4.2.4 串操作指令

串操作指令有 5 种:传送、比较、扫描、装入、存储串操作的特点1 ) SI 寻址源操作数,段地址在 DS ; DI 寻址目的操作数,段地址在 ES ; CX 存放串长度。2 )每次操作后, SI 、 DI 自动修改: DF=0 , SI 、 DI 加 1 或( +2 ), DF=1 , SI 、 DI 减 1 或( -2 )。3 )通过重复前缀实现串操作重复前缀* REP :无条件重复(重复执行指令规定的操作,直到 CX = 0)* REPE :相等时重复( ZF = 1 ,且 CX≠0 时重复)* REPZ :结果为零时重复( ZF = 1 ,且 CX≠0 时重复)* REPNZ :不相等时重复( ZF = 0 ,且 CX≠0 时重复)* REPZ :结果不为零时重复( ZF = 0 ,且 CX≠0 时重复)

Page 2: 4.2.4  串操作指令

4.2.4 串操作指令

1 、串传送指令: MOVSB/MOVSW执行操作: [(ES:DI)] [(DS:SI)] SI SI±1(±2) , DI DI±1(±2)功能:在存储单元之间传送数据

例 : 将 100 个字节,从地址为 AR1 单元传送到地址为 AR2单元区。

LEA SI, AR1 ; SI 指向源串地址LEA DI, AR2 ; DI 指向目的串地址MOV CX, 100 ;置计数器CLD ;设置方向标志 REP MOVSB;将源地址的 100 个字节传

;送到目的地址单元

Page 3: 4.2.4  串操作指令

4.2.4 串操作指令

2 、串比较指令: CMPSB/CMPSW执行操作: [(ES:DI)] - [(DS:SI)] 结果影响标志位: AF 、 CF 、 OF 、 PF 、 SF ,ZF SI SI±1(±2) , DI DI±1(±2)功能:比较两个串是否相同例 : 比较两个字符串是否相同,并找出其中第一个不相等字符的地址,将该地址送 BX ,不相等的字符送 AL ,两个字符串的长度均 200 个字节, M1 为源串首地址, M2 为目的串首地址。

Page 4: 4.2.4  串操作指令

4.2.4 串操作指令

程序段:LEA SI, M1; (SI)← 源首地址LEA DI, M2 ; (DI)← 目的串首地址MOV CX, 200 ; (CX)← 串长度CLD ; (DF)=0 ,地址按增量方向修改

REPE CMPSB ;若相等,且 (CX)≠0 则重复比较

AND CX, 0FFH ;检查 (CX) 是否等于零JZ STOP ; (CX)=0 则转 STOPDEC SI ;否则 (SI)-1 ,指向不相单元MOV BX, SI ; (BX)← 不相等单元的地址 MOV AL, [SI] ; (AX)← 不相等单元的内容

STOP: HLT ;停止

Page 5: 4.2.4  串操作指令

4.2.4 串操作指令

例 : 在一个目的串 string 中查找关键字‘ A’ ,串长度为10 。

LEA SI, STRING ;置目标串偏移地址MOV CX, 10 ;置字符串长度MOV AL, ‘A’ ;置关键字节CLD ;置方向标志 REPNE SCASB ;搜索关键字节

3 、串扫描指令: SCASB/SCASW执行操作: [(ES:DI)] - AL/AX DI DI±1(±2)功能:从一个字串中查找一个与 AL 或 AX 中不同的字符,或寻找一个相同的字符。

Page 6: 4.2.4  串操作指令

4.2.4 串操作指令

4 、串装入指令: LODSB/LODSW执行操作: AL/AX [(DS:SI)] SI SI±1(±2)功能:将位于 DS 段由 SI 指出的内存单元的字节或字的内容取到 AL 或 AX 中。

5 、串存储指令: STOSB/STOSW执行操作: [(ES:DI)] AL/AX DI DI±1(±2)功能:将 AL 或 AX 中的字节或字的内容存入位于 ES 段由 DI 指出的内存单元中。

Page 7: 4.2.4  串操作指令

4.2.5 程序控制指令

无条件转移指令 条件转移指令 循环控制指令 过程调用和返回指令 中断调用和返回指令

* 不影响条件标志位

Page 8: 4.2.4  串操作指令

4.2.5 程序控制指令

1 、无条件转移指令 JMP ( jumps )本指令无条件转移到指定的内存地址,执行从该地址开始的程序段。无断点,无返回,无堆栈操作。分为:段内转移(段内直接转移、段内间接转移)

段间转移(段间直接转移、段间间接转移)

段内转移是指在同一段的范围之内进行转移,此时只需改变IP 寄存器的内容,即用新的转移目标地址代替原有的 IP 的值就可达到转移的目的。 段间转移则是要转到另一个段去执行程序,此时不仅要修改IP 寄存器的内容,还需要修改 CS 寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。

Page 9: 4.2.4  串操作指令

4.2.5 程序控制指令

( 1 )段内直接转移指令格式: JMP SHORT LABLE ;短转移, IP=IP+8 位位移量 JMP NEAR LABLE ;近转移, IP=IP+16 位位移量 JMP LABLE ; NEAR 可省略

说明说明 ::* LABLE 是一个标号,也称为符号地址,它表示转移的目标地址。* 位移量是汇编程序在汇编源程序时,根据目标地址与 JMP指令的下一条指令之间的距离自动生成的。 * 若位移量为 8 位,称为段内直接短转移,范围是 -128 ~ +127* 若位移量为 16 位,称为段内直接近转移,范围是 -32768 ~ +32767

Page 10: 4.2.4  串操作指令

4.2.5 程序控制指令

例例 11 : : JMP 2500H ;转移到当前代码段的 2500H

例例 2:2: MOV AX, BXJMP SHORT NEXT ; NEXT 段内标号,短转移AND CL, OF ……

NEXT:OR CL, 7F

从 AND 指令到 NEXT 之间的距离就是相对位移量, JMP 转移的地址 IP=当前 (IP)+ 位移量

跳转

Page 11: 4.2.4  串操作指令

4.2.5 程序控制指令

( 2 )段内间接转移指令格式: JMP OPRD功能:将指定的 16 位寄存器或存储器相邻两个单元的内容送给 IP ,然后转移到 CS:IP 指示的地址。说明说明 :: * 可采用各种寻址方式

例: 例: JMP BX ; (IP)←(BX) JMP WORD PTR [BX] ;将 [BX] 和 [BX+1]

;两个单元的内容送入 IP

Page 12: 4.2.4  串操作指令

4.2.5 程序控制指令

( 3 )段间直接转移指令格式: JMP FAR LABLE功能:将指令操作码后连续两个字作为立即数,用来修改 CS:IP 内容(低字送入 IP ,高字送入 CS ),然后转移到 CS:IP 指示的地址。

例: 例: JMP 8000H:1200H ; (IP)←1200H , (CS)←8000H JMP FAR PTR NEXT ;远程转移到 NEXT

Page 13: 4.2.4  串操作指令

4.2.5 程序控制指令

( 4 )段间间接转移指令格式: JMP OPRD功能:将指定的 32 位存储器连续两个字作为地址,低字送入 IP ,高字送入 CS ,然后转移到 CS:IP 指示的地址。说明说明 :: * 可采用各种寻址方式例:例:设 (DS)=0B000H , (BX)=2000H , (SI)=1000H JMP DWORD PTR [BX+SI]

8000HCS

B3000HB3001HB3002HB3003H

20H

00H

80H

00H

2000HIP

Page 14: 4.2.4  串操作指令

4.2.5 程序控制指令

2 、条件转移指令格式: JX OPRD功能: J 是转移, X 是转移的条件, OPRD 是短目标地址。当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。说明说明 :: * 状态标志( CF 、 PF 、 ZF 、 SF 和 OF )作为转移的条件* 所有条件转移指令都是直接寻址方式的短转移,即只能在以当前 IP 为中心的 -128 ~ +127字节范围内转移。提示提示 :: G ( Greater ):大于 L ( Less ):小于E ( Equal):等于 N ( No):不等于A ( Above):高于 B ( Below):低于

Page 15: 4.2.4  串操作指令

4.2.5 程序控制指令

( 1 )根据单个条件标志的设置情况转移:格式 测试条件     JZ(JE) OPRD ZF=1JNZ(JNE) OPRD ZF=0JS OPRD SF=1JNS OPRD SF=0JO OPRD OF=1JNO OPRD OF=0JP(JPE) OPRD PF=1JNP(JPO) OPRD PF=0JC OPRD CF=1JNC OPRD CF=0

* 适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况

Page 16: 4.2.4  串操作指令

4.2.5 程序控制指令

( 2 )比较两个无符号数,并根据比较结果转移:格式 测试条件 功能     JB(JNAE) OPRD CF=1 A<BJNB(JAE) OPRD CF=0 A≥B JA(JNBE) OPRD CF=0 且 ZF=0 A>B JNA(JBE) OPRD CF=1 或 ZF=1 A≤B

* 适用于地址或双精度数低位字的比较

Page 17: 4.2.4  串操作指令

4.2.5 程序控制指令

( 3 )比较两个带符号数,并根据比较结果转移:格式 测试条件JL(JNGE) OPRD SFOF=1 A<BJNL(JGE) OPRD SFOF=0 A≥BJG(JNLE) OPRD (SFOF)=0 且 ZF=0 A>BJNG(JLE) OPRD (SFOF)=1 或 ZF=1 A≤B* 适用于带符号数的比较

( 4 )测试 CX 的值为 0 则转移:格式 测试条件JCXZ OPRD (CX)=0

Page 18: 4.2.4  串操作指令

4.2.5 程序控制指令

例:例:在以 DATA 为首地址的内存中存放 200 个 16 位的带符号数,试找出其中最大和最小的符号数,分别存放在 MAX和 MIN 中。分析:可先取出表中一个数作为标准,分别存放在 MAX 和MIN 中,然后顺序取出其他的数分别与 MAX 和 MIN 进行比较,大于则取代 MAX ,小于则取代 MIN ,直到 200 个 16 位数都比较完。关键指令:用 CMP AX, MAX 和 CMP AX, MIN 有符号数条件转移指令 JG LABLE ;AX>MAX 则转移到标号处 JL LABLE ;AX<MIN 则转移到标号处

Page 19: 4.2.4  串操作指令

4.2.5 程序控制指令

程序段: LEA SI, DATA ;(SI)← 数据串首地址MOV CX, 200 ;(CX)← 串长度CLD ;(DF)=0 ,地址按增量方向修改 LODSW ;AX [(DS:SI)] , SI SI+2MOV MAX, AXMOV MIN, AXDEC CX

NEXT: LODSWCMP AX, MAX ;串比较,结果影响标志位JG LARGERCMP AX, MINJL SMALLJMP GOOD

LARGER: MOV MAX, AXJMP GOOD

SMALL: MOV MIN, AXGOOD: LOOP NEXT ; CX CX-1 ,若 CX≠0 则转移到标号处

HLT

Page 20: 4.2.4  串操作指令

4.2.5 程序控制指令

3 、循环控制指令( 1 ) LOOP 循环指令 格式: LOOP OPRD 测试条件:( CX )≠ 0( 2 ) LOOPZ/LOOPE ( Loop while zero or equal)当为零或相等时循环指令 格式: LOOPZ (或 LOOPE ) OPRD 测试条件:( CX )≠ 0 且 ZF=1( 3 ) LOOPNZ/LOOPNE ( Loop while nonzero, or not equal)当不为零或不相等时循环指令 格式: LOOPNZ (或 LOOPNE ) OPRD 测试条件:( CX )≠ 0 且 ZF=0

* OPRD 一般为要转移的目标地址的符号地址。

Page 21: 4.2.4  串操作指令

4.2.5 程序控制指令

执行步骤:( 1 ) (CX)←(CX) - 1 ( 2 )检查是否满足测试条件,如满足则指令转到目标操作数指定的标号执行,否则退出循环。

注意注意 :: * CX 中存放循环次数。* 控制转移的目标地址是以当前 IP 的内容为中心的 -128 ~ +127的范围内。* 不影响标志位。

DEC CX JNZ AGAIN

    LOOP AGAIN

Page 22: 4.2.4  串操作指令

4.2.5 程序控制指令

例:例:统计 BUFER起始地址的 100 个单元中负数的个数,将统计结果送 NUM 单元。程序段:

XOR BL, BL ;BL←0LEA SI, BUFFER ;数据首地址MOV CX, 100 ;数据长度CLD ;地址按增量方向修改

NEXT:LODSB ; AL[(DS:SI)] , SISI+1TEST AL, 80H ;符号位 =1?JZ GOOD ;AL 的 D7=0 则转移INC BL ;D7=1 ,负数计数器加 1

GOOD:LOOP NEXT;CX←CX-1 , CX≠0继续MOV NUM, BL

Page 23: 4.2.4  串操作指令

4.2.5 程序控制指令

例:例:在多重循环的程序结构中, CX 计数器的保存和恢复

MOV CX, M

AGAIN: …… PUSH CX MOV CX, NNEXT: …… LOOP NEXT …… POP CX LOOP AGAIN

MOV DI, M

AGAIN: …… MOV CX, NNEXT: …… LOOP NEXT …… DEC DI JNZ AGAIN

Page 24: 4.2.4  串操作指令

4.2.5 程序控制指令

在编写程序过程中,将反复使用的模块独立出来编成子程序,主程序在需要的时候进行调用,执行完子程序又再返回到主程序继续执行。调用指令: CALL返回指令: RET

CALL 指令分段内调用和段间调用:段内调用:子程序名中包含 NEAR段间调用:子程序名中包含 FAR以上两种调用可以直接寻址也可以间接寻址。

4 、子程序调用和返回指令

Page 25: 4.2.4  串操作指令

4.2.5 程序控制指令

段内调用和返回 段间调用和返回

code1 segment main proc far …… call far ptr sub …… ret main endpcode1 ends

code2 segment sub proc far …… ret sub endpcode2 ends

code segment

code ends

main proc far …… call sub …… retmain endp

sub proc near …… retsub endp

Page 26: 4.2.4  串操作指令

4.2.5 程序控制指令

( 1 )段内直接调用: CALL NEAR PROC

例:例:假设 CS=2000H ,当前 IP=000BH , SP=0100H ,位移量为 0043HCALL DISPL ; DISPL 是一个地址标号

执行操作:* 返回地址入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(IP)+16 位位移量

具体执行操作:* (SP)←(SP)-2 即 SP=0010H-2=00FEH* 返回 IP 入栈 即 (00FFH,00FEH)←(000BH+3)* 转程序入口 偏移地址为: IP=(000BH+3)+0043H

=0051H跳转

Page 27: 4.2.4  串操作指令

4.2.5 程序控制指令

( 2 )段内间接调用: CALL OPRD执行操作:* 返回地址入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(EA)

例:例:假设 DS=1000H , BX=0200H , SI=0300H , (10500H)=3210HCALL BXCALL WORD PTR[BX+SI]

第一条指令入口偏移地址为: 0200H第二条指令入口偏移地址为: IP=(DS*16+BX+SI) =(10000H+0200H+0300H) =(10500H)=3210H

Page 28: 4.2.4  串操作指令

4.2.5 程序控制指令

( 3 )段间直接调用: CALL FAR PROC执行操作:* 返回 CS 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(CS)* 返回 IP 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←子程序偏移地址 (CS)←子程序段地址

Page 29: 4.2.4  串操作指令

4.2.5 程序控制指令

例:例:假设 CS=1000H ,当前 IP=205AH , SS=2500H ,当前SP=0050H ,标号 NEXT所在单元的地址指针 CS=3000H , IP=0500HCALL FAR PTR NEXT

具体执行操作* (SP)←(SP)-2 即 SP=0050H-2=004EH* 返回 CS 入栈 即 CS=1000H 入栈* (SP)←(SP)-2 即 SP=004EH-2=004CH* 返回 IP 入栈 即 IP=205AH+5=205FH 入栈* 转程序入口 将 NEXT 的段地地址和偏移地址送 CS:IP

即 CS←3000H , IP← 0500H

Page 30: 4.2.4  串操作指令

4.2.5 程序控制指令

( 4 )段间间接调用: CALL OPRD执行操作:* 返回 CS 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(CS)* 返回 IP 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(EA) (CS)←(EA+2)

例:例:假设 DS=1000H , BX=0200H , (10200H)=31F4H , (10202H)=5200HCALL DWORD PTR [BX]

入口偏移地址为: IP=(DS*16+BX)=(10200H)=31F4H入口段地址为: IP=(DS*16+BX+2)=(10202H)=5200H

Page 31: 4.2.4  串操作指令

4.2.5 程序控制指令

( 5 )段内返回: RET执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2

段内带立即数返回: RET EXP

( 6 )段间返回: RET执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+2

段间带立即数返回: RET EXP

Page 32: 4.2.4  串操作指令

4.2.5 程序控制指令

75

实验四程序段:实验四程序段:INPT: MOV AH,01H ; 从键盘接收一个输入数据 INT 21H CMP AL,51H ;与大写的 Q比较 JZ EXIT ;结果为零退出程序 JNZ INPT ;结果不为零重新输入数据 ……EXIT: MOV AH,4CH INT 21H

0013H

0015H

0034H

0035H

B4

4C

……

1F

74JZ EXIT

MOV AH,4CH

符号地址

位移量

返回

Page 33: 4.2.4  串操作指令

4.2.5 程序控制指令

000BH

000EH

0051H

0052H

005BH

CALL DISPL

MOV AH,02

符号地址

RET

……

B4

02

00

43

……

EB

C3

EB

位移量实验三程序段:实验三程序段:MOV SI, OFFSET DATA1MOV BX,05CALL DISPL ;调用显示子程序CALL CRLF ;调用显示回车换行子程序……DISPL PROC NEAR ; 显示子程序DSL: MOV AH,02 MOV DL,[SI+BX-1] INT 21H DEC BX JNZ DSL RET DISPL ENDP 返回

Page 34: 4.2.4  串操作指令

4.2.5 程序控制指令

3 、中断调用和返回指令

中断概念

计算机暂时中止正在运行的程序,转去处理一组专门的服务程序,完毕又返回到原被中止的程序继续执行,这样的过程称为中断。

外部中断也叫硬中断:主要用来处理外设和 CPU之间的通迅。

内部中断也叫软中断:主要用来处理类似除数为零或中断指令所引起的中断。

Page 35: 4.2.4  串操作指令

4.2.5 程序控制指令

类型 0 的 (IP)

类型 0 的 (CS)

类型 1 的 (IP)

类型 1 的 (CS)

类型 N 的 (IP)

类型 N 的 (CS)

类型 255 的 (IP) 类型 255 的 (CS)

00000

00004

4*N

003FC

* 8086/8088CPU有 256 个中断,中断编号从 0 到 0FFH 。* 每个被使用中断都有对应的中断服务程序,程序的入口地址存放于中断向量表。* 每个中断服务程序的入口地址占 4个字节, 256 个共占 1024 个字节。* 给定一个中断号,即可根据下式计算其对应服务程序入口地址在中断向量表中的偏移地址: 偏移地址= n×4

Page 36: 4.2.4  串操作指令

4.2.5 程序控制指令

( 1 )中断指令 : INT n ; n=0~255 ①标志寄存器入栈; ②清标志位 TF 、 IF ; ③CS 、 IP 值入栈; ④计算中断向量地址: n 4

低地址单元→ IP 高地址单元→ CS( 2 )专用中断 : 除错误中断(类型 0 ),单步中断(类型 1 ),不可屏蔽中

断(类型 2 ),断点中断(类型 3 ),溢出中断(类型4 )

( 3 )中断返回 :IRET

Page 37: 4.2.4  串操作指令

4.2.5 程序控制指令

例:例: INT 21H ; DOS 功能调用操作结果: 1 )标志寄存器入栈, 2 )清 TF 、 IF

3 ) CS 、 IP 入栈 4 )计算中断向量存放地址: 21H 4= 84 H

84H

85H

86H

87H

IP 2000H

CS 3000H

00

20

00

30

Page 38: 4.2.4  串操作指令

4.2.5 程序控制指令

标志处理指令: CLC ( Clear carry ) CF←0 CMC ( Complement carry ) CF←CF STC ( Set carry ) CF←1

CLD ( Clear direction ) DF←0 STD ( Set direction ) DF←1

CLI ( Clear interrupt ) IF←0 STI ( Set interrupt ) IF←1

注意:只影响本指令指定的标志

Page 39: 4.2.4  串操作指令

4.2.5 程序控制指令

其他处理机控制指令: HLT 处理器暂停指令功能:执行该指令 CPU处于暂停状态,不做任何操作,不影响标志位。在以下情况才能脱离暂停:①在 CPU 的 RESET线上有复位信号。②在 NMI线上有非屏蔽请求信号。③在 INTR线上有可屏蔽中断请求信号。NOP 空操作指令功能:该指令的执行不产生任何的结果,仅消耗 3 个时钟周期的时间,常用来延时。

Page 40: 4.2.4  串操作指令

4.2.5 程序控制指令

WAIT 等待 ( 等待外中断,之后仍继续等待 )ESC mem 换码 ( (mem) 数据总线 )LOCK 封锁 ( 维持总线的锁存信号,直到其后的指令执行完 )

注意 : 不影响条件标志

Page 41: 4.2.4  串操作指令

作业

4-0 判断下列指令对错,并指出错误原因。(1) INC [SI](2) MOV AX,BL(3) MOV 2,AX(4) MOV AX,[DX](5) MOV AX,[BX+BP](6) MOV AX,[SI+DI](7) MOV AH,300(8) MOV [SI],[DI](9) PUSH AL(10) POP DH(11) MOV CS,AX(12) MOV SS,AX(13) SHL AX,3

4-1 (1)(3)(5)(7)4-2

Page 42: 4.2.4  串操作指令

作业

4-3 (1)(3)(5)4-4 (2)(4)4-6 (1)(3)(5)(7)4-74-84-94-154-204-21