[IT认证]第三章指令系统和寻址方式1.ppt

上传人:音乐台 文档编号:1995483 上传时间:2019-01-29 格式:PPT 页数:174 大小:17.82MB
返回 下载 相关 举报
[IT认证]第三章指令系统和寻址方式1.ppt_第1页
第1页 / 共174页
[IT认证]第三章指令系统和寻址方式1.ppt_第2页
第2页 / 共174页
[IT认证]第三章指令系统和寻址方式1.ppt_第3页
第3页 / 共174页
亲,该文档总共174页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[IT认证]第三章指令系统和寻址方式1.ppt》由会员分享,可在线阅读,更多相关《[IT认证]第三章指令系统和寻址方式1.ppt(174页珍藏版)》请在三一文库上搜索。

1、第3章 指令系统和寻址方式,3.1 8086/8088CPU的概述及寻址方式 3.2 8086/8088CPU的指令系统,3.1 指令系统的概述及寻址方式,一条指令需要指出两部分内容:,1、要进行什么操作(由操作码指出),2、指令所涉及的操作数和操作结果存放的位置,3.1 指令系统的概述,指令组成:,操作码和操作数(地址码)两部分构成,操作码:表示该指令所要完成的操作,操作数:表示该指令的操作对象,指令中可以直接给出所使用的操作数本身, 或者只给出操作数所在的寄存器编号、存储器或 I/O端口的地址或地址的信息。,数据寻址,指令中关于如何计算操作数有效地址的方法 称为寻址方式。计算机中按照指令给

2、出的寻址方式 求出操作数的有效地址和存取操作数的过程称为寻址 操作,指令地址寻址,数据寻址-获取操作数的存放地址及操作结果 的存放地址,确定下一条指令的地址的方法,数据寻址有以下三种:,1.立即寻址方式 2.寄存器寻址方式 3.存储器寻址方式(5种),1.立即寻址方式,指令中直接给出操作数,例如:,MOV CL,05 ;(CL)=05 MOV AX,1234H ;(AX)=1234H,MOV AL,PORT1 MOV AL,10010011B AND 0FEH,格式:操作码 数字表达式,说明:1)立即数可为8位,可为16位; 2)只能为整数 3)只能做源操作数 4)不能用于单操作数,2.寄存器

3、寻址方式,操作数在CPU内部的某个寄存器中,指令中只给出寄存器名,例如:,MOV AX,BX ;将BX内容传送到AX中,格式: 操作码 寄存器名,MOV AL,BL ;将BL内容传送到AL中,1)16位寄存器为AX,BX,CX,DX,SI,DI,SP,BP; 2)8位寄存器为AH,AL,BH,BL,CH,CL,DH,DL; 3)源操作数,目的操作数都(同时)可以使用 寄存器寻址,说明:,例:,MOV SS,AX,指令执行前(AX)=3064H (SS)=1234H,指令执行后(SS)=3064H (AX)保持不变,3.存储器寻址方式,1)直接寻址方式,操作数在存储器中,存储单元的地址由 指令直

4、接给出,格式:操作码 地址表达式或地址表达式或数字表达式,例:MOV AL,TABLE MOV AL,TABLE MOV AL,1000H,TABLE 是在数据段定义的一个字节数组的首地址标号 (变量名),其偏移地址为1000H,例如:,MOV AX,1000H,指令执行前:(DS)=3000H, (31000)=12H, (31001)=34H,3412H,指令执行后:(AX)=?,默认的段寄存器位DS,如果不是DS,则需要 用前缀说明,说明:,MOV AX,ES:1000H,将ES段中1000H和1001H两个单元的内容送到BX中,MOV AX,1000H,基址寄存器:BX,BP;变址寄存

5、器:SI,DI,操作数在存储器中,存储单元的有效地址在寄存器中。,2)寄存器间接寻址方式,格式:操作码 基址寄存器名或者变址寄存器名,例:MOV AX,BX MOV AX,SI,例如:,MOV AX,BX,假设指令执行前: (DS)=3000H, (BX)=1010H, (31010)=12H (31011)=24H,2412H,指令执行后:(AX)=?,若指令中指定的寄存器是BX,SI,DI,则操作数 默认在数据段中,即在DS中为段基址; 若指令中指出寄存器为BP,则操作数默认在堆栈段, 即在SS中为段基址,说明:,1)以SI,DI,BX为寄存器间接寻址,默认段寄存器为DS,如使用其它段寄存

