420 likes | 559 Views
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 时重复)
E N D
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时重复)
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个字节传 ;送到目的地址单元
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为目的串首地址。
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则转STOP DEC SI ;否则(SI)-1,指向不相单元 MOV BX, SI ;(BX)←不相等单元的地址 MOV AL, [SI] ;(AX)←不相等单元的内容 STOP: HLT ;停止
4.2.4 串操作指令 3、串扫描指令:SCASB/SCASW 执行操作:[(ES:DI)] -AL/AX DI DI±1(±2) 功能:从一个字串中查找一个与AL或 AX中不同的字符,或寻找一个相同的字符。 例:在一个目的串string中查找关键字‘A’,串长度为10。 LEA SI, STRING ;置目标串偏移地址 MOV CX, 10 ;置字符串长度 MOV AL, ‘A’;置关键字节 CLD ;置方向标志 REPNE SCASB ;搜索关键字节
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指出的内存单元中。
4.2.5 程序控制指令 • 无条件转移指令 • 条件转移指令 • 循环控制指令 • 过程调用和返回指令 • 中断调用和返回指令 * 不影响条件标志位
4.2.5 程序控制指令 1、无条件转移指令JMP(jumps) 本指令无条件转移到指定的内存地址,执行从该地址开始的程序段。无断点,无返回,无堆栈操作。 分为:段内转移(段内直接转移、段内间接转移) 段间转移(段间直接转移、段间间接转移) 段内转移是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。 段间转移则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。
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
4.2.5 程序控制指令 例1: JMP 2500H;转移到当前代码段的2500H 例2:MOV AX, BX JMP SHORT NEXT ;NEXT段内标号,短转移 AND CL, OF …… NEXT:OR CL, 7F 从AND指令到NEXT之间的距离就是相对位移量,JMP转移的地址IP=当前(IP)+位移量 跳转
4.2.5 程序控制指令 (2)段内间接转移指令 格式:JMP OPRD 功能:将指定的16位寄存器或存储器相邻两个单元的内容送给IP,然后转移到CS:IP指示的地址。 说明: * 可采用各种寻址方式 例: JMP BX ;(IP)←(BX) JMP WORD PTR [BX] ;将[BX]和[BX+1] ;两个单元的内容送入IP
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
B3000H B3001H B3002H B3003H 00H 20H 00H 80H CS IP 8000H 2000H 4.2.5 程序控制指令 (4)段间间接转移指令 格式:JMP OPRD 功能:将指定的32位存储器连续两个字作为地址,低字送入IP,高字送入CS,然后转移到CS:IP指示的地址。 说明: * 可采用各种寻址方式 例:设(DS)=0B000H,(BX)=2000H,(SI)=1000H JMP DWORD PTR [BX+SI]
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):低于
4.2.5 程序控制指令 (1)根据单个条件标志的设置情况转移: 格式 测试条件 JZ(JE)OPRD ZF=1 JNZ(JNE)OPRD ZF=0 JS OPRDSF=1 JNS OPRD SF=0 JOOPRD OF=1 JNOOPRD OF=0 JP(JPE)OPRD PF=1 JNP(JPO) OPRD PF=0 JC OPRD CF=1 JNC OPRD CF=0 * 适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况
4.2.5 程序控制指令 (2)比较两个无符号数,并根据比较结果转移: 格式 测试条件 功能 JB(JNAE) OPRD CF=1 A<B JNB(JAE) OPRD CF=0 A≥B JA(JNBE) OPRD CF=0且ZF=0 A>B JNA(JBE) OPRD CF=1或ZF=1 A≤B *适用于地址或双精度数低位字的比较
4.2.5 程序控制指令 (3)比较两个带符号数,并根据比较结果转移: 格式 测试条件 JL(JNGE) OPRD SFOF=1 A<B JNL(JGE)OPRD SFOF=0A≥B JG(JNLE) OPRD (SFOF)=0且ZF=0 A>B JNG(JLE) OPRD (SFOF)=1或ZF=1 A≤B * 适用于带符号数的比较 (4)测试CX的值为0则转移: 格式 测试条件 JCXZ OPRD (CX)=0
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则转移到标号处
4.2.5 程序控制指令 程序段: LEA SI, DATA ;(SI)←数据串首地址 MOV CX, 200 ;(CX)←串长度 CLD ;(DF)=0,地址按增量方向修改 LODSW ;AX [(DS:SI)] ,SI SI+2 MOV MAX, AX MOV MIN, AX DEC CX NEXT: LODSW CMP AX, MAX ;串比较,结果影响标志位 JG LARGER CMP AX, MIN JL SMALL JMP GOOD LARGER: MOV MAX, AX JMP GOOD SMALL: MOV MIN, AX GOOD: LOOP NEXT ; CX CX-1,若CX≠0则转移到标号处 HLT
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一般为要转移的目标地址的符号地址。
LOOP AGAIN DEC CX JNZ AGAIN 4.2.5 程序控制指令 执行步骤:(1)(CX)←(CX)-1 (2)检查是否满足测试条件,如满足则指令转到目标操作数指定的标号执行,否则退出循环。 注意: * CX中存放循环次数。 * 控制转移的目标地址是以当前IP的内容为中心的-128 ~ +127的范围内。 * 不影响标志位。
4.2.5 程序控制指令 例:统计BUFER起始地址的100个单元中负数的个数,将统计结果送NUM单元。 程序段: XOR BL, BL ;BL←0 LEA SI, BUFFER ;数据首地址 MOV CX, 100 ;数据长度 CLD ;地址按增量方向修改 NEXT:LODSB ; AL[(DS:SI)],SISI+1 TEST AL, 80H ;符号位=1? JZ GOOD ;AL的D7=0则转移 INC BL ;D7=1,负数计数器加1 GOOD:LOOP NEXT ;CX←CX-1,CX≠0继续 MOV NUM, BL
4.2.5 程序控制指令 例:在多重循环的程序结构中,CX计数器的保存和恢复 MOV CX, M AGAIN: …… PUSH CX MOV CX, N NEXT: …… LOOP NEXT …… POP CX LOOP AGAIN MOV DI, M AGAIN: …… MOV CX, N NEXT: …… LOOP NEXT …… DEC DI JNZ AGAIN
4.2.5 程序控制指令 4、子程序调用和返回指令 在编写程序过程中,将反复使用的模块独立出来编成子程序,主程序在需要的时候进行调用,执行完子程序又再返回到主程序继续执行。 调用指令:CALL 返回指令:RET • CALL指令分段内调用和段间调用: • 段内调用:子程序名中包含NEAR • 段间调用:子程序名中包含FAR • 以上两种调用可以直接寻址也可以间接寻址。
code1 segment main proc far …… call far ptr sub …… ret main endp code1 ends code segment main proc far …… call sub …… ret main endp code2 segment sub proc far …… ret sub endp code2 ends sub proc near …… ret sub endp code ends 4.2.5 程序控制指令 段内调用和返回 段间调用和返回
4.2.5 程序控制指令 (1)段内直接调用:CALL NEAR PROC 执行操作: * 返回地址入栈:(SP)←(SP)-2,((SP)+1,(SP))←(IP) *转子程序:(IP)←(IP)+16位位移量 例:假设CS=2000H,当前IP=000BH,SP=0100H,位移量为0043H CALL DISPL ;DISPL是一个地址标号 具体执行操作: * (SP)←(SP)-2 即SP=0010H-2=00FEH * 返回IP入栈 即(00FFH,00FEH)←(000BH+3) *转程序入口 偏移地址为:IP=(000BH+3)+0043H =0051H 跳转
4.2.5 程序控制指令 (2)段内间接调用:CALL OPRD 执行操作: * 返回地址入栈:(SP)←(SP)-2,((SP)+1,(SP))←(IP) * 转子程序:(IP)←(EA) 例:假设DS=1000H,BX=0200H,SI=0300H,(10500H)=3210H CALL BX CALL WORD PTR[BX+SI] 第一条指令入口偏移地址为:0200H 第二条指令入口偏移地址为:IP=(DS*16+BX+SI) =(10000H+0200H+0300H) =(10500H)=3210H
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)←子程序段地址
4.2.5 程序控制指令 例:假设CS=1000H,当前IP=205AH,SS=2500H,当前SP=0050H,标号NEXT所在单元的地址指针CS=3000H,IP=0500H CALL 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
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)=5200H CALL DWORD PTR [BX] 入口偏移地址为:IP=(DS*16+BX)=(10200H)=31F4H 入口段地址为:IP=(DS*16+BX+2)=(10202H)=5200H
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
MOV AH,4CH JZ EXIT 4.2.5 程序控制指令 实验四程序段: INPT: MOV AH,01H ; 从键盘接收一个输入数据 INT 21H CMP AL,51H ;与大写的Q比较 JZ EXIT ;结果为零退出程序 JNZ INPT ;结果不为零重新输入数据 …… EXIT: MOV AH,4CH INT 21H 符号地址 位移量 74 0013H 0015H 0034H 0035H 1F 75 …… B4 4C 返回
CALL DISPL EB 43 00 MOV AH,02 EB …… B4 02 …… C3 4.2.5 程序控制指令 实验三程序段: MOV SI, OFFSET DATA1 MOV BX,05 CALL DISPL ;调用显示子程序 CALL CRLF ;调用显示回车换行子程序 …… DISPL PROC NEAR ; 显示子程序 DSL: MOV AH,02 MOV DL,[SI+BX-1] INT 21H DEC BX JNZ DSL RET DISPL ENDP 位移量 符号地址 000BH 000EH 0051H 0052H 005BH RET 返回
4.2.5 程序控制指令 3、中断调用和返回指令 中断概念 计算机暂时中止正在运行的程序,转去处理一组专门的服务程序,完毕又返回到原被中止的程序继续执行,这样的过程称为中断。 外部中断也叫硬中断:主要用来处理外设和CPU之间的通迅。 内部中断也叫软中断:主要用来处理类似除数为零或中断指令所引起的中断。
类型0的(IP) 00000 类型0的(CS) 类型1的(IP) 00004 类型1的(CS) 类型N的(IP) 4*N 类型N的(CS) 类型255的(IP) 003FC 类型255的(CS) 4.2.5 程序控制指令 *8086/8088CPU有256个中断,中断编号从0到0FFH。 * 每个被使用中断都有对应的中断服务程序,程序的入口地址存放于中断向量表。 * 每个中断服务程序的入口地址占4个字节,256个共占1024个字节。 * 给定一个中断号,即可根据下式计算其对应服务程序入口地址在中断向量表中的偏移地址: 偏移地址=n×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
84H 85H 86H 87H 00 20 00 30 IP 2000H CS 3000H 4.2.5 程序控制指令 例:INT 21H ;DOS功能调用 操作结果:1)标志寄存器入栈, 2)清TF、IF 3)CS、IP入栈 4)计算中断向量存放地址: 21H 4= 84 H
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 • 注意:只影响本指令指定的标志
4.2.5 程序控制指令 其他处理机控制指令: HLT 处理器暂停指令 功能:执行该指令CPU处于暂停状态,不做任何操作,不影响标志位。在以下情况才能脱离暂停: ①在CPU的RESET线上有复位信号。 ②在NMI线上有非屏蔽请求信号。 ③在INTR线上有可屏蔽中断请求信号。 NOP 空操作指令 功能:该指令的执行不产生任何的结果,仅消耗3个时钟周期的时间,常用来延时。
4.2.5 程序控制指令 • WAIT 等待(等待外中断,之后仍继续等待) • ESC mem 换码( (mem) 数据总线 ) • LOCK 封锁(维持总线的锁存信号,直到其后的指令执行完) • 注意:不影响条件标志
作业 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
作业 4-3 (1)(3)(5) 4-4 (2)(4) 4-6 (1)(3)(5)(7) 4-7 4-8 4-9 4-15 4-20 4-21