
微机课件第3章2文档资料.ppt
91页18086指令系统指令系统((2))2逻辑运算和移位指令3指令类型n逻辑运算运算n与,或,非,异或与,或,非,异或n移位操作移位操作n非循非循环移位,循移位,循环移位移位4 一、逻辑运算n逻辑运算指令运算指令对 操作数的操作数的 要求大多与要求大多与MOV指令指令 相同n“非非”运算指令运算指令 要求操作数要求操作数 不能是立即数;不能是立即数;n除除“非非”运算指令运算指令 外,其余指令的外,其余指令的执行都会行都会使使标志位志位OF=CF=051.“与”指令:n格式:格式: n AND OPRD1,,OPRD2n操作:操作: n两操作数相两操作数相“与与”,,结果送目果送目标地址6“与”指令的应用n实现两操作数按位相与的运算两操作数按位相与的运算nAND BL,,[SI]n使目使目标操作数的某些位不操作数的某些位不变,某些位清零,某些位清零nAND AL,,0FHn在操作数不在操作数不变的的 情况下使情况下使CF和和OF清零清零nAND AX,,AX7“与”指令应用例n从地址从地址为3F8H 端口中端口中读入一个字入一个字节数,数,如果如果该数数 bit1位位为1,,则可从可从38FH端口端口将将DATA为首地址的一个字首地址的一个字输出,否出,否则就不就不能能进行数据行数据传送。
送 编写相写相应的程序段的程序段8“与”指令应用例开开 始始取待输出数的取待输出数的偏移地址偏移地址读入状态字读入状态字测试测试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.“或”运算指令n格式:格式: nOR OPRD1,,OPRD2n操作:操作: n两操作数相两操作数相“或或”,,结果送目果送目标地址地址11“或”指令的应用n实现两操作数两操作数 相相 “或或”的的 运算运算nOR AX,,[DI]n使某些位不使某些位不变,某些位置,某些位置“1”nOR CL,,0FHn在不改在不改变操作数的操作数的 情况下使情况下使OF=CF=0nOR AX,,AX12“或”指令的应用例 OR AL,,AL JPE GOON OR AL,,80H GOON::….PF=1转移转移13“或”指令的应用将一个二进将一个二进制数制数9变为字变为字符符‘9’如何实现如何实现??143.“非”运算指令n格式:格式:nNOT OPRDNOT OPRDn操作:操作:n操作数按位取反再送回原地址操作数按位取反再送回原地址n注:注:n指令中的操作数不能是立即数指令中的操作数不能是立即数n指令的指令的执行行对标志位无影响志位无影响n例:例:NOT BYTE PTR[BX]NOT BYTE PTR[BX]154.“异或”运算指令n格式:格式: nXOR OPRD1,,OPRD2n操作:操作:n两操作数相两操作数相“异或异或”,,结果送目果送目标地址地址n例:例: XOR BL,,80H XOR AX,,AX165.“测试”指令n格式:格式: nTEST OPRD1,,OPRD2n操作:操作: n执行行“与与”运算,但运算的运算,但运算的结果不送回目果不送回目标地址。
地址n应用:用:n常用于常用于测试某些位的状某些位的状态17例:n从地址从地址为3F8H的的 端口中端口中读入一个字入一个字节数,数,当当该数的数的 bit1,, bit3,, bit5位同位同时为1时,,可从可从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二、移位指令 非循非循环移位指令移位指令 循循环移位指令移位指令注:注:n 移动一位时由指令直接给出;移动一位时由指令直接给出;n 移动两位及以上,则移位次数由移动两位及以上,则移位次数由CL指定。
指定201. 非循环移位指令n逻辑左移左移n算算术左移左移n逻辑右移右移n算算术右移右移21算术左移和逻辑左移n算算术左移指左移指 令:令: SAL OPRD,,1 SAL OPRD,,CLn逻辑左移指左移指 令:令: SHL OPRD,,1 SHL OPRD,,CL有符号数有符号数无符号数无符号数22逻辑右移n格式:格式: SHR OPRD,,1 SHR OPRD,,CL0CF无符号数无符号数的右移的右移23逻辑右移例:nMOV AL,,68HnMOV CL,,2nSHR 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算术右移n格式:格式: SAR OPRD,,1 SAR OPRD,,CL有符号数有符号数的右移的右移CF25非循环移位指令的应用n左移可左移可实现乘法运算乘法运算n右移可右移可实现除法运算除法运算 教材教材教材教材p121p121例例例例262. 循环移位指令n不不带进位位的循位位的循环移位移位n带进位位的循位位的循环移位移位左移左移 ROL右移右移 ROR左移左移 RCL右移右移 RCR指令格式、对操作数的要求与非循环移位指令相同指令格式、对操作数的要求与非循环移位指令相同27不带进位位的循环移位CFCF28带进位位的循环移位CFCF29循环移位指令的应用n用于用于对某些位状某些位状态的的测试;;n高位部分和低位部分的交高位部分和低位部分的交换;;n与非循与非循环移位指令一起移位指令一起组成成32位或更位或更长字字长数的移位。
数的移位P124例例3-34P124例例3-3530程序功能n将将10001000H H开开始始存存放放的的4 4个个压缩BCDBCD码转换为 ASCIIASCII码 存存 放放 在在30003000H H开开始始的的单元元中中去┇ ┇┇ ┇12H34H56H78H┇ ┇1000H3000H31程序例 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,4SHR AL,CLSHR AL,CLOR AL,30HOR AL,30HMOV [DI],ALMOV [DI],ALINC DIINC DIINC SIINC SIPOP CXPOP CXDEC CXDEC CXJNZ NextJNZ NextHLTHLT32串操作指令33串操作指令说明n针对数据数据块或字符串的操作;或字符串的操作;n可可实现存存储器到存器到存储器的数据器的数据传送;送;n待操作的数据串称待操作的数据串称为源串,目源串,目标地址称地址称为目目标串。
串34串操作指令的特点n源串一般存放在数据段,偏移地址由源串一般存放在数据段,偏移地址由SI指定允许段段重重设;;n目目标串必串必须在附加段,偏移地址由在附加段,偏移地址由DI指定;指定;n指令自指令自动修改地址指修改地址指针,修改方向由,修改方向由DF决定 DF=0 DF=1n数据数据块长度度值由由CX指定指定n可增加自可增加自动重复前重复前缀以以实现自自动修改修改CX内容增地址方向;增地址方向;减地址方向;减地址方向;35重复前缀n无条件重复无条件重复nREPn条件重复条件重复nREPE 相等重复相等重复nREPZ 为零重复零重复nREPNE 不相等重复不相等重复nREPNZ 不不为零重复零重复CX≠0 ZF=1CX≠0 ZF=0CX≠0 重复重复36串操作指令n串串传送送 MOVSn串比串比较 CMPSn串串扫描描 SCASn串装入串装入 LODSn串送存串送存 STOS37串操作指令流程(以传送操作为例)取源串地址取源串地址取目标串地址取目标串地址设串长度设串长度传送一个字节或字传送一个字节或字修改地址指针修改地址指针修改串长度值修改串长度值传送完否?传送完否?NY设操作方向设操作方向381. 串传送指令n格式:格式: MOVS OPRD1,,OPRD2 MOVSB MOVSWn串串传送指令常与无条件重复前送指令常与无条件重复前缀连用用39串传送指令n对比用比用MOV指令和指令和MOVS指令指令实现将将200个字个字节数据从内存的一个区域送到数据从内存的一个区域送到另一个区域的程序段。
另一个区域的程序段P104例例3-1240串传送指令例n用串用串传送指令送指令实现200个字个字节数据的数据的传送:送: LEA SI,,MEM1 LEA DI,,MEM2 MOV CX,,200 CLD REP MOVSB HLT412. 串比较指令n格式:格式: CMPS OPRD1,,OPRD2 CMPSB CMPSWn串比串比较指令常与条件重复前指令常与条件重复前缀连用,指令的用,指令的执 行不改行不改变操作数,操作数,仅影响影响标志位n前前缀的操作的操作对标志位不影响志位不影响42串比较指令例测试200个字个字节数据是否数据是否传送正确:送正确:LEA SI,,MEM1LEA DI,,MEM2MOV CX,,200CLD REPE CMPSB TEST CX,,00FFH JZ STOP DEC SI MOV AL,,[SI] MOV BX,,SISTOP::HLT 433. 串扫描指令n格式:格式: SCAS OPRD SCASB SCASWn执行与行与CMPS指令相似的操作,只是指令相似的操作,只是这里的源里的源 操作数是操作数是AX或或AL目目 标标操作数操作数44串扫描指令的应用n常用于在指定存常用于在指定存储区域中区域中寻找某个关找某个关键字。
字 教材教材p127例例454. 串装入指令n格式:格式: LODS OPRD LODSB LODSWn操作:操作:n对字字节::n对 字:字:源操作数源操作数[DS:SI][DS:SI][DS:SI][DS:SI]ALALAXAX464. 串装入指令n用于将内存某个区域的数据串依次装入累加用于将内存某个区域的数据串依次装入累加 器,以便器,以便显示或示或输出到接口出到接口nLODS指令一般不加重复前指令一般不加重复前缀475. 串存储指令n格式:格式: STOS OPRD STOSB STOSWn操作:操作:n对字字节:: ALALn对 字:字: AXAX目目 标标操作数操作数[ES:DI][ES:DI]48串存储指令的应用n常用于将内存某个区域置同常用于将内存某个区域置同样的的值n此此时::n将待送存的数据放入将待送存的数据放入AL(字(字节数)或数)或AX(字数据);(字数据);n确定操作方向(增地址确定操作方向(增地址/减地址)和区域大小(串减地址)和区域大小(串长度度值););n使用串存使用串存储指令指令+无条件重复前无条件重复前缀,,实现数据数据传送。
送49串存储指令例n将内存某将内存某单元清零元清零nP129例例3-4050串操作指令应用注意事项n需要定需要定义附加段附加段n目目标操作数必操作数必须在附加段在附加段n需要需要设置数据的操作方向置数据的操作方向n确定确定DF的状的状态n源串和目源串和目标串指串指针分分别为SI和和DIn串串长度度值必必须由由CX给出出n注意重复前注意重复前缀的使用方法的使用方法n传送送类指令前加无条件重复前指令前加无条件重复前缀n串比串比较类指令前加条件重复前指令前加条件重复前缀,但前,但前缀不影响不影响ZF状状态51程序控制指令n转移指令转移指令n循环控制循环控制n过程调用过程调用n中断控制中断控制52程序的执行方向n程序控制程序控制类指令的本指令的本质是:是:n控制程序的控制程序的执行方向行方向n决定程序决定程序执行方向的因素:行方向的因素:nCS,,IPn控制程序控制程序执行方向的方法:行方向的方法:n修改修改CS 和和IP ,,则程序程序转向另一个代向另一个代码段段执行;行;n仅修改修改IP,,则程序将改程序将改变当前的当前的执行行顺序,序,转向本向本代代码段内其它某段内其它某处执行53一、转移指令无条件无条件转移指令移指令 无条件无条件转移到目移到目标地址,地址,执行新的指令行新的指令有条件有条件转移指令移指令 在具在具备一定条件的情况下一定条件的情况下转移到目移到目标地址地址通过修改指令的通过修改指令的偏移地址偏移地址或或段地址及偏移地址段地址及偏移地址实现程序的转移实现程序的转移541. 无条件转移指令n格式:格式: JMP OPRD目标地址目标地址与与JMP在同在同一代码段一代码段与与JMP不在同不在同一代码段一代码段原则上可实现在整个内存空间的转移原则上可实现在整个内存空间的转移55无条件段内转移n转移的移的目目标地址地址在当前代在当前代码段内,段地址不段内,段地址不 改改变。
n即:即:目目标地址地址是是16位偏移地址位偏移地址指令中直接给出指令中直接给出目标地址目标地址由指令中的寄存器或由指令中的寄存器或存储器操作数指出目存储器操作数指出目标地址标地址段内直接转移段内直接转移段内间接段内间接转移转移56段内直接转移n转移的目移的目标地址由指令直接地址由指令直接给出出n格式:格式:nJMP Label近地址标号近地址标号57段内直接转移示图JMPLabel┇ ┇┇ ┇┇ ┇代代码码段段位移量位移量下一条要执行指令的偏移地址下一条要执行指令的偏移地址=当前当前IP+位移量位移量JMP Label58段内间接转移n段内段内间接接转移移n转移的目移的目标地址存放在某个地址存放在某个16位寄存器或存位寄存器或存储器器 的某两个的某两个单元中元中n例:例:nJMP BXn若:若:BX=1200Hn则::转移的目移的目标地址地址=1200HJMP┇ ┇┇ ┇代代码码段段1200HMOV59段内间接转移例nJMP WORD PTR[BX] 设::BX=1200HJMP┇ ┇┇ ┇┇ ┇代代码码段段数数据据段段BX=1200┇ ┇XXHXXHIP指令码指令码60无条件段间转移n转移的移的目目标地址地址不在当前代不在当前代码段内。
段内n目目标地址地址为32位,包括段地址和偏移地址位,包括段地址和偏移地址指令中直接给出指令中直接给出目标地址目标地址由指令中的由指令中的32位存储器位存储器操作数指出目标地址操作数指出目标地址段间直接转移段间直接转移段间间接转移段间间接转移61段间直接转移n段内直接段内直接转移移n转移的目移的目标地址由指令直接地址由指令直接给出出n格式:格式:nJMP FAR Label远地址标号远地址标号62段间直接转移示图JMPLabel┇ ┇┇ ┇┇ ┇代代码码段段1Label与与JMP之间的位移量之间的位移量代代码码段段2XXHXXHXXHXXHIPCS63段间间接转移n段内段内间接接寻址址n转移的目移的目标地址由指令中的地址由指令中的32位操作数位操作数给出出n 例:例:nJMP DWORD PTR[BX]XXHXXHXXHXXHBXIPCSJMP┇ ┇┇ ┇┇ ┇┇ ┇指令码指令码代代码码段段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无条件转移指令例nMOV SI,,1122HnMOV WORD PTR[SI],,0120HnADD SI,,2nMOV WORD PTR[SI],,0122HJMP DWORD PTR[SI-2]JMP WORD PTR[SI]JMP1122H┇ ┇┇ ┇┇ ┇代代码码段段数数据据段段01H22H20H01HIPCSIP662. 条件转移指令n在在满足一定条件下,程序足一定条件下,程序转移到目移到目标地址地址继续执行行n条件条件转移指令均移指令均为段内短段内短转移,即移,即转移移 范范围为:: -128------+127p13267条件转移指令的应用n几种条件几种条件转移指令的移指令的应用用nJC/JNCn判断判断CF的状态。
常用于比大小的状态常用于比大小nJZ/JNZn判断判断ZF的状态常用于循环体的结束判断的状态常用于循环体的结束判断nJO/JNOn判断判断OF的状态常用于有符号数溢出的判断的状态常用于有符号数溢出的判断nJP/JPEn判断判断PF的状态用于判断运算结果低的状态用于判断运算结果低8位中位中1的个数是否为偶数的个数是否为偶数nJA/JAE/JB/JBEn判断判断CF或或CF+ZF的状态常用于无符号数的大小比较的状态常用于无符号数的大小比较68转移指令例n统计内存数据段中以内存数据段中以TABLE为首地址的首地址的100个个8位符号数中正数、位符号数中正数、负数和零元数数和零元数的个数69转移指令例(流程图)将存放各元素个将存放各元素个数的单元清零数的单元清零取首地址取首地址设串长度设串长度取一个字节数取一个字节数正数个数加正数个数加1零元素加零元素加1为负?为负?为零?为零?负数个数加负数个数加1NYNY70二、循环控制指令n循循环范范围::n以当前以当前IP为中心的中心的-128~~+127范范围内循内循环n循循环次数由次数由CX寄存器指定寄存器指定n循循环指令:指令:LOOP *LOOPZ *LOOPNZ无条件循环指令无条件循环指令条件循环指令条件循环指令71无条件循环指令n格式:格式: LOOP LABELn循循环条件:条件: CX ≠ 0n操作:操作: DEC CX JNZ 符号地址符号地址72三、过程调用和返回n用于用于调用一个子用一个子过程;程;n子子过程由程序程由程序员预先先设计 并装入内存并装入内存 n子子过程程执行行结束后要返回束后要返回 原原调用用处调用程序调用程序断点断点入口入口地址地址子程序子程序73调用指令的执行过程n保保护断点;断点;n将将调用指令的下一条指令的地址(断点)用指令的下一条指令的地址(断点)压入堆入堆栈n获取子取子过程的入口地址;程的入口地址;n子子过程第程第1条指令的偏移地址条指令的偏移地址n执行子行子过程,含相程,含相应参数的保存及恢复;参数的保存及恢复;n恢复断点,返回原程序。
恢复断点,返回原程序n将断点偏移地址由堆将断点偏移地址由堆栈弹出出74过程调用段内段内调用用段段间调用用段内直接调用段内直接调用段内间接调用段内间接调用段间直接调用段间直接调用段间间接调用段间间接调用751. 段内调用n被被调用程序与用程序与调用程序在同一代用程序在同一代码段段n调用前只需保用前只需保护断点的偏移地址断点的偏移地址n格式:格式: CALL NEAR PROCn执行行过程:程:近过程名近过程名代码代码段段1调用程序调用程序被调用程序被调用程序代码代码段段1n 将断点的偏移地址压入堆栈将断点的偏移地址压入堆栈n 根据过程名找子程序入口根据过程名找子程序入口76段内调用例((1))CALL TIMRE((2))CALL WORD PTR[SI]直接调用直接调用间接调用间接调用44H33HCALL代代码码段段数数据据段段┇ ┇设:设:SI=1200H CS=6000H1200H执行第(执行第(2)条指令后:)条指令后:6000HCS =3344HIP =772. 段间调用n子子过程与原程与原调用程序不在同一代用程序不在同一代码段段n先将断点的先将断点的CS压栈,再,再压入入IP。
调用前需保护断点的段基地址和偏移地址调用前需保护断点的段基地址和偏移地址78段间调用例n格式:格式: CALL FAR PROCn格式例:格式例:nCALL FAR TIMREnCALL DWORD PTR[SI]XXHXXHCALL代代码码段段数数据据段段┇ ┇SIXXHXXHCSIP793. 返回指令n功能:功能:n从堆从堆栈中中弹出断点地址,返回原程序出断点地址,返回原程序n格式:格式: RETRETnRETRET指令一般位于子程序的最后指令一般位于子程序的最后80四、中断指令n中断中断n中断源中断源n中断的中断的类型型n中断指令中断指令n引起引起CPU产生一次中断的指令生一次中断的指令81中断与过程调用:n中断是随机事件或异常事件引起,中断是随机事件或异常事件引起,调用用则是事是事 先已在程序中安排好先已在程序中安排好 ;; n响响应中断中断请求不求不仅要保要保护断点地址,断点地址,还要保要保护 FLAGS内容;内容;n调用指令在指令中直接用指令在指令中直接给出子程序入口地址,出子程序入口地址, 中断指令只中断指令只给出中断向量出中断向量码,入口地址,入口地址则在向在向 量量码指向的内存指向的内存单元中。
元中821. 中断指令n格式:格式: INT nn说明:明: nх4中断类型码中断类型码n=0 〜〜 255n х4 XXHXXHXXHXXH入口的段地址入口的段地址入口的偏移地址入口的偏移地址存放中断服务子程序入口存放中断服务子程序入口地址的单元的偏移地址地址的单元的偏移地址代代码码段段数数据据段段┇ ┇该单元在数据段,段地址该单元在数据段,段地址=DS┇ ┇83中断指令的执行过程n将将FLAGS压入堆入堆栈;;n将将INT指令的下一条指令的指令的下一条指令的CS、、IP压栈;;n由由n×4得到存放得到存放中断向量的地址;中断向量的地址;n将中断向量(中断服将中断向量(中断服务程序入口地址)送程序入口地址)送CS和和IP寄存器;寄存器;n转入中断服入中断服务程序84中断指令的执行过程n×4 22H11H00H67HIPCS68122HMOV代代码码段段数数据据段段┇ ┇堆堆栈栈段段SPFLAGSHFLAGSLIPHCSLCSHIPL┇ ┇SPSPSP85中断指令例执行程序段:行程序段: CS IP ┇┇6200H:0110H INT 21H6200H:0112H MOV AX,,BX ┇┇12H01H00H62HSP=1200FLAGSLFLAGSHSP=11FA执行执行INT指令后指令后堆堆栈栈段段86中断指令例n执行行INT 21H指令后指令后 IP=[21Hх4] CS==[((21Hх4))+2]0084H 23H11H00H20HIP CS数数据据段段┇ ┇┇ ┇┇ ┇代代码码段段XX21123H 中断服中断服务子程序子程序872. 溢出中断指令n格式:格式: INTO n若若OF=1,OF=1,则启启动一个一个类型型为4 4的中断的中断过程程, ,给出出一个出一个出错标志志, ,如果如果OF=0,OF=0,不做任何操作。
不做任何操作nINTOINTO指令通常安排在有符号数加减运算指令之指令通常安排在有符号数加减运算指令之后相当于相当于INT 4883. 中断返回指令n格式:格式: IRETn中断服中断服务程序的最后一条指令,程序的最后一条指令,负责恢复断点恢复断点恢复标志寄存器内容恢复标志寄存器内容89六、处理器控制指令对标志位的操作志位的操作与外部与外部设备的同步的同步说明见说明见p139表表90本章课外自学内容:nBCDBCD码调整指令整指令n远地址指地址指针指令指令LDSLDS,,LESLESn条件循条件循环指令指令LOOPZLOOPZ,,LOOPNZLOOPNZnPentiumPentium新增指令新增指令91结束语:掌握:掌握:n指令的格式及意指令的格式及意义;;n指令指令对操作数的要求及操作数的要求及对标志位的影响;志位的影响;n指令的指令的应用。