6、器需要加前缀说明,MOV AX,ES:BX,2)以BP为寄存器间接寻址,默认段寄存器为SS,如使用其它段寄存器需要加前缀说明,MOV AX,ES:BP,3)寄存器相对寻址方式,操作数在存储器中,存储单元的有效地址是寄存器 的值与一个整数之和。,格式: 操作码 变量名基址寄存器名或者变址寄存器名 操作码 变量名+基址寄存器名或者变址寄存器名 操作码 符号名基址寄存器名或者变址寄存器名 操作码 变量名+基址寄存器名或者变址寄存器名 操作码 数字表达式基址寄存器名或者变址寄存器名,例:,TABLE 是在数据段定义的一个字节数组的 首地址标号(也成变量名)则: MOV SI, 5 MOV AL, TA

7、BLESI 或者 MOV AL,TABLE+SI,若指令中指定的寄存器是BX,SI,DI,则操作数 默认在数据段中,即在DS中为段基址; 若指令中指出寄存器为BP,则操作数默认在附加 数据段中,即在ES中为段基址,说明:,4)基址变址寻址方式,MOV AX,BXSI或MOV AX,BX+SI,操作数的偏移地址是两个指定寄存器之和,格式: 操作码 基址寄存器名变址寄存器名 操作码基址寄存器名+变址寄存器名,例:MOV AX,BXSI,用途:,5)相对基址变址寻址方式,操作数偏移地址在指定寄存器的值和相对 偏移量之和,格式: 操作码 变量名基址寄存器名变址寄存器名 操作码 变量名+基址寄存器名+变

8、址寄存器名 -,MOV AX,MASKBXSI或 MOV AX,MASKBX+SI或 MOV AX,MASK+BX+SI,例:MOV AX,MASKBXDI,若指令中指定的基址寄存器是BX,则操作数 默认在数据段中,即在DS中为段基址; 若指令中指定的基址寄存器为BP,则操作数默认在 附加数据段中,即在ES中为段基址,说明:,用途:,小结,综观8086/8088寻址方式,其操作数有三种类型:,立即操作数 寄存器操作数 存储器操作数,指令寻址有以下四种:,1.段内直接寻址 2.段间寻址方式 3.段内间接寻址 4.段间间接寻址,确定下一条要执行指令的地址的方法,1.段内直接寻址,格式:,指令名 S

9、HORT 转移目标地址标号 指令名 转移目标地址标号 指令名 NEAR PTR转移目标地址标号,JMP SHORT NEXT,这种指令只改变IP寄存器的值,而不改变CS的值,位移量,指令,IP寄存器,IP寄存器,段内寻址示意图,2.段间直接寻址,格式:,指令名 FAR PTR 转移目标地址标号 指令名 段地址:段内偏移量,JMP FAR PTR NEXT1,这种指令不仅改变IP寄存器的值,而且改变CS的值,地址,指令,段间寻址示意图,段地址,IP寄存器,CS寄存器,3.段内间接寻址,格式:,指令名 16寄存寄名 指令名 WORD PTR 存储器寻址方式,JMP WORD PTR TABLEBX

10、,这种指令只改变IP寄存器的值,而不改变CS的值,寄存器编号,指令,段内间接寻址示意图,IP寄存器,转移目标地址 的偏移地址,16位寄存器,存储器寻址方式,指令,IP寄存器,转移目标地址 的偏移地址,存储器,计算物理地址,4.段间间接寻址,格式:,指令名 DWORD PTR 存储器寻址方式,JMP DWORD PTR TABLEBX,这种指令不仅改变IP寄存器的值,而且改变CS的值,段间间接寻址示意图,3.2 8086/8088CPU的指令系统,3.2.1 数据传送指令 3.2.2 算术运算指令 3.2.3 逻辑运算和移位指令 3.2.4 串操作指令 3.2.5 控制转移指令 3.2.6 处理

11、器控制指令,3.2.1 数据传送指令,通用传送指令 累加器传送指令 地址传送指令 标志传送指令,1.通用传送指令,1)最基本的传送指令MOV,格式: MOV 目的操作数 源操作数,功能:将源操作数存入目的操作数的寄存器或存储单元,例:MOV AX,BX MOV AX,1010H,说明:,1、目的操作数不能是立即数 2、不能在两个内存单元之间直接传送数据 3、不能将立即操作数送给段寄存器 4、段寄存器之间不能相互传送数据 5、CS,IP,PSW不能作为目的操作数,但可以作为 源操作数 6、源操作数和目的操作数字长必须相等 7、MOV指令不影响标志位,1. MOV MEM2,MEM1,修改为: M

