3.3.4 串处理指令

Post on 18-Mar-2016

72 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

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 )不相等 /不为零则重复

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 )

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

• 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

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

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

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

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

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

与 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 )不同外,均相同。

• 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

• 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 结合应用的情况。• 具体见演示。

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

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

• 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

• 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

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

• 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 来实现。

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

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

• ( 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 是利用堆栈传递参数占用的字节数,程序返回时,要释放这些堆栈空间。

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

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

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

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

top related