大工13春汇编语言程序设计辅导资料五
大工13春汇编语言程序设计辅导资料五主 题:第三章80x86指令系统和寻址方式(第3节)
学习时间:2013年4月29日-5月5日
内 容:
第三章第3节概述
这周我们继续学习第三章中的第3节,指令系统。上周课程我们学习了寻址方式和六大类指令系统中的数据传送指令和算术指令,本节课程我们学习逻辑指令、串处理指令、控制转移指令等几类指令系统。这些指令整体构成了80x86指令系统的集合。因此学好这些指令将为学好汇编语言打下坚实的基础。
第3节几类指令系统
1、逻辑指令
1)逻辑运算指令:AND、OR、NOT、XOR、TEST
说明:这几种逻辑运算指令比较容易理解,需要注意的是测试指令TEST是将两个操作数进行与操作,只是与的结果并不保存,只设置条件码;NOT指令不影响标志位,NOT指令不允许使用立即数寻址方式。
2)位测试并修改指令:
BT DST,SRC
执行的操作是:把目的操作数中由源操作数所指定位的值送往标志位CF
BTS DST,SRC
执行的操作是:把目的操作数中由源操作数所指定位的值送往标志位CF,并把目的操作数该位置1
BTR DST,SRC
执行的操作是:把目的操作数中由源操作数所指定位的值送往标志位CF,并把目的操作数该位置0
BTC DST,SRC
执行的操作是:把目的操作数中由源操作数所指定位的值送往标志位CF,并把目的操作数该位变反
说明:本组指令除影响CF位的值,其他标志位无定义,源操作数可以使用寄存器方式或立即数方式。
3)位扫描指令:
BSF 正向位扫描
BSR 负向位扫描
4)移位指令:
SHL 逻辑左移
SAL 算术左移
SHR 逻辑右移
SAR 算术右移
ROL 循环左移
ROR 循环右移
RCL 带进位循环左移
RCR 带进位循环右移
说明:逻辑左移和算术左移指令功能是等效的,但是逻辑右移指令和算术右移指令是不同的,逻辑右移,只需要在最高位补0即可,而算术右移需要使用最高位的符号位进行补充,比如最高位为0则移位后最高位补0,最高位为1则移位后最高位补1;一般逻辑移位指令用于无符号数移位, 而算术移位指令多用于带符号数移位;一位移位情况时,SHR相当于除2,SHL相当于乘2,,SAR相当于除2,SAL相当于乘2;多位移位指令在有进位或溢出情况时,这种乘除2关系不正确;移位指令移出位存放于CF标志位中,因此也多用于位检测,这时只需要检测CF内容即可。
移位指令对CF和OF位有影响,其中OF位只有在一位移位时才有效,移位后最高有效位发生变化则OF置1,否则置0。
循环移位指令可以改变操作数中所有位的位置,在程序中很有用。
2、串处理指令:
MOVS 串传送
CMPS 串比较
SCAS 串扫描
LODS 从串取
STOS 存入串
INS 串输入
OUTS 串输出
说明:串扫描指令格式如下
SCAS DST
参与比较的目的串都在附加段中,而被比较的数在AL(字节操作)AX(字操作)EAX(双字操作)中。
以上串处理指令都可以和前缀REP/REPE/REPNE配合使用,只需要注意一个典型的重复串处理指令的操作过程其他类似重复串指令即可对比理解了,如下指令:
REPNESCASB 不等重复字节串扫描指令
执行的操作过程如下:计数器内容是0或ZF=1退出指令,否则往下执行
CX-1 CX,
DI与AL内容比较
DI 1 DI
重复第一步
串处理指令中可以使用 REP MOVS指令将数据段中的数据(源串)传送到附加段(目的串)中去。还需要注意方向标志位DF以及两条指令CLD和STD的作用,STD使DF置1,串处理指令可使地址自动减量,CLD使DF置0,串处理指令可使地址自动增量。
3、控制转移指令
1)无条件转移指令:又分为段内直接短转移,段内直接近转移,段内间接近转移,段间直接远转移,段间间接远转移。无条件地转移到指令指定的地址去执行指令。
2)条件转移指令:又分为3种转移指令,包括单个标志位状态转移指令、无符号数间比较结果转移指令、带符号数间比较结果转移指令。
JZ/JNZ ZF位跳转
JS/JNS SF位跳转
JO/JNO OF位跳转
JP/JNP PF位跳转
JB/JNB CF位跳转
JB/JNB 小于转移
JBE/JNBE 小于等于转移
JL/JNL 大于转移
JLE/JNLE 大于等于转移
3)条件设置指令:是根据上一条刚执行完的指令所设置的条件码情况,来判断是否产生程序分支的。有时并不希望在这一点就产生程序分支,而是希望在其后运行的程序的另一个位置,根据这一点条件码设置来产生程序分支,这样就要求把这一点的条件码情况保存下来,以便在其后使用。
根据单个条件标志的值把目的字节置1
SETZ(SETE) DST 测试条件:ZF=1
SETNZ(SETNE) DST 测试条件:ZF=0
SETS DST 测试条件:SF=1
SETNS DST 测试条件:SF=0
SETO DST 测试条件:OF=1
SETNO DST 测试条件:OF=0
SETP DST 测试条件:PF=1
SETNP DST 测试条件:PF=0
SETC(SETB、SETNAE) DST 测试条件:CF=1
SETNC(SETNB、SETAE) DST测试条件:CF=0
比较两个无符号数,并根据比较的结果把目的字节置1
SETB(SETNAE、SETC)低于或不高于或等于或进位位为1则目的字节置1
SETNB(SETAE、SETNC)不低于或高于或等于或进位位为0则目的字节置1
SETBE(SETNA)低于或等于或不高于则目的字节置1
SETNBE(SETA)不低于或等于或高于则目的字节置1
比较两个带符号数,并根据比较的结果把目的字节置1
SETL(SETNGE)小于,或不大于或等于则目的字节置1
SETNL(SETGE)不小于,或大于或等于则目的字节置1
SETLE(SETNG)小于,或等于或不大于则目的字节置1
SETNLE(SETG)不小于,或等于或大于则目的字节置1
4)循环指令:
LOOP循环指令
LOOPZ/LOOPNZ指令
执行的过程:(CX) (CX)-1
检查是否满足条件,如满足,则
(IP) (IP)+8位位移量,实行循环
不满足则IP不变,退出循环
说明:循环程序不可能太多,因此循环指令跳转偏移量不应太大(-128到+128字节范围内)。
本周要求掌握的内容如下:
基本概念:逻辑运算指令、位扫描指令、移位指令、控制转移指令、循环指令
基本理论:了解5种逻辑运算指令,熟练使用8种移位指令,熟悉几种控制转移指令,会用循环指令,熟悉几种串处理指令操作过程,注意指令禁用寻址方式和寻址范围情况以及默认寄存器操作数情况。
习题:
1、SCASW DX执行的过程描述正确的是(DF=1):( )
(1)(AL)-(DX) (2)(AX)-(DX) (3) (DX) (DX)-2 (DX) (DX)-1
(4)(DX) (DX)+1(5)(DX) (DX)-2
2、指令SAL 51H 3执行后的结果是:( )
(A)88H (B) 648D (C)44H(D)A2H
3、上例指令执行后CF寄存器内容为:(0)
4、判断:一条循环指令可以代替修改计数器和判断转移条件两条指令。
(√)
5、下列指令正确的是:( )
(A)SCAS DX,AX (B) REPNEMOVS (C) ROR21H(D)NOT 5CH
页:
[1]