12、OV AX,MEM1 MOV MEM2,AX,2. MOV DS,2000H,修改为: MOV AX,2000H MOV DS,AX,3. MOV ES,DS,修改为: MOV AX,DS MOV ES,AX,例题:,2)数据进栈指令PUSH和出栈指令POP,堆栈是一段内存区域,可以用于保护中间数据、 运算结果或某些寄存器的值,需要时可以从堆栈中 将数据取出来。,堆栈按照先进后出的原则来保存数据,微机一般把内存的一段区间作为堆栈使用,即 堆栈段SS。段内物理地址由SS和SP决定,SP始终指 向栈顶。对于数据的的保存和恢复需要有由堆栈指 令来完成,格式:PUSH 操作数 POP 操作数,假设(S

13、S)=9000H, 堆栈段位64KB (SP)=0E200H,则: 整个堆栈段的物理地址 范围为:90000H9FFFFH,堆栈物理地址为:9E200H,举例:,PUSH AX ;将AX内容压入堆栈,PUSH BX ;将堆顶内容弹出到BX,(1),(2),说明:,1、8086的堆栈操作总是按字进行的; 2、每推入一个字,SP减2,一个字的高字节放 在堆栈的较高地址,低字节放在较低地址;弹 出一个字,SP加2; 3、堆栈的内容按先进后出的原则; 4、不能使用立即寻址方式; 5、PUSH和POP指令不影响标志位; 6、CS可以压入堆栈,但栈中的值出断点的之 外 不能弹入到CS,3)标志进栈指令PU

14、SHF和出栈指令POPF,将16位堆栈数据压入或弹出到标志寄存器(PSW)中,设置TF=1则:,PUSHF POP AX OR AH,01H PUSH AX POPF,4)数据交换指令XCHG,格式: XCHG 目的操作数,源操作数,功能: 实现源和目的操作数的存放位置,说明:,1、目的操作数和源操作数不能为立即数或段寄存器,并且不能同时为内存单元; 2、CS和IP不能为交换指令的源或目的操作数; 3、目的和源操作数的取值范围应相同,即同为8位 或同为16位;,XCHG BL,DL XCHG AX,SI XCHG DI,AL,XCHG BX,DI XCHG DS,AX,例题:,2.累加器专用指

15、令,1)累加器输入/输出指令IN,OUT,输入指令用于CPU从外设端口接收数据,输出指令用于CPU从外设端口发送数据,端口:,端口:CPU与外设之间通过接口进行数据交换,一个端口 通常对应接口中的一个或一组寄存器。每个8位端口有一个地址,叫端口号,两个相邻的8位端口可以组成一个16位地址,端口数:外部设备最多可以有65536个(64KB)个 由A0A16译码形成,端口号:即外部设备端口地址,为0000FFFFH。,PC机仅使用A0A9译码形成I/O端口地址,即1024H个 端口地址,因此端口号范围为0000H03FFFH 。 其中:A9=1表示扩充槽上的端口地址,8086利用地址纵向的低16位

16、对8位I/O端口的寻址号,1)直接累加器输入/输出指令IN,OUT,格式: IN 累加器,端口号 OUT 端口号,累加器,端口号中前256个端口(0FFH),可以使用直接的输入/输出指令:指令中提供端口号,例如:IN AL,50H IN AX,70H OUT 44H,AL OUT 80H,AX,2)间接累加器输入/输出指令IN,OUT,格式: IN 累加器,DX OUT DX,累加器,所有的端口号(0FFFFH),都可以使用间接的输入 /输出指令:执行这些指令之前,已经将端口号送 入到DX中,例如:IN AL,DX IN AX,DX OUT DX,AL OUT DX,AX,注: 端口号256时

17、只能 使用间接输入输出指令,3)XLAT换码指令,使累加器的一个值转换为内存表格中对应的某一个值。,换码指令用于编码制的转换,格式: XLAT或XLAT 地址标号,功能: (AL)(BX)+(AL),使用该指令前,内存的表首地址赋给BX,AL中存放 表格某一项与表格首地址的位移量,执行BX+AL,得 到该表格中的一个地址,再将此地址所对应单元中的 值送到AL中。,AL为8位无符号数,表格最多为256个代码,例题:十进制数字09的7段显示码表,例:求5对应的显示码,MOV AL,5 MOV BX,OFFSET DISP_TABLE XLAT或者 XLAT DISP_TABLE,结果(AL)=12

