《[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)=05MOV AX,1234H;(AX)=1234H,MOV AL,PORT1MOV AL,10010011B AND 0FEH,格式:操作码 数字表达式,说明:1)立即数可为8位,可为16位;2)只能为整数 3)只能做源操作数 4)不能用于单操作数,2.寄存器寻址方式,操作数在CPU
3、内部的某个寄存器中,指令中只给出寄存器名,例如:,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;变址寄存器:SI,DI,操作数在存储器中,存储单元的有效
5、地址在寄存器中。,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,如使用其它段寄存器需要加前缀说明,MOV AX,ES:BX,2)以BP为寄存器
6、间接寻址,默认段寄存器为SS,如使用其它段寄存器需要加前缀说明,MOV AX,ES:BP,3)寄存器相对寻址方式,操作数在存储器中,存储单元的有效地址是寄存器的值与一个整数之和。,格式:操作码 变量名基址寄存器名或者变址寄存器名 操作码 变量名+基址寄存器名或者变址寄存器名 操作码 符号名基址寄存器名或者变址寄存器名 操作码 变量名+基址寄存器名或者变址寄存器名操作码 数字表达式基址寄存器名或者变址寄存器名,例:,TABLE 是在数据段定义的一个字节数组的首地址标号(也成变量名)则:MOV SI,5 MOV AL,TABLESI或者 MOV AL,TABLE+SI,若指令中指定的寄存器是BX,
7、SI,DI,则操作数默认在数据段中,即在DS中为段基址;若指令中指出寄存器为BP,则操作数默认在附加数据段中,即在ES中为段基址,说明:,4)基址变址寻址方式,MOV AX,BXSI或MOV AX,BX+SI,操作数的偏移地址是两个指定寄存器之和,格式:操作码 基址寄存器名变址寄存器名 操作码基址寄存器名+变址寄存器名,例:MOV AX,BXSI,用途:,5)相对基址变址寻址方式,操作数偏移地址在指定寄存器的值和相对偏移量之和,格式:操作码 变量名基址寄存器名变址寄存器名 操作码 变量名+基址寄存器名+变址寄存器名-,MOV AX,MASKBXSI或MOV AX,MASKBX+SI或MOV A
8、X,MASK+BX+SI,例:MOV AX,MASKBXDI,若指令中指定的基址寄存器是BX,则操作数默认在数据段中,即在DS中为段基址;若指令中指定的基址寄存器为BP,则操作数默认在附加数据段中,即在ES中为段基址,说明:,用途:,小结,综观8086/8088寻址方式,其操作数有三种类型:,立即操作数寄存器操作数存储器操作数,指令寻址有以下四种:,1.段内直接寻址2.段间寻址方式3.段内间接寻址4.段间间接寻址,确定下一条要执行指令的地址的方法,1.段内直接寻址,格式:,指令名 SHORT 转移目标地址标号指令名 转移目标地址标号指令名 NEAR PTR转移目标地址标号,JMP SHORT
9、NEXT,这种指令只改变IP寄存器的值,而不改变CS的值,位移量,指令,IP寄存器,IP寄存器,段内寻址示意图,2.段间直接寻址,格式:,指令名 FAR PTR 转移目标地址标号指令名 段地址:段内偏移量,JMP FAR PTR NEXT1,这种指令不仅改变IP寄存器的值,而且改变CS的值,地址,指令,段间寻址示意图,段地址,IP寄存器,CS寄存器,3.段内间接寻址,格式:,指令名 16寄存寄名指令名 WORD PTR 存储器寻址方式,JMP WORD PTR TABLEBX,这种指令只改变IP寄存器的值,而不改变CS的值,寄存器编号,指令,段内间接寻址示意图,IP寄存器,转移目标地址的偏移地
10、址,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 处理器控制指令,3.2.1 数据传送指令,通用传送指令累加器传送指令地址传送指令标志传送指令,1.通用传送指令,1)最基本的传送指令MOV
11、,格式:MOV 目的操作数 源操作数,功能:将源操作数存入目的操作数的寄存器或存储单元,例:MOV AX,BX MOV AX,1010H,说明:,1、目的操作数不能是立即数2、不能在两个内存单元之间直接传送数据3、不能将立即操作数送给段寄存器4、段寄存器之间不能相互传送数据5、CS,IP,PSW不能作为目的操作数,但可以作为 源操作数6、源操作数和目的操作数字长必须相等7、MOV指令不影响标志位,1.MOV MEM2,MEM1,修改为:MOV AX,MEM1 MOV MEM2,AX,2.MOV DS,2000H,修改为:MOV AX,2000H MOV DS,AX,3.MOV ES,DS,修改
12、为:MOV AX,DS MOV ES,AX,例题:,2)数据进栈指令PUSH和出栈指令POP,堆栈是一段内存区域,可以用于保护中间数据、运算结果或某些寄存器的值,需要时可以从堆栈中将数据取出来。,堆栈按照先进后出的原则来保存数据,微机一般把内存的一段区间作为堆栈使用,即堆栈段SS。段内物理地址由SS和SP决定,SP始终指向栈顶。对于数据的的保存和恢复需要有由堆栈指令来完成,格式:PUSH 操作数 POP 操作数,假设(SS)=9000H,堆栈段位64KB(SP)=0E200H,则:整个堆栈段的物理地址范围为:90000H9FFFFH,堆栈物理地址为:9E200H,举例:,PUSH AX;将AX
13、内容压入堆栈,PUSH BX;将堆顶内容弹出到BX,(1),(2),说明:,1、8086的堆栈操作总是按字进行的;2、每推入一个字,SP减2,一个字的高字节放在堆栈的较高地址,低字节放在较低地址;弹出一个字,SP加2;3、堆栈的内容按先进后出的原则;4、不能使用立即寻址方式;5、PUSH和POP指令不影响标志位;6、CS可以压入堆栈,但栈中的值出断点的之外 不能弹入到CS,3)标志进栈指令PUSHF和出栈指令POPF,将16位堆栈数据压入或弹出到标志寄存器(PSW)中,设置TF=1则:,PUSHFPOP AXOR AH,01HPUSH AXPOPF,4)数据交换指令XCHG,格式:XCHG 目
14、的操作数,源操作数,功能:实现源和目的操作数的存放位置,说明:,1、目的操作数和源操作数不能为立即数或段寄存器,并且不能同时为内存单元;2、CS和IP不能为交换指令的源或目的操作数;3、目的和源操作数的取值范围应相同,即同为8位或同为16位;,XCHG BL,DLXCHG AX,SIXCHG DI,AL,XCHG BX,DI XCHG DS,AX,例题:,2.累加器专用指令,1)累加器输入/输出指令IN,OUT,输入指令用于CPU从外设端口接收数据,输出指令用于CPU从外设端口发送数据,端口:,端口:CPU与外设之间通过接口进行数据交换,一个端口通常对应接口中的一个或一组寄存器。每个8位端口有
15、一个地址,叫端口号,两个相邻的8位端口可以组成一个16位地址,端口数:外部设备最多可以有65536个(64KB)个 由A0A16译码形成,端口号:即外部设备端口地址,为0000FFFFH。,PC机仅使用A0A9译码形成I/O端口地址,即1024H个端口地址,因此端口号范围为0000H03FFFH。其中:A9=1表示扩充槽上的端口地址,8086利用地址纵向的低16位对8位I/O端口的寻址号,1)直接累加器输入/输出指令IN,OUT,格式:IN 累加器,端口号 OUT 端口号,累加器,端口号中前256个端口(0FFH),可以使用直接的输入/输出指令:指令中提供端口号,例如:IN AL,50H IN
16、 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时只能使用间接输入输出指令,3)XLAT换码指令,使累加器的一个值转换为内存表格中对应的某一个值。,换码指令用于编码制的转换,格式:XLAT或XLAT 地址标号,功能:(AL)(BX)+(AL),使用该指令前,内存的表首地址赋给BX,AL中存放表
17、格某一项与表格首地址的位移量,执行BX+AL,得到该表格中的一个地址,再将此地址所对应单元中的值送到AL中。,AL为8位无符号数,表格最多为256个代码,例题:十进制数字09的7段显示码表,例:求5对应的显示码,MOV AL,5MOV BX,OFFSET DISP_TABLEXLAT或者XLAT DISP_TABLE,结果(AL)=12H,3)XLAT换码指令,格式:XCHG 目的操作数,源操作数,功能:实现源和目的操作数的存放位置,3.地址传送指令,1)LEA偏移地址送寄存器指令(Load Effective Address),格式:LEA 16位寄存器名,存储器寻址方式,功能:将源操作数的
18、地址送到一个寄存器中,例如:LEA AX,2782HLEA BX,BP+SILEA SP,0482H,MOV AX,2782H,(2782H)=02H,2)LDS(Load Pointer into register and DS)指针送指定寄存器和DS寄存器指令,格式:LEA 16位寄存器名,存储器寻址方式,功能:将寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数送DS寄存器,例如:LDS DI,2140H,(DI)=0201H(DS)=0605H,3)LES(Load pointer into register and ES)指针送指定寄存器和ES寄存器指令,格式:LE
19、A 16位寄存器名,存储器寻址方式,功能:将寻址到的存储单元的第一个与源操作数(字)送16位寄存器,第二个源操作数送ES寄存器,例如:LES DI,2140H,三类地址传送指令中16位寄存器不包括段寄存器,说明:,例如:LES DI,2140H,(DI)=0201H(ES)=0605H,4.标志传送指令,读取标志位,对标志位进行设置:,1)读取标志指令LAHF2)设置标志指令SAHF,格式:LAHF 或SAHF,功能:将标志寄存器中的低8位传送给AH;将AH值传送给标志寄存器,3.2.2 算术运算指令,无符号数和有符号数是否能使用同一套加、减、乘、除指令?无符号数和有符号数使用同一套加、减,要
20、求参与运算的两个数必须同为无符号数或同为有符号数;另外,要用不同的方法判断运算结果是否溢出。采用什么方法?,结论:,1.无符号数和有符号数加法、减法可以使用同一套指令系统;无符号数有符号数乘法、除法不可以使用同一套指令系统;,2.参与运算的必须同是无符号数和有符号数;,3.溢出判断:无符号数运算产生溢出时CF=1;有符号数运算产生溢出时:OF=1,4.无符号数运算产生溢出会设置进位位,对于多字节运算,要利用到进位;有符号数运算产生溢出则表示出现错误,3.2.2 算术运算指令,1.加法指令,格式:ADD 目的操作数,源操作数 ADC 目的操作数,源操作数 INC 操作数,以上三条指令都可作字节或
21、字操作运算,除INC指令不影响标志位CF外,其他标志位都受指令结果的影响,PSW中最主要的是ZF,SF,CF,OF四位,ADC用于多字节的减法指令中,ADD AL,50HADD CX,1000HADD BC+DI,AXADD AX,BX+2000H,ADC AX,SIADD DX,SIADC BX,2000HADC AL,5,例:,设两个四字节数(DX,CX)=12345678H,(BX,AX)=9ABCDEF0H,ADD CX,AXADC DX,BX,例:利用ADC指令实现多字节加法,MOV SI,2000HMOV AX,SIMOV DI,3000HADD AX,DIMOV SI,AXMOX
22、 AX,SI+2ADC AX,DI+2MOV SI+2,AXMOV AX,0000HADC AX,0000HMOV SI+4,AX,2.减法指令,格式:SUB 目的操作数,源操作数 SBB 目的操作数,源操作数 DEC 操作数 NEG 求补指令,求补指令,即各位取反后末位加1,结果送回操作数通常CF=1,SBB用于多字节的减法指令中,SUB BX,CXSUB BP+2,CLSUB AL,20SUB WORD PTRDI,1000H,SBB AX,2030HSUB WORD PTRDI+2,1000H,DEC AXDEC AL,3.比较指令,格式:CMP 目的操作数,源操作数,结果不送回,两操作
23、数保持原值,但影响标志位不保存结果,例如:CMP AX,2000H CMP AL,50H CMP AX,BX+DI+100 CMP DX,DI,标志位的状态判断比较结果:,1.ZF=1,则两个操作数相等,2.对于两个无符号数,CF=0,则OPRD1OPRD2;CF=1,则OPRD1OPRD2,3.对于两个有符号数两数同为正或同为负时,则如果SF=0,则OPRD1OPRD2;SF=1,则OPRD1OPRD2,4.乘法指令,格式:MUL 源操作数(无符号数)若为字节操作(AX)(AL)源操作数;若为字操作(DX),(AX)(AX)源操作数,格式:IMUL 源操作数(有符号数),IMUL/MUL B
24、LIMUL/MUL CXIMUL/MUL BYTE PTRDIIMUL/MUL WORD PTRDI,注意:1)不允许使用立即数为操作数2)乘法指令只影响CF,OF,若MUL执行后高字节部分为0,则CF=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位余数在DX8086规定余数的符号与被除数相同AF,CF,OF,PF,ZF,SF不确定当被除数不够除数的2倍时,应对被除数进行
25、扩展,格式:DIV 源操作数(无符号数)若为字节操作(AL)(AX)/源操作数的商,(AH)(AX)/源操作数的余数;若为字操作(AX)(DX),(AX)/源操作数的商,(DX)(DX),(AX)/源操作数的余数,格式:IDIV 源操作数(有符号数),DIV CL,5.符号扩展指令,例除数为一8位数,被除数位于AL中的值为11000011,则将其扩展为11111111 11000011,其高八位置于AH中,对于无符号数的除法,被除数的扩展是将AH或DX清0对于有符号数的除法,被除数的扩展是将AH或DX进行低位字节或低位字的符号扩展,格式:CBW,字节转化为字(将AL中的值扩展到AX值),格式:
26、CBD,字转化为双字(将AX中的值扩展到DX,AX值),3.2.3 逻辑运算和移位指令,逻辑运算指令,移位指令,TEST与AND指令执行的操作相同,但不改变原操作数的值,也不送回结果,只是根据结果设置相应的标志位。TEST指令一般用来检测测试位是“1”还是“0”,1.逻辑运算指令,NOT指令不影响标志位,其它指令会使CF和OF清零,AF不定,并根据一般规则设置SF,ZF,PF,逻辑指令功能:,逻辑指令主要用于根据源操作数中数据位的组合格式有选择的使目的操作数某些位改变,清零或对它进行测试TEST指令后面可能跟一条JNZ或JZ指令,从而根据Z结果判断进行转移,1)AND逻辑与运算指令,格式:AN
27、D 目的操作数,源操作数,例如:AND AL,00001111B,功能:用来完成使某一个操作数清0,而保留其它位不变,即将需清0的位与“0”相与,要保留的位与“1”相与,2)OR逻辑或运算指令,格式:OR 目的操作数,源操作数,例如:OR AL,1000000B,功能:用来完成使一个操作数的某些位为1,而保留其它位不变,即将需置1的位与“1”相或,要保留的位与“0”相或,3)XOR异或指令,格式:XOR 目的操作数,源操作数,例如:XOR AL,AL,实现:完成使某一操作数的某些位取反,而保留其余位不变。即将要取反的威位与“1”异或,保留的位与“0”异或,4)TEST测试指令,格式:TSET
28、目的操作数,源操作数,实现:两个操作数实行与运算,但测试结果不保存,用来检测某一位或几位的条件是否满足,,5)NOT逻辑非,格式:NOT 目的操作数,注意:目的操作数不能是立即数,功能举例:,在这些应用中,源操作数称为掩码,这种操作称为屏蔽操作,例1:(1)对源操作数01101101的第0、2、4位置0,0110 1101,AND 1110 1010,MOV AL,01101101AND AL,11101010,例2:(1)对源操作数01101101的第0、1、5位置1,0110 1101,OR 0010 0011,MOV AL,01101101AND AL,00100011,例3:将寄存器A
29、L内容清0,0110 1101,XOR 0110 1101,例4:检测AL的低0位的值?,TEST AL,00000001JNZ 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,AADD AL,20H,MOV AL,aAND AL,0DFH,
30、DFH:1101 0001,例:判断A单元中数据的奇偶性,2.移位指令,Right),(1)非循环移位指令,0100 1111,SAL 100 11110,例如:,SAL DX,1,MOV CL,4SAL A,CLSAL AL,CL,SAL A,3(无效的)SAL AL,BL(无效的),说明:,操作数可以是寄存器或内存单元中的8位或16位操作数逻辑移位指令把操作数看成无符号数算术运算指令把操作数看成有符号数SAL和SHL操作相同,以0填充最低位SAR和SHR的操作不同,SAR最高位保持不变(符号位),SHR以0填充对于移位指令,只有移位次数为1时,OF才有意义,移位后如果CF和最高有效位不同则
31、OF=1,否则为0如果移位次数大于1,必须用CL寄存器预先指定移位 次数,左移n位与乘以2n等效,可以使用SHL/SAL指令,例如:,622=00000110B100B=00011000B,同样,右移n位与除以2n等效。如果是无符号数,则右移使用SHR,如果是有符号数则右移使用SAR,使用移位指令编辑乘除运算,其执行指令时间比乘除指令快5-6倍,例如:将(AL)乘以10,SAL AL,1MOV BL,ALMOV CL,2SAL AL,CLADD AL,BL,AL21+AL23,(2)循环移位指令,操作数可以是寄存器或内存单元中的8位或16位 操作数ROL和ROR不含CF循环移位指令,8位操作数
32、移动8位 后还原RCLRCR含CF循环移位指令,8位操作数移动9次后 还原对于循环移位指令,只有移位次数为1时,OF才有意义,移位后如果CF和最高位不同,则OF=1,否则为0如果移位次数大于1,必须用CL寄存器预先指定 移位次数,说明:,例如:将位于1000H单元中的2位非组合BCD码-转换成组合BCD码,MOV CL,4MOV SI,1000HMOV AX,WORD PTRSISHL AL,CL(ROL AL,CL)SHR AX,CL(ROR AX,CL)MOV SI,AL,SHR AH,CL SHL AX,CL,3.2.4 串操作指令,用一条指令实现对一个字符串或一个字串进行操作。,(1)
33、字符串送指令(MOVSB/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减量变化,对于字
34、节串操作SI、DI每次变化量为1,对于字串操作SI、DI每次变化量为2,例如:,将数据段1000H开始的100个字节传送到扩展段2000H开始的单元,MOV DI,SIINC SIINC DI,(CX)(CX)-1当CX=0时退出MOVSB,计数器CX存放传送的字节数或字数带重复前缀REP,则每次传送一次CX自动减1,直到CX为0SI、DI分别为源和目的寄存器方向标志位DF=0,SI、DI自动减量,否则自动增量不影响标志位,使用指令前的初始化工作说明:,格式:LODSB LODSW LODS 目的操作数,源操作数,实现:若字节 AL(DS):(SI)若字 AX(DS):(SI),(2)取字符串
35、指令(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 若字(ES):(DI)AX,可用重复前缀REP,使一串
36、内存单元填充相同的数,LEA DI,BUFF MOV CX,100CLDMOV AL,00HREP STOSB,例:对附加段中BUFF开始的100个连续的内存 单元进行清0操作,(4)字符串比较指令(CMPSB/CMPSW),格式:CMPSB(字节比较指令)CMPSW(字比较指令)CMPS 源操操作数寻址,目的操作数寻址,实现:将SI所指向的源串中的一个字节或字与DI所指向的目的串中的一个字节或一个字相减,但不保存结果,只是根据结果设置标志位。(DS:SI)-(ES:DI),带重复前缀REPE/REPZ CX0且比较字节相等(ZF=1)时,继续比较带重复前缀REPNE/REPNZ CX0且比较
37、字节不相等(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 HLTMATCH:MOV AL,1 HLT,(5)字符串检索指令(SCASB/SCASW),格式:SCASB(字节比较指令)SCASW(字比较指令)SCAS 目的操作数,AL(AX)-ES:DI,根据相减结果置
38、标志位,带重复前缀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 SCASB JZ FND MOV BX,FFFFH HLTFND:SUB BX,CX HL
39、T,(AL)=c,3.2.5 控制转移指令,(1)无条件转移指令,段内直接寻址段内间接寻址段间直接寻址段间间接寻址,1.段内直接寻址,格式:,指令名 SHORT 转移目标地址标号指令名 转移目标地址标号指令名 NEAR PTR转移目标地址标号,JMP SHORT NEXT,这种指令只改变IP寄存器的值,而不改变CS的值,位移量,指令,IP寄存器,IP寄存器,段内寻址示意图,2.段间直接寻址,格式:,指令名 FAR PTR 转移目标地址标号指令名 段地址:段内偏移量,JMP FAR PTR NEXT1,这种指令不仅改变IP寄存器的值,而且改变CS的值,地址,指令,段间寻址示意图,段地址,IP寄存
40、器,CS寄存器,4.段间间接寻址,格式:,指令名 DWORD PTR 存储器寻址方式,JMP DWORD PTR TABLEBX,这种指令不仅改变IP寄存器的值,而且改变CS的值,段间间接寻址示意图,段内直接寻址,指令中直接给出了转移的位移量,新IP值=当前的IP值+位移量,JMP 1000H,应用于无条件转移和有条件转移、调用转移,1040H新IP,JMP 1000H,IP=1000H+指令字节数+0020H,段内间接寻址,有效地址在寄存器或内存单元内,例如:JMP CX JMP WORD PTR1000H JMPCX,寄存器编号,指令,段内间接寻址示意图,IP寄存器,转移目标地址的偏移地址
41、,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)=2000H,3.2.5 控制转移指令,(1)无条件转移指令,例如:段内直接转移:JMP 1000H(JMP NEAR/SHORT
42、 PTR 转移地址标号)段内间接转移:JMP AX段间直接转移:JMP 2500H:2100H(JMP FAR PTR 转移地址标号)段间间接转移:JMP DWORD PTRDI,(2)条件转移指令,满足指令要求的条件,则执行指定的目标,不满足条件,则执行条件转移指令的下一条指令,判断条件:FLAG的CF,SF,OF,PF,ZF位或计数器CX值,说明:,条件转移指令只能段内直接寻址方式,而且转移范围为指令所在位置的-128+127个单元,主要为了减少指令长度提高执行速度,大部分指令可以用两种助记符表示:JZ/JE,有符号数和无符号数比较的区别:有符号数:大于,小于 无符号数:高于,小于,CMP
43、 AX,BXJG 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 JAE P2 MOV AL,BX P2:DEC CX JNZ P1 MOV BX,2000H MOV BX,AL,测试CX的值为0转移的指令,JCXZ 地址标号,;若CX=0
44、转移,可以安排在带条件重复前缀的串指令下面,判断是否到串尾,若到串尾则结束,(3)循环控制指令,三种循环控制指令,控制循环是否继续,以CX为计数器,只能使用段内直接转移,位移量只能是8位,LOOPLOOPZ/LOOPELOOPNZ/LOOPNE,循环可用上面的两条指令实现,也可通过循环指令实现,LOOP 标号;CX0时循环,DEC CXJNZ 标号,相当于:,LOOP指令:,例子:,MOV CX,0100H KKK:LOOP KKK-,LOOPZ/LOOPE指令:,LOOPZ/LOOPE 标号;CX0且ZF=1时循环,说明:CX的值并不影响标志位ZF,ZF是否为1,是由前面其它指令决定的,例:
45、在40个元素组成的数组中寻找第一个非0元素,MOV CX,28H MOV SI,0FFFFHNEXT:INC SI CMP BYRE PTRSI,0 LOOPZ NEXT JNZ OKK;找到 CALL DISPLAY1;未找到 RETOKK:CALL DISPLAY2 RET,LOOPNZ指令:,LOOPNZ 标号;CX0且ZF=0时循环,说明:CX的值并不影响标志位ZF,ZF是否为0,是由前面其它指令决定的,例:在40个元素组成的数组中寻找第一个0元素,MOV CX,28H MOV SI,0FFFFHNEXT:INC SI CMP BYRE PTRSI,0 LOOPNZ NEXT JNZ
46、OKK;未找到 CALL DISPLAY1;找到 RETOKK:CALL DISPLAY2 RET,(5)处理器控制指令,标志位设置指令,CLC,STC,CMC,CLC清除进位位指令,将CF置0;STC置进位位指令,将CF置1CMC进位位求反指令,如果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之后的指令,可用作暂短的软件延时,