第六、七章小结 (2017-08-28 00:49:51)

第六章 条件处理

AND、OR、XOR、NOT和TEST指令被称为按位指令(bitwise instructions),因为它们的操作都是位(bit)级的。源操作数中的每一位都与目标操作数的相同位进行匹配:

l 若两个输入位都是1,则AND指令结果为1。

l 若至少又一个输入位为1,则OR指令结果为1。

l 若两个输入位不同,则XOR指令结果为1。

l TEST指令对目的操作数执行隐含的AND操作,并正确地设置标志位。目的操作数不变。

l NOT指令将目的操作数的每一位取反。

CMP指令将目的操作数与源操作数进行比较。其隐含操作为:从目的操作数中减去源操作数,并且修改相应的CPU状态标志位。通常,CMP后面有一条条件跳转指令,将程序控制传递给一个代码标号。

本章给出了四种类型的条件跳转指令:

l 基于特定标志位值的跳转,例如:JC(有进位跳转)、JZ(为零跳转)和JO(溢出跳转)。

l 基于是否相等的跳转,例如:JE(相等跳转)、JNE(不相等跳转)、JECXZ(如果EXC=0则跳转)和JRCXZ(如果RXC=0则跳转)。

l 基于无符号数比较的条件跳转,例如:JA(大于则跳转)、JB(小于则跳转)和JAE(大于等于则跳转)。

l 基于有符号数比较的跳转,例如:JL(小于则跳转)、JG(大于则跳转)。

32位模式下,若零标志位等于1,且ECX大于零,则LOOPZ(LOOPE)指令重复循环。若零标志位等于0,且ECX大于零,则LOOPNZ(LOOPNE)指令重复循环。在64位模式下,LOOP和LOOPNZ指令使用的是RCX寄存器。

加密是对数据进行编码处理,解密是对数据进行解码处理。XOR指令可以用于执行简单的加密和解密。

流程图是用视图展示程序逻辑的一种有效工具。利用流程图作模型,可以很容易地编写汇编语言代码。给流程图中每一个标号都赋予一个标号,并在汇编源代码中使用同样的标号都很有帮助的。

有限状态机(FSM)是一种有效工具,用于验证包含可识别字符的字符串,比如有符号整数。如果FSM中每个状态都用符号表示,那么用汇编语言实现FSM相对较容易。

.IF,.ELSE,.ELSELF,和.ENDIF伪指令计算运行时表达式,并能极大简化汇编语言代码。当编写复杂的复合布尔表达式时,它们尤为有用。程序员还可以利用.WHILE和.REPEAT伪指令创建条件循环。

第七章 整数运算

与前面章节介绍的位元指令一样,移位指令也是汇编语言最显著的特点之一。一个数移位就意味着把它的位元进行右移或左移。

SHL(左移)指令把,目标操作数的每一位向左移动,最低位用0填充。SHL最大的作用之一是快速实现与2的幂相乘。任何操作数左移n位即为乘以2n。SHR(右移)指令则把每一位都向右移动,最高位用0填充。任何操作数右移n位即为除以2n。

SAL(算术左移)和SAR(算术右移)是特别为有符号数移位设计的指令。

ROL(循环左移)指令把每一位都左移,并将最高位复制到进位标志位和最低位。ROR(循环右移)指令把每一位向右移动,并将最低位复制到进位标志位和最高位。

RCL(带进位循环左移)指令把每一位都左移,并先将进位标志位复制到移位结果的最低位,再将最高位复制到进位标志位。RCR(带进位循环右移)指令把每一位都右移,并将最低位复制到进位标志位,而进位标志位则复制到结果的最高位。

x86处理器可使用的SHLD(双精度左移)和SHRD(双精度右移)指令对大数的移位非常有用。

32位模式下,MUL指令实现一个8位、16位或32位的操作数与AL、AX或EAX相乘。64位模式下,一个数还可以实现与RAX寄存器相乘。IMUL指令执行有符号数乘法,它有三种格式:单操作数、双操作数和三操作数。

32位模式下,DIV指令实现8位、16位或32位的操作数的除法。64位模式下,还可以实现64位除法。IDIV指令执行有符号数乘法,其格式与DIV指令相同。

CBW(字节转字)指令把AL的符号位扩展到AH寄存器。CDQ(双字转四字)指令把EAX的符号位扩展到EDX寄存器。CWD(字转双字)指令把AX的符号位扩展到DX寄存器。

扩展加减法是指加减任意大小的数,ADC和SBB指令可以用于实现这种加减运算。ADC(带进位加法)指令实现源操作数与进位标志位的内容和目的操作数相加。SBB(带借位减法)指令实现目的操作数减去源操作数和进位标志位的值。

ASCII十进制数每个字节存放一个数字,并编码为ASCII形式。AAA(加法后的ASCII调整)指令将ADD或ADC指令的二进制结果转换为ASCII十进制。AAS(减法后的ASCII调整)指令将SUB或SBB指令的二进制结果转换为ASCII十进制。所有这些指令都只能用于32位模式。

非压缩十进制数每个字节存放两个十进制数字。DAA(加法后的十进制调整)指令转换的是ADD或ADC指令执行压缩十进制加法所生成的二进制结果。DAS(减法后的十进制调整)指令转换的是SUB或SBB指令执行压缩十进制减法所生成的二进制结果。所有这些指令都只能用于32位模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值