18、H,3)XLAT换码指令,格式: XCHG 目的操作数,源操作数,功能: 实现源和目的操作数的存放位置,3.地址传送指令,1)LEA偏移地址送寄存器指令(Load Effective Address),格式: LEA 16位寄存器名,存储器寻址方式,功能: 将源操作数的地址送到一个寄存器中,例如:LEA AX,2782H LEA BX,BP+SI LEA SP,0482H,MOV AX,2782H,(2782H)=02H,2)LDS(Load Pointer into register and DS)指针送指定寄存器和DS寄存器指令,格式: LEA 16位寄存器名,存储器寻址方式,功能: 将寻

19、址到的存储单元的第一个源操作数 (字)送16位寄存器,第二个源操作数送DS寄存器,例如:LDS DI,2140H,(DI)=0201H (DS)=0605H,3)LES(Load pointer into register and ES)指针送指定寄存器和ES寄存器指令,格式: LEA 16位寄存器名,存储器寻址方式,功能: 将寻址到的存储单元的第一个与源操作数(字)送16位寄存器,第二个源操作数送ES寄存器,例如:LES DI,2140H,三类地址传送指令中16位寄存器不包括段寄存器,说明:,例如:LES DI,2140H,(DI)=0201H (ES)=0605H,4.标志传送指令,读取标

20、志位,对标志位进行设置:,1)读取标志指令LAHF 2)设置标志指令SAHF,格式: LAHF 或SAHF,功能: 将标志寄存器中的低8位传送给AH; 将AH值传送给标志寄存器,3.2.2 算术运算指令,无符号数和有符号数是否能使用同一套加、减、乘、除指令? 无符号数和有符号数使用同一套加、减,要求参与运算的两个数必须同为无符号数或同为有符号数;另外,要用不同的方法判断运算结果是否溢出。采用什么方法?,结论:,1.无符号数和有符号数加法、减法可以使用同一 套指令系统;无符号数有符号数乘法、除法不 可以使用同一套指令系统;,2.参与运算的必须同是无符号数和有符号数;,3.溢出判断: 无符号数运算

21、产生溢出时CF=1; 有符号数运算产生溢出时:OF=1,4.无符号数运算产生溢出会设置进位位,对于多字节 运算,要利用到进位;有符号数运算产生溢出则表示 出现错误,3.2.2 算术运算指令,1.加法指令,格式: ADD 目的操作数,源操作数 ADC 目的操作数,源操作数 INC 操作数,以上三条指令都可作字节或字操作运算,除INC指令 不影响标志位CF外,其他标志位都受指令结果的影响,PSW中最主要的是ZF,SF,CF,OF四位,ADC用于多字节的减法指令中,ADD AL,50H ADD CX,1000H ADD BC+DI,AX ADD AX,BX+2000H,ADC AX,SI ADD D

22、X,SI ADC BX,2000H ADC AL,5,例:,设两个四字节数(DX,CX)=12345678H, (BX,AX)=9ABCDEF0H,ADD CX,AX ADC DX,BX,例:利用ADC指令实现多字节加法,MOV SI,2000H MOV AX,SI MOV DI,3000H ADD AX,DI MOV SI,AX MOX AX,SI+2 ADC AX,DI+2 MOV SI+2,AX MOV AX,0000H ADC AX,0000H MOV SI+4,AX,2.减法指令,格式: SUB 目的操作数,源操作数 SBB 目的操作数,源操作数 DEC 操作数 NEG 求补指令,求

23、补指令,即各位取反后末位加1,结果送回操作数 通常CF=1,SBB用于多字节的减法指令中,SUB BX,CX SUB BP+2,CL SUB AL,20 SUB WORD PTRDI,1000H,SBB AX,2030H SUB WORD PTRDI+2,1000H,DEC AX DEC AL,3.比较指令,格式: CMP 目的操作数,源操作数,结果不送回,两操作数保持原值,但影响标志位不保存结果,例如:CMP AX,2000H CMP AL,50H CMP AX,BX+DI+100 CMP DX,DI,标志位的状态判断比较结果:,1.ZF=1,则两个操作数相等,2.对于两个无符号数,CF=0

