1 / 22

3.3.4 串处理指令

3.3.4 串处理指令. MOVS ( move string ) 串传送 LODS ( load from string ) 从串取 STOS ( store in to string ) 存入串 INS ( input from port to string )串输入 OUTS ( output string to port ) 串输出 CMPS ( compare string ) 串比较

ovid
Download Presentation

3.3.4 串处理指令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 3.3.4 串处理指令 MOVS(move string) 串传送 LODS(load from string) 从串取 STOS(store in to string) 存入串 INS(input from port to string)串输入 OUTS(output string to port) 串输出 CMPS(compare string) 串比较 SCAS(scan string) 串扫描 REP(repeat) 串操作重复前缀 REPE/REPZ(repeat while equal /zero) 相等/为零则重复 REPNE/REPNZ(repeat while not equal/not zero)不相等/不为零则重复

  2. 1.与REP相配合工作的MOVS,STOS,LODS,INS,OUTS指令1.与REP相配合工作的MOVS,STOS,LODS,INS,OUTS指令 • 1)REP 重复串操作直到计数寄存器CX/ECX的内容为0为止。 • 格式:REP STRING PRIMITIVE • PRIMITIVE可以是MOVS、STOS、LODS、INS和PUTS中的任何一个。 • 操作: (1)判断计数器CX/ECX的值为0?如果为0,则退出REP;否则,往下执行。 • (2)(CX)(CX)—1 • (3)执行其后的串指令 • (4)重复(1)—(3)

  3. 有关串指令使用的准备工作及操作数DST、SRC的隐含规定有关串指令使用的准备工作及操作数DST、SRC的隐含规定 • 一般串指令后没有操作数,是隐含在指定存储单元, • 源串SRC存放在由DS和SI指定的数据段存储单元为起始地址(源串起始地址) • 目的串DST存放在附加段,目的串的起始地址由ES和DI指定。 • 使用串指令前的准备工作: • (1)将源串的起始地址(首地址或末地址)放入源变址寄存器SI或ESI, • (2)将目的串的起始地址(首地址或末地址)放入目的变址寄存器DI或EDI, • (3)把数据串长度存入计数寄存器CX或ECX • (4) 设置方向标志DF • 用CLD使DF=0,变址寄存器增量 • 用STD使DF=1,变址寄存器减量

  4. 2)MOVS • 格式有四种: • MOVS DST,SRC ;一般不用这种形式 • MOVSB ;字节 • MOVSW ;字 • MOVSD ;双字(386及以后机型) • 操作: • (1)串数据传送((DI))((SI)) • (2)修改变址寄存器:串内元素地址移动,增地址+,减地址- • 字节操作: (SI) (SI)  1;DF=0用+ • (DI) (DI) 1;DF=1用- • 字操作: (SI)  (SI)  2 • (DI)  (DI) 2 • 双字操作: (SI)  (SI)  4 • (DI) (DI)  4

  5. 例3.70 在数据段中有一个字符串,其长度为17,要求将它传送到附加段的一个缓冲区中, • 假设源串起始地址是MESS1,目的串起始地址是MESS2,程序段如下: • . • . • Lea si , mess1 • Lea di , mess2 • Mov cx,17 • Lcd • Rep movsb • . • .

  6. (3) STOS 存入串指令 • 格式:STOS DST • STOSB ; • STOSW ; • STOSD ; • 操作:将累加器AC中的内容传送到由目的变址寄存器间接寻址的目的串存储单元中,并修改变址寄存器, • ((ES,DI))(AC) • (AC)  (AC) 字节长度 • 用的累加器AC是AL、AX、EAX • 目的变址寄存器是DI

  7. (4)LODS 从串取指令 • 格式: • LODS SRC • LODSB • LODSW • LODSD • 操作: (AC)  ((source-index)),修改源变址寄存器 • 字节操作 : (AL)  ((source-index)) • (Source- index )  (source- index) ±1 • 字操作: (AX)  ((source- index)) • (source - index  (source- index )±2 • 双字操作:(EAX) ((source- index)) • (Source- index) (source- index) ±4

  8. (5)INS 串输入指令 • (6)OUTS 串输出指令

  9. 与REPE/REPZ和REPNE/EPNZ联合工作的 CMPS和SCAS指令 • 1)REPE/REPZ 当相等/为零时重复串操作 • 格式: REPE/REPZ string primitive • String primitive 是CMPS或SCAS指令 • 操作:实际上重复做的条件是CX0且ZF=1 • (1)如果CX=0或ZF=0,则退出,否则往下执行, • (2)(CX)(CX)—1 • (3)执行串指令一次, • (4)重复(1)--(3) • 2)REPNE/REPNZ 当不相等/不为零时重复操作 • 重复的条件是CX 0且ZF =0,否则退出。除(1)不同外,均相同。

  10. 3)CMPS 串比较指令 • 格式: CMPS SRC,DST • CMPSB (字节) • CMPSW (字) • CMPSD (双字) • 操作: • (1)串元素比较 ( (source-index) ) ( ( destination-index) ) • (2) 修改串内地址 • 字节操作: (source-index) (source-index) 1 • (destination-index)  (destination-index) 1 • 字操作: (source-index)  ( source-index )2 • (destination-index)  ( destination-index )2 • 双字操作: (source-index)  ( source-index) 4 • (destination-index )  (destination-index )4

  11. 4)SCAS 串扫描指令 • 格式: SCAS DST • SCASB (字节) • SCASW (字) • SCASD (双字) • 操作: 拿累加器AC的内容减去目的串中由DI间接寻址的元素,做等与不等的比较。影响ZF位。 • (AC)—((destination-index)) • 同时修改目的变址寄存器DI的值(元素长) • 例3.72和例3.73说明SCAS和CMPS指令与REPE/REPZ或REPNE/REPNZ结合应用的情况。 • 具体见演示。

  12. 3.3.5 控制转移指令 • 1.无条件转移指令 • JMP OPR • OPR由段内直接寻址、间接寻址,短间直接寻址、间接寻址确定。 • 2.条件转移指令 • 一般格式:Jcc OPR ;Jcc代表指令助记符,OPR代表目标地址,是一个短标号。 • 按测试条件划分四类: • 1)根据单个条件标志的设置情况转移 • JZ/JE OPR ;测试ZF=1 • JNE/JNZ OPR ;测试ZF=0

  13. JS OPR ;测试SF=1 • JNS OPR ;测试SF=0 • JO OPR ;测试OF=1 • JNO OPR ;测试OF=0 • JP OPR ;测试PF=1 • JNP OPR ;测试PF=0 • JB/JNAE/JC OPR ;测试CF=1 • JNB/JAE/JNC OPR ;测试CF=0 • 2)比较两个无符号数,并根据比较的结果转移 • JB/JNAE/JC OPR ;测试CF=1 • JNB/JAE/JNC OPR ;测试CF=0与上面的两条相同 • JBE/JNA OPR ;测试CFZF=1 • JNBE/JA OPR ;测试CF  ZF=0

  14. 3)比较两个带符号数,并根据比较的结果转移3)比较两个带符号数,并根据比较的结果转移 • JL/JNGE OPR ;测试 SFOF=1 • JNL/JGE OPR ;测试 SF  OP=0 • JLE/JNG OPR ;测试 (SF  OF ) ZF=1 • JNLE/JG OPR ;测试 (SF  OF)  ZF=0 • 4)测试CX或ECX的值为0则转移指令 • JCXZ OPR ;测试(CX)=0 • JECX OPR ;测试(ECX)=0

  15. 3.条件设置指令(自学)

  16. 4.循环指令 • (1)LOOP OPR • OPR是一个短标号 • 测试条件是CX/ECX0 • (2)LOOPE/LOOPZ OPR • 测试条件是ZF=1且CX/ECX  0 • (3)LOOPNE/LOOPNZ OPR • 测试条件是ZF=0且CX/ECX  0 • 这三条指令的执行过程: • (1)计数寄存器减1(Count Reg)(Count Reg)—1 • (2)测试循环转移的条件,如果满足,则转移到OPR • 的程序入口处,即用(IP) (IP)+D8或 • (EIP) (EIP)+D8来实现。

  17. 5.子程序(subroutine) • 调用子程序指令CALL • 子程序中的返回指令RET • (1)CALL 指令 • 格式:CALL DST • DST是调用转移的目标地址,它的寻址方式有四种,分为段内直接、段内间接、段间直接和段间间接。 • 指令执行的实质是: • 子程序和调用指令在同一段内时,IP的值更换成子程序的偏移地址; • 子程序在另外的段时,CS和IP的值被分别更换成子程序的段地址和偏移地址。

  18. 在指令转移之前,要保护断点,将断点的地址入栈,即(CS)和(IP)入栈。在指令转移之前,要保护断点,将断点的地址入栈,即(CS)和(IP)入栈。 • 例如段内间接近调用指令执行的描述: • 16位操作数时,PUSH (IP) ;IP的值入栈, • (IP)(EA) ;更新IP值 • 32位操作数时,PUSH (EIP);EIP入栈 • (EIP) (EA);更新EIP值 • 其他三种自学

  19. (2)RET 返回指令 • 该指令写在子程序的末尾,有两种格式 • RET • RET EXP ;可计算出值的常量表达式 • 在以上四种CALL转移寻址方式对应的RET均采用这两种格式。 • RET 的执行,弹出对应CALL保护的断点地址IP的值或CS和IP的值。 • RET EXP 的执行,先弹出对应CALL保护的断点地址IP的值或CS和IP的值,之后用EXP的值修改堆栈指针SP或ESP(SP或ESP)  (SP或ESP)+D16,这里EXP的值D16是利用堆栈传递参数占用的字节数,程序返回时,要释放这些堆栈空间。

  20. 6. 中断 • 某个事件是CPU暂停正在执行的程序,转去处理该事件,处理完毕再返回,继续执行原来的程序。提供这种功能的指令是中断指令: • (1)INT N ;N是中断类型号,系统给每一个中断服务程序分配一个类型号。 • 系统按中断类型号的顺序将它们的服务程序的地址(4字节)依次存放在内存最低的1KB的存储区域内,中断服务程序的地址就叫中断向量,存放中断向量的那1KB存储区就叫中断向量表。 • 中断指令的执行:先保护现场和断点,而后更新指令指针转移去中断服务程序。

  21. PUSH (FLAGS) • IF  0 • TF  0 • AC  0 • PUSH (CS) • PUSH (IP) • (IP)  (TYPE*4) • (CS)  (TYPE*4+2) • ********************************* • (2)INTO 若溢出则中断,4号中断 • (3)IRET 从中断返回 • (4)IRETD 从中断返回

  22. 3.3.6处理器控制与杂项操作指令 • 自学

More Related