1、18086指令系统指令系统(2)2逻辑运算和移位指令3指令类型逻辑运算逻辑运算与,或,非,异或与,或,非,异或移位操作移位操作非循环移位,循环移位非循环移位,循环移位4 一、逻辑运算逻辑运算指令对逻辑运算指令对 操作数的操作数的 要求大多与要求大多与MOV指令指令 相同。相同。“非非”运算指令运算指令 要求操作数要求操作数 不能是立即数;不能是立即数;除除“非非”运算指令运算指令 外,其余指令的执行都会使外,其余指令的执行都会使标志位标志位OF=CF=051.“与”指令:格式:格式:AND OPRD1,OPRD2操作:操作:两操作数相两操作数相“与与”,结果送目标地址。,结果送目标地址。6“与
2、”指令的应用实现两操作数按位相与的运算实现两操作数按位相与的运算AND BL,SI使目标操作数的某些位不变,某些位清零使目标操作数的某些位不变,某些位清零AND AL,0FH在操作数不变的在操作数不变的 情况下使情况下使CF和和OF清零清零AND AX,AX7“与”指令应用例从地址为从地址为3F8H 端口中读入一个字节数,端口中读入一个字节数,如果该数如果该数 bit1位为位为1,则可从,则可从38FH端口将端口将DATA为首地址的一个字输出,否则就不能为首地址的一个字输出,否则就不能进行数据传送。进行数据传送。编写相应的程序段。编写相应的程序段。8“与”指令应用例开开 始始取待输出数的取待输
3、出数的偏移地址偏移地址读入状态字读入状态字测试测试bit1位状态位状态Bit1=1?取输入口地址取输入口地址取输出口地址取输出口地址 输出一个字输出一个字NY9“与”指令应用例 LEA SI,DATA MOV DX,3F8HWATT:IN AL,DX AND AL,02H JZ WATT ;ZF=1转移转移 MOV DX,38FH MOV AX,SI OUT DX,AX102.“或”运算指令格式:格式:OR OPRD1,OPRD2操作:操作:两操作数相两操作数相“或或”,结果送目标地址,结果送目标地址11“或”指令的应用实现两操作数实现两操作数 相相“或或”的的 运算运算OR AX,DI使某些
4、位不变,某些位置使某些位不变,某些位置“1”OR CL,0FH在不改变操作数的在不改变操作数的 情况下使情况下使OF=CF=0OR AX,AX12“或”指令的应用例 OR AL,AL JPE GOON OR AL,80H GOON:.PF=1转移转移13“或”指令的应用将一个二进将一个二进制数制数9变为字变为字符符9如何实现如何实现?143.“非”运算指令格式:格式:NOT OPRDNOT OPRD操作:操作:操作数按位取反再送回原地址操作数按位取反再送回原地址注:注:指令中的操作数不能是立即数指令中的操作数不能是立即数指令的执行对标志位无影响指令的执行对标志位无影响例:例:NOT BYTE
5、PTRBXNOT BYTE PTRBX154.“异或”运算指令格式:格式:XOR OPRD1,OPRD2操作:操作:两操作数相两操作数相“异或异或”,结果送目标地址,结果送目标地址例:例:XOR BL,80H XOR AX,AX165.“测试”指令格式:格式:TEST OPRD1,OPRD2操作:操作:执行执行“与与”运算,但运算的结果不送回目标运算,但运算的结果不送回目标地址。地址。应用:应用:常用于测试某些位的状态常用于测试某些位的状态17例:从地址为从地址为3F8H的的 端口中读入一个字节数,当端口中读入一个字节数,当该数的该数的 bit1,bit3,bit5位同时为位同时为1时时,可,
6、可从从38FH端口将端口将DATA为首地址的一个字输出,为首地址的一个字输出,否则就不能进行数否则就不能进行数 据传送。据传送。编写相应的编写相应的 程序段。程序段。18源程序代码:LEA SI,DATA MOV DX,3F8HWATT:IN AL,DX MOV DX,38FH MOV AX,SI OUT DX,AXAND AL,2AHCMP AL,2AHJNZ WATTTEST AL,02HJZ WATT ;ZF=1转移转移TEST AL,08HJZ WATTTEST AL,20HJZ WATTAND AL,2AHXOR AL,2AHJNZ WATT19二、移位指令 非循环移位指令非循环移位
7、指令 循环移位指令循环移位指令注:注:n 移动一位时由指令直接给出;移动一位时由指令直接给出;n 移动两位及以上,则移位次数由移动两位及以上,则移位次数由CL指定。指定。201.非循环移位指令逻辑左移逻辑左移算术左移算术左移逻辑右移逻辑右移算术右移算术右移21算术左移和逻辑左移算术左移指算术左移指 令:令:SAL OPRD,1 SAL OPRD,CL逻辑左移指逻辑左移指 令:令:SHL OPRD,1 SHL OPRD,CL有符号数有符号数无符号数无符号数22逻辑右移格式:格式:SHR OPRD,1 SHR OPRD,CL0CF无符号数无符号数的右移的右移23逻辑右移例:MOV AL,68HMO
8、V CL,2SHR AL,CL0CF0 1 1 0 1 0 AL0 0 0 0 0 1 1 0 1 0 0ALCF0 00 0 0 1 1 0 1 0 ALCF0 0移动移动1次次移动移动2次次24算术右移格式:格式:SAR OPRD,1 SAR OPRD,CL有符号数有符号数的右移的右移CF25非循环移位指令的应用左移可实现乘法运算左移可实现乘法运算右移可实现除法运算右移可实现除法运算 262.循环移位指令不带进位位的循环移位不带进位位的循环移位带进位位的循环移位带进位位的循环移位左移左移 ROL右移右移 ROR左移左移 RCL右移右移 RCR指令格式、对操作数的要求与非循环移位指令相同指令
9、格式、对操作数的要求与非循环移位指令相同27不带进位位的循环移位CFCF28带进位位的循环移位CFCF29循环移位指令的应用用于对某些位状态的测试;用于对某些位状态的测试;高位部分和低位部分的交换;高位部分和低位部分的交换;与非循环移位指令一起组成与非循环移位指令一起组成32位或更长字位或更长字长数的移位。长数的移位。P124例例3-34P124例例3-3530程序功能将将1000H1000H开始存放的开始存放的4 4个压缩个压缩BCDBCD码转换码转换为为ASCIIASCII码存放在码存放在3000H3000H开始的单元中开始的单元中去。去。12H34H56H78H1000H3000H31程
10、序例 MOV SI,1000H MOV DI,3000H MOV CX,4Next:MOV AL,SI MOV BL,AL AND AL,0FH OR AL,30H MOV DI,AL INC DI MOV AL,BLPUSH CXMOV CL,432串操作指令33串操作指令说明针对数据块或字符串的操作;针对数据块或字符串的操作;可实现存储器到存储器的数据传送;可实现存储器到存储器的数据传送;待操作的数据串称为源串,目标地址称为待操作的数据串称为源串,目标地址称为目标串。目标串。34串操作指令的特点源串一般存放在数据段,偏移地址由源串一般存放在数据段,偏移地址由SI指定。允许段指定。允许段重设
11、;重设;目标串必须在附加段,偏移地址由目标串必须在附加段,偏移地址由DI指定;指定;指令自动修改地址指针,修改方向由指令自动修改地址指针,修改方向由DF决定。决定。DF=0 DF=1数据块长度值由数据块长度值由CX指定指定可增加自动重复前缀以实现自动修改可增加自动重复前缀以实现自动修改CX内容。内容。增地址方向;增地址方向;减地址方向;减地址方向;35重复前缀无条件重复无条件重复REP条件重复条件重复REPE 相等重复相等重复REPZ 为零重复为零重复REPNE 不相等重复不相等重复REPNZ 不为零重复不为零重复CX0 ZF=1CX0 ZF=0CX0 重复重复36串操作指令串传送串传送 MO
12、VS串比较串比较 CMPS串扫描串扫描 SCAS串装入串装入 LODS串送存串送存 STOS37串操作指令流程(以传送操作为例)取源串地址取源串地址取目标串地址取目标串地址设串长度设串长度传送一个字节或字传送一个字节或字修改地址指针修改地址指针修改串长度值修改串长度值传送完否?传送完否?NY设操作方向设操作方向381.串传送指令格式:格式:MOVS OPRD1,OPRD2 MOVSB MOVSW串传送指令常与无条件重复前缀连用串传送指令常与无条件重复前缀连用39串传送指令对比用对比用MOV指令和指令和MOVS指令实现将指令实现将200个字节数据从内存的一个区域送到个字节数据从内存的一个区域送到
13、另一个区域的程序段。另一个区域的程序段。P104例例3-1240串传送指令例用串传送指令实现用串传送指令实现200个字节数据的传送:个字节数据的传送:LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REP MOVSB HLT412.串比较指令格式:格式:CMPS OPRD1,OPRD2 CMPSB CMPSW串比较指令常与条件重复前缀连用,指令的执串比较指令常与条件重复前缀连用,指令的执 行不改变操作数,仅影响标志位。行不改变操作数,仅影响标志位。前缀的操作对标志位不影响前缀的操作对标志位不影响42串比较指令例测试测试200个字节数据是否传送正确:个字节数据是否传
14、送正确:LEA SI,MEM1LEA DI,MEM2MOV CX,200CLD REPE CMPSB TEST CX,00FFH JZ STOP DEC SI MOV AL,SI MOV BX,SISTOP:HLT 433.串扫描指令格式:格式:SCAS OPRD SCASB SCASW执行与执行与CMPS指令相似的操作,只是这里的源指令相似的操作,只是这里的源 操作数是操作数是AX或或AL目目 标标操作数操作数44串扫描指令的应用常用于在指定存储区域中寻找某个关键字。常用于在指定存储区域中寻找某个关键字。教材教材p127例例454.串装入指令格式:格式:LODS OPRD LODSB LOD
15、SW操作:操作:对字节:对字节:对对 字:字:源操作数源操作数DS:SIDS:SIDS:SIDS:SIALALAXAX464.串装入指令用于将内存某个区域的数据串依次装入累加用于将内存某个区域的数据串依次装入累加 器,以便显示或输出到接口。器,以便显示或输出到接口。LODS指令一般不加重复前缀。指令一般不加重复前缀。475.串存储指令格式:格式:STOS OPRD STOSB STOSW操作:操作:对字节:对字节:AL AL对对 字:字:AX AX目目 标标操作数操作数ES:DIES:DI48串存储指令的应用常用于将内存某个区域置同样的值常用于将内存某个区域置同样的值此时:此时:将待送存的数据
16、放入将待送存的数据放入AL(字节数)或(字节数)或AX(字数(字数据);据);确定操作方向(增地址确定操作方向(增地址/减地址)和区域大小(串减地址)和区域大小(串长度值);长度值);使用串存储指令使用串存储指令+无条件重复前缀,实现数据传送。无条件重复前缀,实现数据传送。49串存储指令例将内存某单元清零将内存某单元清零P129例例3-4050串操作指令应用注意事项需要定义附加段需要定义附加段目标操作数必须在附加段目标操作数必须在附加段需要设置数据的操作方向需要设置数据的操作方向确定确定DF的状态的状态源串和目标串指针分别为源串和目标串指针分别为SI和和DI串长度值必须由串长度值必须由CX给出
17、给出注意重复前缀的使用方法注意重复前缀的使用方法传送类指令前加无条件重复前缀传送类指令前加无条件重复前缀串比较类指令前加条件重复前缀,但前缀不影响串比较类指令前加条件重复前缀,但前缀不影响ZF状态状态51程序控制指令转移指令转移指令循环控制循环控制过程调用过程调用中断控制中断控制52程序的执行方向程序控制类指令的本质是:程序控制类指令的本质是:控制程序的执行方向控制程序的执行方向决定程序执行方向的因素:决定程序执行方向的因素:CS,IP控制程序执行方向的方法:控制程序执行方向的方法:修改修改CS 和和IP,则程序转向另一个代码段执行;,则程序转向另一个代码段执行;仅修改仅修改IP,则程序将改变
18、当前的执行顺序,转向本,则程序将改变当前的执行顺序,转向本代码段内其它某处执行。代码段内其它某处执行。53一、转移指令无条件无条件转移指令转移指令 无条件转移到目标地址,执行新的指令无条件转移到目标地址,执行新的指令有条件转移指令有条件转移指令 在具备一定条件的情况下转移到目标地址在具备一定条件的情况下转移到目标地址通过修改指令的通过修改指令的偏移地址偏移地址或或段地址及偏移地址段地址及偏移地址实现程序的转移实现程序的转移541.无条件转移指令格式:格式:JMP OPRD目标地址目标地址与与JMP在同在同一代码段一代码段与与JMP不在同不在同一代码段一代码段原则上可实现在整个内存空间的转移原则
19、上可实现在整个内存空间的转移55无条件段内转移转移的转移的目标地址目标地址在当前代码段内,段地址不在当前代码段内,段地址不 改改变。变。即:即:目标地址目标地址是是16位偏移地址。位偏移地址。指令中直接给出指令中直接给出目标地址目标地址由指令中的寄存器或由指令中的寄存器或存储器操作数指出目存储器操作数指出目标地址标地址段内直接转移段内直接转移段内间接段内间接转移转移56段内直接转移转移的目标地址由指令直接给出转移的目标地址由指令直接给出格式:格式:JMP Label近地址标号近地址标号57段内直接转移示图JMPLabel代代码码段段位移量位移量下一条要执行指令的偏移地址下一条要执行指令的偏移地
20、址=当前当前IP+位移量位移量JMP Label58段内间接转移段内间接转移段内间接转移转移的目标地址存放在某个转移的目标地址存放在某个16位寄存器或存储器位寄存器或存储器 的某两个单元中的某两个单元中例:例:JMP BX若:若:BX=1200H则:转移的目标地址则:转移的目标地址=1200HJMP代代码码段段1200HMOV59段内间接转移例JMP WORD PTRBX 设:设:BX=1200HJMP代代码码段段数数据据段段BX=1200XXHXXHIP指令码指令码60无条件段间转移转移的转移的目标地址目标地址不在当前代码段内。不在当前代码段内。目标地址目标地址为为32位,包括段地址和偏移地
21、址。位,包括段地址和偏移地址。指令中直接给出指令中直接给出目标地址目标地址由指令中的由指令中的32位存储器位存储器操作数指出目标地址操作数指出目标地址段间直接转移段间直接转移段间间接转移段间间接转移61段间直接转移段内直接转移段内直接转移转移的目标地址由指令直接给出转移的目标地址由指令直接给出格式:格式:JMP FAR Label远地址标号远地址标号62段间直接转移示图JMPLabel代代码码段段1Label与与JMP之间的位移量之间的位移量代代码码段段2XXHXXHXXHXXHIPCS63段间间接转移段内间接寻址段内间接寻址转移的目标地址由指令中的转移的目标地址由指令中的32位操作数给出位操
22、作数给出 例:例:JMP DWORD PTRBXXXHXXHXXHXXHBXIPCSJMP指令码指令码代代码码段段1代代码码段段2数数据据段段64无条件转移指令例(1)2000:0100 MOV AX,1200H(2)2000:0103 JMP NEXT (3)2000:0120 NEXT:MOV BX,1200H(4)JMP BX (5)2000:1200 65无条件转移指令例MOV SI,1122HMOV WORD PTRSI,0120HADD SI,2MOV WORD PTRSI,0122HJMP DWORD PTRSI-2JMP WORD PTRSIJMP1122H代代码码段段数数据据
23、段段01H22H20H01HIPCSIP662.条件转移指令在满足一定条件下,程序转移到目标地在满足一定条件下,程序转移到目标地址继续执行址继续执行条件转移指令均为段内短转移,即转移条件转移指令均为段内短转移,即转移 范围为:范围为:-128-+127p13267条件转移指令的应用几种条件转移指令的应用几种条件转移指令的应用JC/JNC判断判断CF的状态。常用于比大小的状态。常用于比大小JZ/JNZ判断判断ZF的状态。常用于循环体的结束判断的状态。常用于循环体的结束判断JO/JNO判断判断OF的状态。常用于有符号数溢出的判断的状态。常用于有符号数溢出的判断JP/JPE判断判断PF的状态。用于判
24、断运算结果低的状态。用于判断运算结果低8位中位中1的个数是否为偶数的个数是否为偶数JA/JAE/JB/JBE判断判断CF或或CF+ZF的状态。常用于无符号数的大小比较的状态。常用于无符号数的大小比较68转移指令例统计内存数据段中以统计内存数据段中以TABLE为首地址的为首地址的100个个8位符号数中正数、负数和零元数位符号数中正数、负数和零元数的个数。的个数。69转移指令例(流程图)将存放各元素个将存放各元素个数的单元清零数的单元清零取首地址取首地址设串长度设串长度取一个字节数取一个字节数正数个数加正数个数加1零元素加零元素加1为负?为负?为零?为零?负数个数加负数个数加1NYNY70二、循环
25、控制指令循环范围:循环范围:以当前以当前IP为中心的为中心的-128+127范围内循环。范围内循环。循环次数由循环次数由CX寄存器指定。寄存器指定。循环指令:循环指令:LOOP *LOOPZ *LOOPNZ无条件循环指令无条件循环指令条件循环指令条件循环指令71无条件循环指令格式:格式:LOOP LABEL循环条件:循环条件:CX 0操作:操作:DEC CX JNZ 符号地址符号地址72三、过程调用和返回用于调用一个子过程;用于调用一个子过程;子过程由程序员预先设计子过程由程序员预先设计 并装入内存并装入内存 子过程执行结束后要返回子过程执行结束后要返回 原调用处原调用处调用程序调用程序断点断
26、点入口入口地址地址子程序子程序73调用指令的执行过程保护断点;保护断点;将调用指令的下一条指令的地址(断点)压入堆栈将调用指令的下一条指令的地址(断点)压入堆栈获取子过程的入口地址;获取子过程的入口地址;子过程第子过程第1条指令的偏移地址条指令的偏移地址执行子过程,含相应参数的保存及恢复;执行子过程,含相应参数的保存及恢复;恢复断点,返回原程序。恢复断点,返回原程序。将断点偏移地址由堆栈弹出将断点偏移地址由堆栈弹出74过程调用段内调用段内调用段间调用段间调用段内直接调用段内直接调用段内间接调用段内间接调用段间直接调用段间直接调用段间间接调用段间间接调用751.段内调用被调用程序与调用程序在同一
27、代码段被调用程序与调用程序在同一代码段调用前只需保护断点的偏移地址调用前只需保护断点的偏移地址格式:格式:CALL NEAR PROC执行过程:执行过程:近过程名近过程名代码代码段段1调用程序调用程序被调用程序被调用程序代码代码段段1n 将断点的偏移地址压入堆栈将断点的偏移地址压入堆栈n 根据过程名找子程序入口根据过程名找子程序入口76段内调用例(1)CALL TIMRE(2)CALL WORD PTRSI直接调用直接调用间接调用间接调用44H33HCALL代代码码段段数数据据段段设:设:SI=1200H CS=6000H1200H执行第(执行第(2)条指令后:)条指令后:6000HCS=33
28、44HIP=772.段间调用子过程与原调用程序不在同一代码段子过程与原调用程序不在同一代码段先将断点的先将断点的CS压栈,再压入压栈,再压入IP。调用前需保护断点的段基地址和偏移地址调用前需保护断点的段基地址和偏移地址78段间调用例格式:格式:CALL FAR PROC格式例:格式例:CALL FAR TIMRECALL DWORD PTRSIXXHXXHCALL代代码码段段数数据据段段SIXXHXXHCSIP793.返回指令功能:功能:从堆栈中弹出断点地址,返回原程序从堆栈中弹出断点地址,返回原程序格式:格式:RETRETRETRET指令一般位于子程序的最后。指令一般位于子程序的最后。80四
29、、中断指令中断中断中断源中断源中断的类型中断的类型中断指令中断指令引起引起CPU产生一次中断的指令产生一次中断的指令81中断与过程调用:中断是随机事件或异常事件引起,调用则是事中断是随机事件或异常事件引起,调用则是事 先已在程序中安排好先已在程序中安排好;响应中断请求不仅要保护断点地址,还要保护响应中断请求不仅要保护断点地址,还要保护 FLAGS内容;内容;调用指令在指令中直接给出子程序入口地址,调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向中断指令只给出中断向量码,入口地址则在向 量码指向的内存单元中。量码指向的内存单元中。821.中断指令格式:格式:INT
30、 n说明:说明:n4中断类型码中断类型码n=0 255n 4 XXHXXHXXHXXH入口的段地址入口的段地址入口的偏移地址入口的偏移地址存放中断服务子程序入口存放中断服务子程序入口地址的单元的偏移地址地址的单元的偏移地址代代码码段段数数据据段段该单元在数据段,段地址该单元在数据段,段地址=DS83中断指令的执行过程将将FLAGS压入堆栈;压入堆栈;将将INT指令的下一条指令的指令的下一条指令的CS、IP压栈;压栈;由由n4得到存放得到存放中断向量的地址;中断向量的地址;将中断向量(中断服务程序入口地址)送将中断向量(中断服务程序入口地址)送CS和和IP寄存器;寄存器;转入中断服务程序。转入中
31、断服务程序。84中断指令的执行过程n4 22H11H00H67HIPCS68122HMOV代代码码段段数数据据段段堆堆栈栈段段SPFLAGSHFLAGSLIPHCSLCSHIPLSPSPSP85中断指令例执行程序段:执行程序段:CS IP 6200H:0110H INT 21H6200H:0112H MOV AX,BX 12H01H00H62HSP=1200FLAGSLFLAGSHSP=11FA执行执行INT指令后指令后堆堆栈栈段段86中断指令例执行执行INT 21H指令后指令后 IP=21H4 CS=(21H4)+20084H 23H11H00H20HIP CS数数据据段段代代码码段段XX2
32、1123H 中断服务子程序中断服务子程序872.溢出中断指令格式:格式:INTO 若若OF=1,OF=1,则启动一个类型为则启动一个类型为4 4的中断过程的中断过程,给出给出一个出错标志一个出错标志,如果如果OF=0,OF=0,不做任何操作。不做任何操作。INTOINTO指令通常安排在有符号数加减运算指令之指令通常安排在有符号数加减运算指令之后。后。相当于相当于INT 4883.中断返回指令格式:格式:IRET中断服务程序的最后一条指令,负责中断服务程序的最后一条指令,负责恢复断点恢复断点恢复标志寄存器内容恢复标志寄存器内容89六、处理器控制指令对标志位的操作对标志位的操作与外部设备的同步与外部设备的同步说明见说明见p139表表90本章课外自学内容:BCDBCD码调整指令码调整指令远地址指针指令远地址指针指令LDSLDS,LESLES条件循环指令条件循环指令LOOPZLOOPZ,LOOPNZLOOPNZPentiumPentium新增指令新增指令91结束语:掌握:掌握:指令的格式及意义;指令的格式及意义;指令对操作数的要求及对标志位的影响;指令对操作数的要求及对标志位的影响;指令的应用。指令的应用。92第3章作业作业请从电子教室网站下载作业请从电子教室网站下载本章书后全部题目均可作为思考题本章书后全部题目均可作为思考题