24、,则OPRD1OPRD2; CF=1,则OPRD1OPRD2,3.对于两个有符号数 两数同为正或同为负时,则如果SF=0, 则OPRD1OPRD2;SF=1,则OPRD1OPRD2,4.乘法指令,格式: MUL 源操作数 (无符号数) 若为字节操作(AX) (AL) 源操作数; 若为字操作(DX),(AX) (AX) 源操作数,格式: IMUL 源操作数(有符号数),IMUL/MUL BL IMUL/MUL CX IMUL/MUL BYTE PTRDI IMUL/MUL WORD PTRDI,注意:1)不允许使用立即数为操作数 2)乘法指令只影响CF,OF,若MUL执行后高 字节部分为0,则C

25、F=OF=0,否则CF=OF=1,若 IMUL执行后高字节是低字节部分的扩展,则 CF=OF=0,否则CF=OF=1,5.除法指令,除数为被除数的一般长; 被除数放在AX中或AX,DX中; 被除数为16位时,8位商放在AL中,8位余数在AH; 被除数为32位时,16商放在AX中,16位余数在DX 8086规定余数的符号与被除数相同 AF,CF,OF,PF,ZF,SF不确定 当被除数不够除数的2倍时,应对被除数进行扩展,格式: DIV 源操作数 (无符号数) 若为字节操作(AL) (AX) /源操作数的商, (AH) (AX) /源操作数的余数; 若为字操作(AX) (DX),(AX) /源操作

26、数的商, (DX) (DX),(AX) /源操作数的余数,格式: IDIV 源操作数(有符号数),DIV CL,5.符号扩展指令,例除数为一8位数,被除数位于AL中的值为11000011,则将其扩展为11111111 11000011,其高八位置于AH中,对于无符号数的除法,被除数的扩展是将 AH或DX清0 对于有符号数的除法,被除数的扩展是将 AH或DX进行低位字节或低位字的符号扩展,格式: CBW,字节转化为字(将AL中的值扩展到AX值),格式: CBD,字转化为双字(将AX中的值扩展到DX,AX值),3.2.3 逻辑运算和移位指令,逻辑运算指令,移位指令,TEST与AND指令执行的操作相

27、同,但不改变原操作数的值,也不送回结果,只是根据结果设置相应的标志位。TEST指令一般用来检测测试位是“1”还是“0”,1.逻辑运算指令,NOT指令不影响标志位,其它指令会使CF和OF清零, AF不定,并根据一般规则设置SF,ZF,PF,逻辑指令功能:,逻辑指令主要用于根据源操作数中数据位的 组合格式有选择的使目的操作数某些位改变, 清零或对它进行测试 TEST指令后面可能跟一条JNZ或JZ指令, 从而根据Z结果判断进行转移,1)AND逻辑与运算指令,格式: AND 目的操作数,源操作数,例如: AND AL,00001111B,功能: 用来完成使某一个操作数清0,而保留其 它位不变,即将需清

28、0的位与“0”相与,要保留的 位与“1”相与,2)OR逻辑或运算指令,格式: OR 目的操作数,源操作数,例如: OR AL,1000000B,功能: 用来完成使一个操作数的某些位为1,而保留其它位不变,即将需置1的位与“1”相或,要保留的位与“0”相或,3)XOR异或指令,格式: XOR 目的操作数,源操作数,例如: XOR AL, AL,实现: 完成使某一操作数的某些位取反,而保留其余位不变。即将要取反的威位与“1”异或,保留的位与“0”异或,4)TEST测试指令,格式: TSET 目的操作数,源操作数,实现: 两个操作数实行与运算,但测试结果不保存,用来检测某一位或几位的条件是否满足,,

29、5)NOT逻辑非,格式: NOT 目的操作数,注意: 目的操作数不能是立即数,功能举例:,在这些应用中,源操作数称为掩码,这种操作称为 屏蔽操作,例1:(1)对源操作数01101101的第0、2、4位置0,0110 1101,AND 1110 1010,MOV AL,01101101 AND AL,11101010,例2:(1)对源操作数01101101的第0、1、5位置1,0110 1101,OR 0010 0011,MOV AL,01101101 AND AL,00100011,例3:将寄存器AL内容清0,0110 1101,XOR 0110 1101,例4:检测AL的低0位的值?,TES

