`
nannan408
  • 浏览: 1770924 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

汇编的移位如rol和逻辑运算具体对标志位的影响(转)

 
阅读更多
AND XOR TEST SHL SAL ROL RCL 
OR NOT  SHR SAR ROR RCR 

AND, OR , XOR 和 TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同.

NOT是单字节操作指令,不允许使用立即数.

逻辑运算均是按位进行操作,真值表如下:

AND (位与&) OR ( 位或| ) XOR  ( 位异或^ )  
1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0
1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0
1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0
  

 



A:逻辑运算指令

AND (and) 逻辑与指令

AND    DST , SRC           //Byte/Word

执行操作:dst = dst & src

1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位.

2.AND指令典型用法A:用于屏蔽某些位,即使某些位为0.

屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与

MOV AL , 39H     //AL= 0011 1001B[39H]

ADD AL , 0FH    // AL= 0000 1001B[09H]  即0011 1001B[39H]  &  0000 1111B[0FH] = 0000 1001B[09H]

3.AND指令典型用法B:取出某一位的值(见TEST)



 

OR (or) 逻辑或指令

OR    DST ,  SRC         //Byte/Word

执行操作:dst = dst | src

1.OR指令执行后,将使CF=0, OF=0, AF位无定义,指令执行结果影响SF, ZF和PF标志位.

2.常用于将某些位置1.

将AL的第5位置1:

MOV AL , 4AH    // AL=0100 1010B[4AH]

OR    AL , 10H      // AL=0101 1010B[5AH]   即0100 1010B[4AH]  |  0001 0000B[10H] =0101 1010B [5AH]



 

XOR (eXclusive OR) 逻辑异或指令

XOR    DST , SRC        //Byte/Word

执行操作:dst = dst ^ src

1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志.

2.XOR指令使某些位维持不变则与 '0' 相异或,若要使某些位取反则与 '1'相异或.

将AL的高4位维持不变,低4位取反:

MOV AL, B8H    //AL=1011 1000B[B8H]

XOR  AL, 0FH    //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]

测试某一个操作数是否与另一确定操作数相等:

XOR    AX , 042EH

JZ       ....   //如果AX==042EH, 则ZF=TRUE(1), 执行JZ...



NOT (not) 逻辑非指令

NOT    OPR                        //Byte/Word

执行操作:opr = ~opr   // ~ 01100101 [65H] =10011010 [9AH]

1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.NOT指令不影响任何标志位。

将AL各位取反:

MOV AL,65H    //AL=0110 0101B[65H]

NOT AL             //AL=1001 1010B[9AH]  即 ~ 0110 0101B[65H]=1001 1010B[9AH]





TEST (test) 指令

TEST    OPR1 , OPR2        //Byte/Word

执行操作:opr1 & opr2

1.两个操作数相与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0, OF=0,而AF位无定义.

2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足.只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假.

检测某位是否为1:

令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则 JNZ...

TEST AL , 0000 00001B   //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JNZ   THER     //最低位若为1, 则ZF=FALSE(0), 执行JNZ THER, 否则执行下一条指令.

或者:先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ...

MOV    DL , AL    //将AL 传送到DL,主要是不要影响AL的值.   以下测试AL的b2位是否为1

NOT    DL     //先对操作数求反

TEST    0000 0100B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JZ    THER        //若AL的b2位为1,则ZF=TRUE(1), 执行JZ    THER

 

 

B:移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF.AF无定义.]

非循环逻辑移位:把操作数看成无符数来进行移位.

SHL ( SHift logical Left )逻辑左移指令

SHL    OPR , CNT     //Byte/Word

执行操作:使OPR左移CNT位,并使最低CNT位为全0.

1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.移位次数由CNT决定.每次将OPR的最高位移出并移到CF,最低位补0.

MOV  CL , 7            //若移位多次, 先预置移位次数CL

SHL    DX ,  CL       //CNT可取1或CL寄存器操作数



SHR (SHift logical Right) 逻辑右移指令

SHR    OPR , CNT        //Byte/Word

同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.





非循环算术移位:将操作数看成有符号数来进行移位.

SAL (Shift Arithmetic Left) 算术左移指令

SAL    OPR , CNT         //Byte/Word

SAL指令与SHL指令完全相同



SAR(Shift Arithmetic Right) 算术右移指令

SAR    OPR , CNT        //Byte/Word

SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.





循环移位指令

ROL ( ROtate Left) 循环左移指令

ROL    OPR , CNT        //Byte/Word

每次移位时,最高位移出并同时移到CF和最低位D0.



ROR (ROtate Right)循环右移指令

ROR    OPR,CNT    //Byte/Word

每次移位时,最低位D0移出并同时移到CF和最高位.





带进位循环移位指令

RCL (Rotate Left through Carry)带进位循环左移指令

RCL    OPR,CNT     //Byte/Word



RCR (Rotate Right through Carry)带进位循环左移指令

RCR    OPR ,CNT       //Byte/Word

 
分享到:
评论

相关推荐

    32位除以16位51单片机汇编程序

    在51单片机编程中,执行高精度计算如32位除以16位的操作通常需要使用汇编语言来实现,因为C语言等高级语言可能无法直接支持这样的硬件操作。这里我们关注的是一个利用移位相除算法的汇编程序。 首先,我们需要了解...

    汇编语言-在线第4周3.pptx

    在汇编语言中,位操作类指令是程序员直接对二进制位进行操作的重要工具,它们主要用于精细控制数据和实现位级别的逻辑运算。本部分主要介绍四种常见的逻辑运算指令:逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)以及...

    汇编语言指令大全

    汇编语言指令通常包括数据传输、算术逻辑运算、控制转移、字符串处理和位操作等类型。下面将详细介绍汇编语言中一些常见指令的含义和使用方法。 首先,数据传输指令主要用于在寄存器、内存和I/O端口之间移动数据。...

    汇编语言解析

    这些基本的移位和循环移位指令在汇编语言编程中广泛应用于位操作、数据转换、算术运算和逻辑运算。它们的正确理解和使用是掌握汇编语言的关键,也是进行底层程序设计的基础。通过熟练运用这些指令,程序员能够高效地...

    32位汇编指令计算器.exe

    6. 移位和旋转指令:如`SHL`、`SHR`、`ROL`、`ROR`,它们改变操作数的二进制位序列,常用于位操作和快速乘除。 7. 输入输出指令:如`IN`、`OUT`,允许程序与外部设备进行通信。 32位汇编指令计算器通过模拟处理器...

    IBM-PC汇编语言指令集

    移位指令如SHR、SHL、SAR和SAL用于改变操作数的二进制位位置,循环移位指令ROR、ROL、RCR和RCL则是循环版本的位移。 程序流程控制指令如CLC、STC、CMC、CLD、STD、CLI、STI、CMP和JMP家族则用于控制程序的执行流程...

    汇编语言指令

    ROR、ROL、RCR和RCL指令用于循环移位运算。它们的格式为ROR r/m,data/CL、ROL r/m,data/CL、RCR r/m,data/CL、RCL r/m,data/CL等。这些指令影响标志位C、P、Z、S、O。 程序流程控制指令: CLC、STC和CMC指令: CLC...

    单片机汇编语言指令集.pdf

    算数运算指令如ADD和ADC执行加法操作,SUB和SBB执行减法操作,它们都会影响标志寄存器中的状态标志,如进位标志C、借位标志P、辅助进位标志A、零标志Z和符号标志S。INC和DEC指令分别用于加一和减一操作,NEG指令则将...

    汇编语言程序设计自学教程

    此外,汇编语言还支持各种数据运算,如算术运算、逻辑运算和移位运算。 伪指令和操作符是编写汇编语言程序时的辅助工具。伪指令并不直接转换为机器码,而是被汇编器处理,用于声明变量、定义段、设置代码和数据的...

    汇编指令英文全称

    SHL 指令用于实现左移位运算,SAL 指令用于实现算术左移位运算,SHR 指令用于实现右移位运算,SAR 指令用于实现算术右移位运算。 ROL 指令用于实现左旋转运算,ROR 指令用于实现右旋转运算,RCL 指令用于实现带进位...

    32位汇编指令计vfvf算器

    4. 处理器状态和控制指令:如设置条件码(SETXX)、改变标志位(CMOVXX)、中断(INT)和异常处理(INTO)等,这些指令影响程序的状态和处理器的行为。 5. 存储器访问指令:如加载(MOV)、存储(MOV)、加载有效...

    易语言汇编实现左移右移模块

    综上所述,这个模块提供了用汇编语言编写的左移和右移操作,包括循环移位和算术移位,以及一个按位取反的函数。这对于需要在易语言环境下进行底层优化和位操作的开发者来说,是一个宝贵的资源。

    04_位运算1

    循环移位在处理位模式和位标志时特别有用,例如在加密算法、编码解码和数据转换中。 最后,位运算还可以用于高效地处理数据,比如将16位或32位整数转换为16进制格式。这通常涉及多个位运算步骤,例如提取每一位,...

    8086指令系统2.

    ### 8086指令系统2 - 算术逻辑运算和移位指令的使用 #### 一、算术逻辑运算和移位指令概述 在8086微处理器架构中,算术逻辑运算和移位指令是非常重要的组成部分,它们主要用于处理数据的基本数学运算和逻辑操作。...

    ARM汇编语言中的表达式和运算符.doc

    数字表达式主要涉及数值计算,在ARM汇编语言中,常见的运算符包括算术运算符、移位运算符和按位逻辑运算符。 - **算术运算符**:“+”、“-”、“*”、“/”以及“MOD”。这些运算符分别表示加法、减法、乘法、除法...

    x86汇编指令集大全(带注释).pdf

    X86汇编指令集是计算机体系结构中不可或缺的一部分,特别是在32位和64位的x86架构处理器中。这篇文档详细列举了汇编指令,并为每条指令提供了注释说明。以下知识点涵盖了文档中提及的关键指令及其功能。 一、数据...

    汇编指令大全 8086

    此外,汇编语言还包括一些组织和控制结构,如段定义、过程定义、宏定义等,以及地址计算和标签等概念。学习8086汇编指令,不仅需要理解每条指令的功能,还要熟悉如何组合使用这些指令来实现更复杂的程序逻辑。熟练...

    80x86汇编指令大全总结珍藏版

    80x86汇编指令大全是对Intel 80x86系列处理器汇编语言编程的基础,涵盖了数据传输、算术运算、逻辑运算等多个方面的指令。以下是对这些指令的详细解释: 1. 数据传输指令: - `MOV`:基本的数据移动指令,用于将...

    avr单片机中左移位和右移位指令

    左移位(Logical Shift Left, LSL)和右移位(Logical Shift Right, LSR)是位操作中常见的指令,它们在AVR单片机中同样适用。 左移位指令将寄存器中的所有位向左移动指定的位数,右侧空出的位用零填充。这个操作...

Global site tag (gtag.js) - Google Analytics