22
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 串串串 / 串串串串串串

3.3.4 串处理指令

  • Upload
    ovid

  • View
    72

  • Download
    2

Embed Size (px)

DESCRIPTION

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 ) 串比较 - PowerPoint PPT Presentation

Citation preview

Page 1: 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 ) 串比较SCAS ( scan string ) 串扫描REP ( repeat ) 串操作重复前缀REPE/REPZ ( repeat while equal /zero ) 相等 / 为零则重复REPNE/REPNZ ( repeat while not equal/not zero )不相等 /不为零则重复

Page 2: 3.3.4   串处理指令

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 )

Page 3: 3.3.4   串处理指令

有关串指令使用的准备工作及操作数 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 ,变址寄存器减量

Page 4: 3.3.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

Page 5: 3.3.4   串处理指令

例 3.70 在数据段中有一个字符串,其长度为 17 ,要求将它传送到附加段的一个缓冲区中,• 假设源串起始地址是 MESS1 ,目的串起始地址是 ME

SS2 ,程序段如下:• .• .• Lea si , mess1• Lea di , mess2• Mov cx,17• Lcd • Rep movsb• .• .

Page 6: 3.3.4   串处理指令

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

Page 7: 3.3.4   串处理指令

• ( 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

Page 8: 3.3.4   串处理指令

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

Page 9: 3.3.4   串处理指令

与 REPE/REPZ 和 REPNE/EPNZ 联合工作的 CMPS 和 SCAS 指令

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

Page 10: 3.3.4   串处理指令

• 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

Page 11: 3.3.4   串处理指令

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

EPZ 或 REPNE/REPNZ 结合应用的情况。• 具体见演示。

Page 12: 3.3.4   串处理指令

3.3.5 控制转移指令• 1. 无条件转移指令• JMP OPR• OPR 由段内直接寻址、间接寻址,短间直接寻址、间接寻址确定。• 2. 条件转移指令• 一般格式: Jcc OPR ; Jcc 代表指令助记符, OP

R 代表目标地址,是一个短标号。• 按测试条件划分四类:• 1 )根据单个条件标志的设置情况转移• JZ/JE OPR ;测试 ZF=1• JNE/JNZ OPR ;测试 ZF=0

Page 13: 3.3.4   串处理指令

• 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 ;测试 CFZF=1• JNBE/JA OPR ;测试 CF ZF=0

Page 14: 3.3.4   串处理指令

• 3 )比较两个带符号数,并根据比较的结果转移• JL/JNGE OPR ; 测试 SFOF=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

Page 15: 3.3.4   串处理指令

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

Page 16: 3.3.4   串处理指令

• 4. 循环指令• ( 1 ) LOOP OPR• OPR 是一个短标号• 测试条件是 CX/ECX0• ( 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 来实现。

Page 17: 3.3.4   串处理指令

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

Page 18: 3.3.4   串处理指令

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

Page 19: 3.3.4   串处理指令

• ( 2 ) RET 返回指令• 该指令写在子程序的末尾,有两种格式• RET• RET EXP ;可计算出值的常量表达式• 在以上四种 CALL 转移寻址方式对应的 RET 均采用这两种格式。• RET 的执行,弹出对应 CALL 保护的断点地址 IP 的值或 CS 和 IP 的值。• RET EXP 的执行,先弹出对应 CALL 保护的断点地址 IP 的值或 CS 和 IP 的值,之后用 EXP 的值修改堆栈指针 SP 或 ESP ( SP 或 ESP ) ( SP 或 ES

P ) +D16 ,这里 EXP 的值 D16 是利用堆栈传递参数占用的字节数,程序返回时,要释放这些堆栈空间。

Page 20: 3.3.4   串处理指令

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

KB 存储区就叫中断向量表。• 中断指令的执行:先保护现场和断点,而后更新指令指针转移去中断服务程序。

Page 21: 3.3.4   串处理指令

• 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 从中断返回

Page 22: 3.3.4   串处理指令

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