30、T AL,00000001 JNZ AA,0110 1101,TEST 0000 0001,结果为0(ZF=1),则检测位为0 结果不为o(ZF1),则检测为为1,思考题:1.将英文小写字母转化为大写字母 2.判断A单元中数据的奇偶性,例:将英文小写字母转化为大写字母,大写英文字母ASCII为:“A”Z”41H-5AH,小写英文字母ASCII为:“a”z”61H-7AH,41H: 0100 0001,61H: 0110 0001,MOV AL,A ADD AL,20H,MOV AL, a AND AL,0DFH,DFH: 1101 0001,例:判断A单元中数据的奇偶性,2.移位指令,Righ

31、t),(1) 非循环移位指令,0100 1111,SAL 100 11110,例如:,SAL DX,1,MOV CL,4 SAL A,CL SAL AL,CL,SAL A,3 (无效的) SAL AL,BL (无效的),说明:,操作数可以是寄存器或内存单元中的8位或16位操作数 逻辑移位指令把操作数看成无符号数 算术运算指令把操作数看成有符号数 SAL和SHL操作相同,以0填充最低位 SAR和SHR的操作不同,SAR最高位保持不变(符号位), SHR以0填充 对于移位指令,只有移位次数为1时,OF才有意义, 移位后如果CF和最高有效位不同则OF=1,否则为0 如果移位次数大于1,必须用CL寄存

32、器预先指定移位 次数,左移n位与乘以2n等效,可以使用SHL/SAL指令,例如:,622=00000110B100B=00011000B,同样,右移n位与除以2n等效。如果是无符号数,则右移使用SHR,如果是有符号数则右移使用SAR,使用移位指令编辑乘除运算,其执行指令时间比乘除指令快5-6倍,例如:将(AL)乘以10,SAL AL,1 MOV BL,AL MOV CL,2 SAL AL,CL ADD AL,BL,AL21+AL23,(2) 循环移位指令,操作数可以是寄存器或内存单元中的8位或16位 操作数 ROL和ROR不含CF循环移位指令,8位操作数移动8位 后还原 RCLRCR含CF循环

33、移位指令,8位操作数移动9次后 还原 对于循环移位指令,只有移位次数为1时,OF才有意 义,移位后如果CF和最高位不同,则OF=1,否则为0 如果移位次数大于1,必须用CL寄存器预先指定 移位次数,说明:,例如:将位于1000H单元中的2位非组合BCD码-转换成组合BCD码,MOV CL,4 MOV SI,1000H MOV AX,WORD PTRSI SHL AL,CL (ROL AL,CL) SHR AX,CL (ROR AX,CL) MOV SI,AL,SHR AH,CL SHL AX,CL,3.2.4 串操作指令,用一条指令实现对一个字符串或一个字串进行操作。,(1) 字符串送指令(M

34、OVSB/MOVSW),格式: MOVSB MOVSW MOVS 目的操作数,源操作数,实现: 将SI所指向的源串中的一个字节或字传送到DI所指向的目的串中。 (DS:SI)(ES:DI),注意:自动修改SI,DI的地址,以指向下一个或两个单元重复操作,MOVS ES:BYTE PTRDI,DS:SI,1、可以通过重复前缀(REP)来实现串操作,2、串可以是字串或字节串,3、以SI作为源操作数的指针寄存器,默认段为DS段, 以DI作为目的操作数的指针寄存器,默认为ES段。,4、串操作地址的修改和FLAG的DF位有关,DF=0时, SI和DI增量变化;DF=1时,SI和DI减量变化,对于 字节串

