1、1,8086指令系统(2),2,逻辑运算和移位指令,3,指令类型,逻辑运算 与,或,非,异或 移位操作 非循环移位,循环移位,4,一、逻辑运算,逻辑运算指令对 操作数的 要求大多与MOV指令 相同。 “非”运算指令 要求操作数 不能是立即数; 除“非”运算指令 外,其余指令的执行都会使标志位OF=CF=0,5,1.“与”指令:,格式: AND OPRD1,OPRD2 操作: 两操作数相“与”,结果送目标地址。,6,“与”指令的应用,实现两操作数按位相与的运算 AND BL,SI 使目标操作数的某些位不变,某些位清零 AND AL,0FH 在操作数不变的 情况下使CF和OF清零 AND AX,A
2、X,7,“与”指令应用例,从地址为3F8H 端口中读入一个字节数,如果该数 bit1位为1,则可从38FH端口将DATA为首地址的一个字输出,否则就不能进行数据传送。编写相应的程序段。,8,“与”指令应用例,开 始,取待输出数的偏移地址,读入状态字,测试bit1位状态,Bit1=1?,取输入口地址,取输出口地址,输出一个字,N,Y,9,“与”指令应用例,LEA SI,DATAMOV DX,3F8H WATT:IN AL,DXAND AL,02HJZ WATT ;ZF=1转移MOV DX,38FHMOV AX,SIOUT DX,AX,10,2.“或”运算指令,格式: OR OPRD1,OPRD2
3、 操作: 两操作数相“或”,结果送目标地址,11,“或”指令的应用,实现两操作数 相 “或”的 运算 OR AX,DI 使某些位不变,某些位置“1” OR CL,0FH 在不改变操作数的 情况下使OF=CF=0 OR AX,AX,12,“或”指令的应用例,OR AL,ALJPE GOONOR AL,80H GOON:.,PF=1转移,13,“或”指令的应用,将一个二进制数9变为字符9,如何实现?,14,3.“非”运算指令,格式: NOT OPRD 操作: 操作数按位取反再送回原地址 注: 指令中的操作数不能是立即数 指令的执行对标志位无影响 例:NOT BYTE PTRBX,15,4.“异或”
4、运算指令,格式: XOR OPRD1,OPRD2 操作: 两操作数相“异或”,结果送目标地址 例:XOR BL,80H XOR AX,AX,16,5.“测试”指令,格式: TEST OPRD1,OPRD2 操作: 执行“与”运算,但运算的结果不送回目标地址。 应用: 常用于测试某些位的状态,17,例:,从地址为3F8H的 端口中读入一个字节数,当该数的 bit1, bit3, bit5位同时为1时,可从38FH端口将DATA为首地址的一个字输出,否则就不能进行数 据传送。编写相应的 程序段。,18,源程序代码:,LEA SI,DATAMOV DX,3F8H WATT:IN AL,DXMOV D
5、X,38FHMOV AX,SIOUT DX,AX,AND AL,2AH CMP AL,2AH JNZ WATT,TEST AL,02H JZ WATT ;ZF=1转移 TEST AL,08H JZ WATT TEST AL,20H JZ WATT,AND AL,2AH XOR AL,2AH JNZ WATT,19,二、移位指令,非循环移位指令循环移位指令,注:移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。,20,1. 非循环移位指令,逻辑左移 算术左移 逻辑右移 算术右移,21,算术左移和逻辑左移,算术左移指 令:SAL OPRD,1SAL OPRD,CL 逻辑左移指 令:
6、SHL OPRD,1SHL OPRD,CL,有符号数,无符号数,22,逻辑右移,格式:SHR OPRD,1SHR OPRD,CL,0,CF,无符号数的右移,23,逻辑右移例:,MOV AL,68H MOV CL,2 SHR AL,CL,0,CF,0 1 1 0 1 0,AL,0,0,0,0 0 1 1 0 1 0 0,AL,CF,0,0,0 0 0 1 1 0 1 0,AL,CF,0,0,移动1次,移动2次,24,算术右移,格式:SAR OPRD,1SAR OPRD,CL,有符号数的右移,CF,25,非循环移位指令的应用,左移可实现乘法运算 右移可实现除法运算,26,2. 循环移位指令,不带进
7、位位的循环移位带进位位的循环移位,左移 ROL 右移 ROR,左移 RCL 右移 RCR,指令格式、对操作数的要求与非循环移位指令相同,27,不带进位位的循环移位,CF,CF,28,带进位位的循环移位,CF,CF,29,循环移位指令的应用,用于对某些位状态的测试; 高位部分和低位部分的交换; 与非循环移位指令一起组成32位或更长字长数的移位。,P124例3-34,P124例3-35,30,程序功能,将1000H开始存放的4个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。,12H,34H,56H,78H,1000H,3000H,31,程序例,MOV SI,1000HMOV DI,
8、3000HMOV CX,4 Next:MOV AL,SIMOV BL,AL AND AL,0FH OR AL,30HMOV DI,ALINC DIMOV AL,BL,PUSH CX MOV CL,4 SHR AL,CL OR AL,30H MOV DI,AL INC DI INC SI POP CX DEC CX JNZ Next HLT,32,串操作指令,33,串操作指令说明,针对数据块或字符串的操作; 可实现存储器到存储器的数据传送; 待操作的数据串称为源串,目标地址称为目标串。,34,串操作指令的特点,源串一般存放在数据段,偏移地址由SI指定。允许段重设; 目标串必须在附加段,偏移地址由
9、DI指定; 指令自动修改地址指针,修改方向由DF决定。DF=0DF=1 数据块长度值由CX指定 可增加自动重复前缀以实现自动修改CX内容。,增地址方向;,减地址方向;,35,重复前缀,无条件重复 REP 条件重复 REPE 相等重复 REPZ 为零重复 REPNE 不相等重复 REPNZ 不为零重复,CX0 ZF=1,CX0 ZF=0,CX0 重复,36,串操作指令,串传送 MOVS 串比较 CMPS 串扫描 SCAS 串装入 LODS 串送存 STOS,37,串操作指令流程(以传送操作为例),取源串地址,取目标串地址,设串长度,传送一个字节或字,修改地址指针,修改串长度值,传送完否?,N,Y
10、,设操作方向,38,1. 串传送指令,格式:MOVS OPRD1,OPRD2MOVSBMOVSW串传送指令常与无条件重复前缀连用,39,串传送指令,对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。,P104例3-12,40,串传送指令例,用串传送指令实现200个字节数据的传送:LEA SI,MEM1LEA DI,MEM2MOV CX,200CLDREP MOVSBHLT,41,2. 串比较指令,格式:CMPS OPRD1,OPRD2CMPSBCMPSW 串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。 前缀的操作对标志位不影响,
11、42,串比较指令例,测试200个字节数据是否传送正确:,LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REPE CMPSB TEST CX,00FFH,JZ STOPDEC SIMOV AL,SIMOV BX,SI STOP:HLT,43,3. 串扫描指令,格式:SCAS OPRDSCASBSCASW 执行与CMPS指令相似的操作,只是这里的源操作数是AX或AL,目 标 操作数,44,串扫描指令的应用,常用于在指定存储区域中寻找某个关键字。,教材p127例,45,4. 串装入指令,格式:LODS OPRDLODSBLODSW 操作: 对字节: 对 字:,源操作数
12、,DS:SI,DS:SI,AL,AX,46,4. 串装入指令,用于将内存某个区域的数据串依次装入累加 器,以便显示或输出到接口。 LODS指令一般不加重复前缀。,47,5. 串存储指令,格式:STOS OPRDSTOSBSTOSW 操作: 对字节: AL 对 字: AX,目 标 操作数,ES:DI,ES:DI,48,串存储指令的应用,常用于将内存某个区域置同样的值 此时: 将待送存的数据放入AL(字节数)或AX(字数据); 确定操作方向(增地址/减地址)和区域大小(串长度值); 使用串存储指令+无条件重复前缀,实现数据传送。,49,串存储指令例,将内存某单元清零 P129例3-40,50,串操
13、作指令应用注意事项,需要定义附加段 目标操作数必须在附加段 需要设置数据的操作方向 确定DF的状态 源串和目标串指针分别为SI和DI 串长度值必须由CX给出 注意重复前缀的使用方法 传送类指令前加无条件重复前缀 串比较类指令前加条件重复前缀,但前缀不影响ZF状态,51,程序控制指令,转移指令 循环控制 过程调用 中断控制,52,程序的执行方向,程序控制类指令的本质是: 控制程序的执行方向 决定程序执行方向的因素: CS,IP 控制程序执行方向的方法: 修改CS 和IP ,则程序转向另一个代码段执行; 仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行。,53,一、转移指令,无条
14、件转移指令无条件转移到目标地址,执行新的指令 有条件转移指令在具备一定条件的情况下转移到目标地址,通过修改指令的偏移地址或段地址及偏移地址 实现程序的转移,54,1. 无条件转移指令,格式:JMP OPRD,目标地址,与JMP在同一代码段,与JMP不在同一代码段,原则上可实现在整个内存空间的转移,55,无条件段内转移,转移的目标地址在当前代码段内,段地址不 改变。 即:目标地址是16位偏移地址。,指令中直接给出目标地址,由指令中的寄存器或存储器操作数指出目标地址,段内直接转移,段内间接转移,56,段内直接转移,转移的目标地址由指令直接给出 格式: JMP Label,近地址标号,57,段内直接
15、转移示图,JMP,Label,代码段,位移量,下一条要执行指令的偏移地址=当前IP+位移量,JMP Label,58,段内间接转移,段内间接转移 转移的目标地址存放在某个16位寄存器或存储器的某两个单元中 例: JMP BX 若:BX=1200H 则:转移的目标地址=1200H,JMP,代码段,1200H,MOV,59,段内间接转移例,JMP WORD PTRBX设:BX=1200H,JMP,代码段,数据段,BX=1200,XXH,XXH,IP,指令码,60,无条件段间转移,转移的目标地址不在当前代码段内。 目标地址为32位,包括段地址和偏移地址。,指令中直接给出目标地址,由指令中的32位存储
16、器操作数指出目标地址,段间直接转移,段间间接转移,61,段间直接转移,段内直接转移 转移的目标地址由指令直接给出 格式: JMP FAR Label,远地址标号,62,段间直接转移示图,JMP,Label,代码段1,Label与JMP之间的位移量,代码段2,XXH,XXH,XXH,XXH,IP,CS,63,段间间接转移,段内间接寻址 转移的目标地址由指令中的32位操作数给出例: JMP DWORD PTRBX,XXH,XXH,XXH,XXH,BX,IP,CS,JMP,指令码,代码段1,代码段2,数据段,64,无条件转移指令例,(1) 2000:0100 MOV AX,1200H (2) 200
17、0:0103 JMP NEXT (3) 2000:0120 NEXT: MOV BX,1200H (4) JMP BX (5) 2000:1200,65,无条件转移指令例,MOV SI,1122H MOV WORD PTRSI,0120H ADD SI,2 MOV WORD PTRSI,0122H,JMP DWORD PTRSI-2,JMP WORD PTRSI,IP,CS,IP,66,2. 条件转移指令,在满足一定条件下,程序转移到目标地址继续执行条件转移指令均为段内短转移,即转移范围为:-128-+127,p132,67,条件转移指令的应用,几种条件转移指令的应用 JC/JNC 判断CF的
18、状态。常用于比大小 JZ/JNZ 判断ZF的状态。常用于循环体的结束判断 JO/JNO 判断OF的状态。常用于有符号数溢出的判断 JP/JPE 判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数 JA/JAE/JB/JBE 判断CF或CF+ZF的状态。常用于无符号数的大小比较,68,转移指令例,统计内存数据段中以TABLE为首地址的100个8位符号数中正数、负数和零元数的个数。,69,转移指令例(流程图),将存放各元素个数的单元清零,取首地址 设串长度,取一个字节数,正数个数加1,零元素加1,为负?,为零?,负数个数加1,N,Y,N,Y,70,二、循环控制指令,循环范围: 以当前IP为
19、中心的-128+127范围内循环。 循环次数由CX寄存器指定。 循环指令:,LOOP *LOOPZ *LOOPNZ,无条件循环指令,条件循环指令,71,无条件循环指令,格式:LOOP LABEL 循环条件:CX 0 操作: DEC CXJNZ 符号地址,72,三、过程调用和返回,用于调用一个子过程; 子过程由程序员预先设计并装入内存 子过程执行结束后要返回原调用处,调用程序,断点,入口地址,子程序,73,调用指令的执行过程,保护断点; 将调用指令的下一条指令的地址(断点)压入堆栈 获取子过程的入口地址; 子过程第1条指令的偏移地址 执行子过程,含相应参数的保存及恢复; 恢复断点,返回原程序。
20、将断点偏移地址由堆栈弹出,74,过程调用,段内调用段间调用,段内直接调用 段内间接调用,段间直接调用 段间间接调用,75,1. 段内调用,被调用程序与调用程序在同一代码段 调用前只需保护断点的偏移地址 格式:CALL NEAR PROC执行过程:,近过程名,代码段1,调用程序,被调用程序,代码段1,将断点的偏移地址压入堆栈根据过程名找子程序入口,76,段内调用例,(1)CALL TIMRE (2)CALL WORD PTRSI,直接调用,间接调用,44H,33H,CALL,代码段,数据段,设:SI=1200H CS=6000H,1200H,执行第(2)条指令后:,6000H,CS =,3344
21、H,IP =,77,2. 段间调用,子过程与原调用程序不在同一代码段先将断点的CS压栈,再压入IP。,调用前需保护断点的段基地址和偏移地址,78,段间调用例,格式:CALL FAR PROC 格式例: CALL FAR TIMRE CALL DWORD PTRSI,XXH,XXH,CALL,代码段,数据段,SI,XXH,XXH,CS,IP,79,3. 返回指令,功能: 从堆栈中弹出断点地址,返回原程序 格式:RET RET指令一般位于子程序的最后。,80,四、中断指令,中断 中断源 中断的类型 中断指令 引起CPU产生一次中断的指令,81,中断与过程调用:,中断是随机事件或异常事件引起,调用则
22、是事先已在程序中安排好 ; 响应中断请求不仅要保护断点地址,还要保护FLAGS内容; 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。,82,1. 中断指令,格式:INT n 说明:n4,中断类型码 n=0 255,n 4,XXH,XXH,XXH,XXH,入口的段地址,入口的偏移地址,存放中断服务子程序入口地址的单元的偏移地址,代码段,数据段,该单元在数据段,段地址=DS,83,中断指令的执行过程,将FLAGS压入堆栈; 将INT指令的下一条指令的CS、IP压栈; 由n4得到存放中断向量的地址; 将中断向量(中断服务程序入口地址)送CS和I
23、P寄存器; 转入中断服务程序。,84,中断指令的执行过程,n4,22H,11H,00H,67H,IP,CS,68122H,MOV,代码段,数据段,堆栈段,SP,FLAGSH,FLAGSL,IPH,CSL,CSH,IPL,SP,SP,SP,85,中断指令例,执行程序段:CS IP 6200H:0110H INT 21H 6200H:0112H MOV AX,BX,12H,01H,00H,62H,SP=1200,FLAGSL,FLAGSH,SP=11FA,执行INT指令后,堆栈段,86,中断指令例,执行INT 21H指令后IP=21H4CS=(21H4)+2,0084H,23H,11H,00H,2
24、0H,IP,CS,数据段,代码段,XX,21123H,中断服务子程序,87,2. 溢出中断指令,格式:INTO 若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。 INTO指令通常安排在有符号数加减运算指令之后。,相当于,INT 4,88,3. 中断返回指令,格式:IRET 中断服务程序的最后一条指令,负责,恢复断点 恢复标志寄存器内容,89,六、处理器控制指令,对标志位的操作 与外部设备的同步,说明见p139表,90,本章课外自学内容:,BCD码调整指令 远地址指针指令LDS,LES 条件循环指令LOOPZ,LOOPNZ Pentium新增指令,91,结束语:,掌握: 指令的格式及意义; 指令对操作数的要求及对标志位的影响; 指令的应用。,92,第3章作业,作业请从电子教室网站下载 本章书后全部题目均可作为思考题,谢谢大家!,