发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
3.3.3 逻辑运算与移位指令 1.逻辑运算指令 逻辑运算是对操作数按位进行操作的,位与位之间无进位或借位,无数的正负与数的数值大小,这种运算的操作数称为逻辑数或逻辑值。 逻辑运算指令有"与"、"或"、"非"、"异或"、"测试"5种。除了"非"指令的执行结果对标志位无影响外,其他指令执行后,总是使OF=CF=0,SF、ZF和PF根据运算结果置位或复位,以反映操作结果的特征,而AF状态不定。 (1)逻辑"与"指令 符号指令:AND DST,SRC 指令功能:目的操作数和源操作数按位进行"与"运算,结果送回目的操作数,即 DST(DST)∧(SRC)。"与"指令可用于将字或字节中的特定位清零。源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数只允许是通用寄存器或存储器操作数,且两者不能同时为存储器操作数。 (2)逻辑"或"指令 符号指令: OR DST,SRC 指令功能:目的操作数和源操作数按位进行"或"运算,结果送回目的操作数,即 DST (DST)∨(SRC)。源操作数与目的操作数的约定与AND指令相同,"或"指令用于将字或字节中的特定位置位。 (3)逻辑"异或"指令 符号指令:XOR DST ,SRC 指令功能:目的操作数和源操作数进行"异或"运算,结果送回目的操作数,即 DST (DST)⊕(SRC)。"异或"指令可用于将字节或字中特定位取反。源操作数与目的操作数的约定与AND指令相同。 (4)逻辑"非"指令 符号指令:NOT DST 指令功能:目的操作数的各位求反码,结果送回目的操作数,即DST (DST)。 (5)"测试"指令 符号指令:TEST DTS,SRC 指令功能:TEST是测试指令,它执行两个操作数(字节或字)的逻辑与操作。指令执行后,两个操作数均不发生变化,"与"的结果仅影响标志位。 利用TEST指令,可以改变程序的执行方向。若在TEST指令之后,紧接着用一条条件转移指令JNE,则只要在两个操作数中有一对相应位的"与"结果是1,就发生程序转移。 TEST AL,01H 执行指令后,若ZF=0,则表示AL最低位为1;若ZF=1,则AL最低位为0。 2.移位指令 移位指令分为算术移位和逻辑移位。算术移位是对带符号数进行移位,在移位过程中必须保持符号位不变;而逻辑移位是对无符号数移位,总是用"0"来填补已空出的位。根据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最高位(符号位)发生变化,则将溢出标志OF置"1";若移多位,则OF标志将无效。 (1)逻辑移位 移位指令分为算术移位和逻辑移位。算术移位是对带符号数进行移位,在移位过程中必须保持符号位不变;而逻辑移位是对无符号数移位,总是用"0"来填补已空出的位。根据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最高位(符号位)发生变化,则将溢出标志OF置"1";若移多位,则OF标志将无效 符号指令:SHL DTS,COUNT SHR DTS,COUNT 指令功能:SHL是逻辑左移指令。逻辑左移是将目的操作数中的每一位向左移一位,最高有效位MSB移入进位标志位中,而CF原有的值丢失,空出的最低位补"0",如图3-21所示。逻辑左移指令用于无符号数乘以2,移入进位标志位的值可用来检查是否超位。图3-21中,MSB是最高有效位,LSB是最低有效位。 SHR是逻辑右移指令。逻辑右移是将目的操作数中的每一位向右移一位,操作数最低有效位LSB移入进位标志位CF,而CF原有的值丢失,空出的最高位补"0",如图3-22所示。逻辑右移指令用于无符号数除以2,移入进位标志位的值可用来检查数的奇偶性。 同逻辑运算指令的操作数一样,目的操作数只允许是8/16位通用寄存器或存储器操作数。指令中的计数值(COUNT),可以是1,也可以是n(n≤255)。若移1位,指令的计数值字段直接写1;若移n位时,则必须将n 事先装入CL寄存器中,故计数值字段只能书写CL,而不能用立即数n。 (2)算术移位指令 符号指令: SAL DTS ,COUNT SAR DTS ,COUNT 指令功能:SAL是算术左移位指令,它与逻辑左移指令SHL具有完全相同的操作、完全相同的编码形式。它们可以互换,它们是同一条指令的两个符号。SHL/SAL指令不仅适用于无符号数乘以2的运算,同样也适用于有符号数乘以2的运算。 SAR是算术右移位指令,它将目的操作数中的每一位向右移一位,空出的最高位MSB原来最高位的值,使符号位保持不变。操作数最低位LSB移入进位标志位CF,而CF原来的值丢失。其操作如图3-23所示。 算术右移位指令适用于有符号数除以2的运算。
注意:若①中AL的内容当作无符号数时,则是240。当AL的内容算术左移一位后,应为480,结果超出了8位无符号数的范围。 3.循环移位指令(java动画演示) 所谓循环移位,是指将目的操作数一端移出来的位,移至目的操作数的另一端。所以,循环移位是一种将目的操作数首尾相连接的移位,从目的操作数移出来的位不会丢失。 循环移位可分为不带进位位与带进位位循环移位。这类指令只影响CF和OF标志。CF标志总是保持移出的最后一位状态。若只循环移1位,且使最高位发生变化,则OF标志置"1";若循环移多位,则OF标志无效。 (1) 不带进位位循环移位指令 符号指令:ROL DTS ,COUNT ROR DTS ,COUNT 指令功能:ROL是循环左移位指令。它将目的操作数中的每一位向左移动一位,最高位MSB移入最低位LSB,同时把最高位移入CF,而CF原有值丢失。其执行过程如图3-24所示。 ROR是循环右移位指令,循环右移与循环左移位类似,只是将目的操作数向右移位,最低位移入最高位,同时把最低位移入CF。而CF原有值丢失。其执行过程如图3-25所示。 (2)带进位位循环移位指令 符号指令:RCL DST ,COUNT RCR DST ,COUNT 指令功能:RCL是带进位标志位CF的循环左移指令。它将目的操作数连同进位标志一起循环左移,CF的值进入目的操作数最低位,而目的操作数的最高位进入CF。其操作过程如图3-26所示。 RCR是带进位标志位CF的循环右移位指令。除了循环移位方向与RCL指令相反之外,其他功能与RCL类似。其操作过程如图3-27所示。 通常,移位与循环移位指令用来重定数据格式,也可用于按位检查寄存器或存储器单元的内容(移至进位标志CF中检查)。此外,利用这类指令,可以把一个寄存器的内容移至另一个寄存器中。 总之,循环移位指令经常用于检查进位标志位CF、某个寄存器或存储器单元的内容,而又不希望这些内容被破坏的场合。 执行算术右移指令将AX的最低位移入CF,再执行带进位循环右移指令,又把CF的值移入到BX的最高位,通过CF实现32位二进制数算术右移一位,如图3-28所示。(JAVA动画图说明)
来自: 昵称1191095 > 《我的图书馆》
0条评论
发表
请遵守用户 评论公约
80386ASM程序设计基础(四)
算术运算指令,逻辑运算指令,移位指令 AA.算术运算指令 A.加减法运算ADD,ADC,INC,SUB,SBB,DEC,CMP,NEG a.ADD,和8086功能,用法相同,不过支持32位操作,下面的语句都是合法的。SHRD将源操作数OP...
循环移位指令
循环移位指令二、循环移位指令。【例】请用不带CF的循环左移指令对操作数10110010进行移位。【例】请用不带CF的循环右移指令指令对操作数10110011进行移位。【例】请用带CF的循环左移指令对操作数10110...
汇编(十一)——位操作类指令
汇编(十一)——位操作类指令位操作类指令对二进制的各个位进行操作,包括逻辑运算指令和移位指令。1、不带进位标志循环指令ROL和RORROL reg/mem,1/CL ;不带进位循环左移ROR reg/mem,1/CL ;不...
常用基本汇编指令汇总(L~X)
说明:SRC和DST分别表示源操作数和目的操作数,ACC表示AL/AX/EAX寄存器,PORT表示I/O端口,TEMP表示临时存储单元。(REG)←(SRC),(DS)←(SRC+2或4)(REG)←(SRC),(ES)←(SRC+2或4)(REG)←(SRC),(FS)←...
第三章:程序的转换
用于对给定长度的两个位串进行相加或相减,两个操作数中最多只有一个是存储器操作数,不区分是无符号数还是带符号整数,产生的和/差送到...
第3章_4 逻辑移位及串操作
课后作业3.21~3.32,3.34,3.35,3.37,3.39(3)不相等则重复REPNE/REPNZ(REPeatwhenNotEqual/Zero)格式:REPNE/REPNZ串操作指令功能:若串操作指令执行结果不相等,且CX指定次数未到,则重复执行...
VB程序中实现字节移位操作
Public Function SHR(OPR As Byte, n As Integer) As ByteDim BD As ByteDim I As IntegerBD = OPRFor i = 1 To n - 1BD = BD \ 2 ''右移Next i.Public Function RCR(OPR As Byte, n As Intege...
Intel体系MMX指令
MOVD mm,r/m32MOVD r/m32,mm 转移32位数据:将32位数据从整型寄存器/内存移到MMX寄存器,和反向移动.MOVD不能在MMX寄存器之间,内存之间及整型寄存器之间移动数据.目标操作数为MMX寄存器时,32位源操作数写...
汇编语言学习(一)
这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调...
微信扫码,在手机上查看选中内容