35、操作SI、DI每次变化量为1,对于字串操作 SI、DI每次变化量为2,例如:,将数据段1000H开始的100个字节传送到扩展段 2000H开始的单元,MOV DI,SI INC SI INC DI,(CX)(CX)-1 当CX=0时退出MOVSB,计数器CX存放传送的字节数或字数 带重复前缀REP,则每次传送一次CX自动减1,直到CX为0 SI、DI分别为源和目的寄存器 方向标志位DF=0,SI、DI自动减量,否则自动增量 不影响标志位,使用指令前的初始化工作说明:,格式: LODSB LODSW LODS 目的操作数,源操作数,实现:若字节 AL(DS):(SI) 若字 AX(DS):(SI

36、),(2) 取字符串指令(LODSB/LODSW),若字节 (SI) (SI)1(DF=0用“+”) 若字 (SI) (SI)2 (DF=0用“+”),不用重复前缀REP,程序举例:将0700H单元开始的5个字节的内容逐一取出,进行处理,处理之后再送回到0700H的内存区域,CLD MOV SI,0700H MOV DI,SI MOV CX,5 LT: LODSB PUSH CX - POP CX DEC CX MOV DI,AL JNZ LI,格式: STOSB STOSW STOS 目的操作数,(3) 存字符串指令(STOSB/SOTSW),实现:若字节 (ES):(DI) AL 若字 (

37、ES):(DI) AX,可用重复前缀REP,使一串内存单元填充相同的数,LEA DI,BUFF MOV CX,100 CLD MOV AL,00H REP STOSB,例:对附加段中BUFF开始的100个连续的内存 单元进行清0操作,(4) 字符串比较指令(CMPSB/CMPSW),格式: CMPSB (字节比较指令) CMPSW (字比较指令) CMPS 源操操作数寻址,目的操作数寻址,实现: 将SI所指向的源串中的一个字节或字与DI所指向的目的串中的一个字节或一个字相减,但不保存结果,只是根据结果设置标志位。(DS:SI)-(ES:DI),带重复前缀REPE/REPZ CX0且比较字节相等

38、(ZF=1)时,继续比较 带重复前缀REPNE/REPNZ CX0且比较字节不相等(ZF=0)时,继续比较,通过重复前缀REPE/REPZ或REPNE/REPNZ实现两个字 符串中寻找第一个不等的元素或第一个相等的元素,程序举例:,比较STR1和STR2开头的两个字符串,两个字符串完全相同,则将AL置1,否则置0.字符串长度为3,LEA DI,STR1 LEA SI,STR2 CLD MOV CX,3 REPZ CMPSB JZ MATCH AND AL,0 HLT MATCH:MOV AL,1 HLT,(5) 字符串检索指令(SCASB/SCASW),格式: SCASB (字节比较指令) S

39、CASW (字比较指令) SCAS 目的操作数,AL(AX)-ES:DI,根据相减结果置标志位,带重复前缀REPE/REPZ CX0且与AL(AX)内容相等(ZF=1)时,继续检索 带重复前缀REPNE/REPNZ CX0且与AL(AX)的内容不相等(ZF=0)时,继续检索,通过重复前缀REPE/REPZ或REPNE/REPNZ寻找第一个 与AL(AX)不同或相同的单元,程序举例:试检索AL中字符在STRING字符串中的位置,将该位置记录在BX寄存器中,如果没有检索到则BX置为-1,STRING字符串长度为4,LEA DI,STRING CLD MOV CX,4 MOV BX,CX REPNZ

40、 SCASB JZ FND MOV BX, FFFFH HLT FND:SUB BX,CX HLT,(AL)=c,3.2.5 控制转移指令,(1) 无条件转移指令,段内直接寻址 段内间接寻址 段间直接寻址 段间间接寻址,1.段内直接寻址,格式:,指令名 SHORT 转移目标地址标号 指令名 转移目标地址标号 指令名 NEAR PTR转移目标地址标号,JMP SHORT NEXT,这种指令只改变IP寄存器的值,而不改变CS的值,位移量,指令,IP寄存器,IP寄存器,段内寻址示意图,2.段间直接寻址,格式:,指令名 FAR PTR 转移目标地址标号 指令名 段地址:段内偏移量,JMP FAR PT

41、R NEXT1,这种指令不仅改变IP寄存器的值,而且改变CS的值,地址,指令,段间寻址示意图,段地址,IP寄存器,CS寄存器,4.段间间接寻址,格式:,指令名 DWORD PTR 存储器寻址方式,JMP DWORD PTR TABLEBX,这种指令不仅改变IP寄存器的值,而且改变CS的值,段间间接寻址示意图,段内直接寻址,指令中直接给出了转移的位移量,新IP值=当前的IP值+位移量,JMP 1000H,应用于无条件转移和有条件转移、调用转移,1040H 新IP,JMP 1000H,IP=1000H+ 指令字节数 +0020H,段内间接寻址,有效地址在寄存器或内存单元内,例如:JMP CX JM

42、P WORD PTR1000H JMPCX,寄存器编号,指令,段内间接寻址示意图,IP寄存器,转移目标地址 的偏移地址,16位寄存器,存储器寻址方式,指令,IP寄存器,转移目标地址 的偏移地址,存储器,计算物理地址,JMP CX,段间直接寻址,指令中给出了要转移的段地址和偏移量,转移 时段地址放在CS中,偏移量在IP,JMP B000H:0100H,JMP B000H:0100H,段间间接寻址,有效地址在两个连续的内存单元中,转移时将 这两个单元的内容送到CS和IP中,JMP DWORD PRT BX+SI,JMP DWORD PRT DI,JMP DWORD PRT SI 假设(SI)=20

43、00H,3.2.5 控制转移指令,(1) 无条件转移指令,例如: 段内直接转移: JMP 1000H (JMP NEAR/SHORT PTR 转移地址标号) 段内间接转移: JMP AX 段间直接转移: JMP 2500H:2100H (JMP FAR PTR 转移地址标号) 段间间接转移: JMP DWORD PTRDI,(2) 条件转移指令,满足指令要求的条件,则执行指定的目标,不满足 条件,则执行条件转移指令的下一条指令,判断条件:FLAG的CF,SF,OF,PF,ZF位或计数器CX值,说明:,条件转移指令只能段内直接寻址方式,而且转移 范围为指令所在位置的-128+127个单元,主要为

44、了 减少指令长度提高执行速度,大部分指令可以用两种助记符表示:JZ/JE,有符号数和无符号数比较的区别: 有符号数:大于,小于 无符号数:高于,小于,CMP AX,BX JG ABC - ABC:MOV R1,AX -,JC(或JNAE或JB) CF=1 有进位转移 JNC(JAE或JNB) CF=0 有进位转移,测试CX的值为0转移的指令,JCXZ 地址标号,若CX=0转移,在2000H开始的区域中,存放着14H个无符号数, 找出其中最大的一个数并存入2000H单元中,GATMAX: MOV BX,2000H MOV AL,BX MOV CX,13H P1: INC BX CMP AL,BX

45、 JAE P2 MOV AL,BX P2: DEC CX JNZ P1 MOV BX,2000H MOV BX,AL,测试CX的值为0转移的指令,JCXZ 地址标号,;若CX=0转移,可以安排在带条件重复前缀的串指令下面,判断 是否到串尾,若到串尾则结束,(3) 循环控制指令,三种循环控制指令,控制循环是否继续,以CX为计数器,只能使用段内直接转移,位移量只能是8位,LOOP LOOPZ/LOOPE LOOPNZ/LOOPNE,循环可用上面的两条指令实现,也可通过循环指令实现,LOOP 标号 ;CX0时循环,DEC CX JNZ 标号,相当于:,LOOP指令:,例子:,MOV CX, 0100

46、H KKK:LOOP KKK -,LOOPZ/LOOPE指令:,LOOPZ/LOOPE 标号 ; CX0且ZF=1时循环,说明:CX的值并不影响标志位ZF,ZF是否为1, 是由前面其它指令决定的,例:在40个元素组成的数组中寻找第一个非0元素,MOV CX,28H MOV SI,0FFFFH NEXT:INC SI CMP BYRE PTRSI,0 LOOPZ NEXT JNZ OKK ;找到 CALL DISPLAY1 ;未找到 RET OKK:CALL DISPLAY2 RET,LOOPNZ指令:,LOOPNZ 标号 ; CX0且ZF=0时循环,说明:CX的值并不影响标志位ZF,ZF是否为

47、0, 是由前面其它指令决定的,例:在40个元素组成的数组中寻找第一个0元素,MOV CX,28H MOV SI,0FFFFH NEXT:INC SI CMP BYRE PTRSI,0 LOOPNZ NEXT JNZ OKK ;未找到 CALL DISPLAY1 ;找到 RET OKK:CALL DISPLAY2 RET,(5) 处理器控制指令,标志位设置指令,CLC,STC,CMC,CLC清除进位位指令,将CF置0; STC置进位位指令,将CF置1 CMC进位位求反指令,如果CF为0,将其置1, 若CF为1则将其置0,CLD,STD,CLD方向标志位置0指令,将DF置0; STD方向标志位置1指令,将DF置1;,CLI,STI,CLI中断标志位置0指令,将IF置0; STI中断标志位置1指令,将IF置1;,其它处理器控制指令,NOP 无操作指令,HLT 停机指令,使CPU处于暂停状态,直到出现硬件中断或复位操作 时,CPU才会退出暂停状态,转去执行相应的中断处理 程序或复位操作,常与转移指令连用,不进行任何操作,等待3个机器 周期后才执行NOP之后的指令,可用作暂短的软件延时,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1