详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

汇编语言是依赖于计算机的低级的程序设计语言。

RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位:

如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作。下面的例子中,CLC 指令清除进位标志位。第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位。第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位:

clc                             ; CF = 0
mov bl, 88h              ; CF,BL = 0 1000100Ob
rcl bl, 1                     ; CF,BL = 1 00010000b
rcl b1, 1                    ; CF,BL = 0 00100001b

从进位标志位恢复位

RCL 可以恢复之前移入进位标志位的位。下面的例子把 testval 的最低位移入进位标志位,并对其进行检查。如果 testval 的最低位为 1,则程序跳转;如果最低位为 0,则用 RCL 将该数恢复为初始值:

.data
testval BYTE 01101010b
.code
shr testval, 1          ; 将lsb移入进位标志位
jc exit                     ; 如果该标志位置 1,则退出
rcl testval, 1           ; 否则恢复该数原值

RCR 指令

RCR(带进位循环右移)指令把每一位都向右移,进位标志位复制到 MSB,而 LSB 复制到进位标志位:

从上图来看,RCL 指令将该整数转化成了一个 9 位值,进位标志位位于 LSB 的右边。下面的示例代码用 STC 将进位标志位置 1,然后,对 AH 寄存器执行一次带进位循环右移操作:

stc                            ; CF = 1
mov ah, 10h             ; AH, CF = 00010000 1
rcr ah, 1                    ; AH, CF = 10001000 0

有符号数溢出

如果有符号数循环移动一位生成的结果超过了目的操作数的有符号数范围,则溢出标志位置 1。换句话说,即该数的符号位取反。下例中,8 位寄存器中的正数(+127)循环左移后变为负数(-2):

mov al, +127          ; AL = 01111111b
rol al, 1                   ; OF = 1, AL = 11111110b

同样,-128 向右移动一位,溢出标志位置 1。AL 中的结果(+64)符号位与原数相反:

mov al, -128           ; AL = 10000000b
shr al, 1                  ; OF = 1, AL = 01000000b

如果循环移动次数大于 1,则溢出标志位无定义。

总结

以上所述是小编给大家介绍的汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 汇编语言无效指令错误概述

    问题:cmpxchg8b 指令比较一个8字节值edx和EAX带有8字节值内存( 目的地操作数). 只有有效目标操作数用于此指令是内存 操作数. 如果目标操作数是一个寄存器处理器应产生一个 无效OpCode例外,执行的指令cmpxchg8b应当停止和 处理器应该执行无效OpCode异常处理程序. 此错误发生是 锁定前缀为使用cmpxchg8b指令与一个(无效)寄存器目的地 操作数. 在这种情况下,处理器可能无法启动执行无效OpCode 异常处理程序,因为总线已锁定. 这将导致系统挂起. 提示:如果

  • 汇编语言 口算异或xor小结

    复制代码 代码如下: 123 145 167 189 1AB 1CD 1EF 246 257 28A 29B 2CE 2DF 347 356 38B 39A 3CF 3DE 48C 49D 4AE 4BF 58D 59C 5AF 5BE 68E 69F 6AC 6BD 78F 79E 7AD 7BC

  • 汇编语言rep movsd 的使用详解

    mov esi,offset @s1mov edi,offset @s2 mov ecx,10cld rep movsd 1.rep movsd 每次ecx!=0便执行movsd ,然后ecx=ecx-1 movsd移动ds:[si] 到es:[di],在32位汇编下可以用esi代替si,edi代替di 2.同时由于在一般exe中ds = es 程序起始位置所以另esi = offset @s1就可以找到变量s1 ,edi= offset @s2就可以找到变量s2 3.movsd此类指令有个性质

  • 汇编语言常见错误信息中文注解

    本文的目标是收集大部分汇编中常见错误信息及对其的中文注解,方便大家在写汇编程序时能够快速地定位错误并解决问题. ml.exe错误信息: 复制代码 代码如下: FATAL   严重错误 cannot open file不能打开文件 I/O error closing fileI/O错误 正在关闭文件 I/O error writing fileI/O错误 正在写文件 I/O error reading file            I/O错误 正在读取文件 out of memory      

  • 汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植. XOR 指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存放在目标操作数中: XOR dest

  • 详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    汇编语言是依赖于计算机的低级的程序设计语言. RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位: 如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作.下面的例子中,CLC 指令清除进位标志位.第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位.第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位: clc                             ; CF = 0 mov bl

  • 详解汇编语言各种指令的解释与用法

    [数据传输指令] 一.通用数据传送指令 1.传送指令MOV(move) 指令的汇编格式:MOV DST,SRC 指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址.指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令.指令的执行对标志位的影响:不影响标志位.指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器:目的操作数DST不能是CS,也不能用立即数方式. 2.进栈指令 PUSH(push onto the sta

  • 详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 集合概念: 1.作用:用于存放对象 2.相当于一个容器,里面包含着一组对象,其中的每个对象作为集合的一个元素出现 3.jav

  • 详解汇编语言 dup伪指令

    dup可以重复定义前面的数据 assume cs:code, ds:data data segment db 10 dup (0) ; 连续定义10个字节型的0 db 1,2,3,4,5,6 db 10 dup ('a') db 6,5,4,3,2,1 db 4 dup('123','abc') data ends code segment start: mov ax, data mov ds,ax mov ax, 4C00H int 21H code ends end start ps:下面看

  • 详解汇编语言MOV指令

    在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的). 32位指令集 1.一般传送指令 MOV指令: 格式: MOV目的-->除CS.IP以外的寄存器或存储器 源-->寄存器.存储器.立即数 ex : MOV  ECX ,EDX ;   EDX->ECX ECX =00000034H EDX =00000052H 指令执行结果: ECX = 00000052H, EDX不变,标志寄存器也不变. MOVSX

  • 详解汇编语言中中括号[]作用及lea和mov指令的区别

    汇编中中括号[]作用及lea和mov指令的区别 现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令: 对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如: mov eax,2 lea ebx,[eax];执行后ebx=2 mov ebx,eax;等同于上句 lea ebx,eax;编译器报错: error A2070: invalid instruction operands 对于变量来说加不加[]都是一样的效果,都是取变量的地址,相

  • Go 中的循环是如何转为汇编的(方法详解)

    本文基于 Go 1.13 版本 循环在编程中是一个重要的概念,且易于上手.但是,循环必须被翻译成计算机能理解的底层指令.它的编译方式也会在一定程度上影响到标准库中的其他组件.让我们开始分析循环吧. 循环的汇编代码 使用循坏迭代 array , slice , channel ,以下是一个使用循环对 slice 计算总和的例子. func main() { l := []int{9, 45, 23, 67, 78} t := 0 for _, v := range l { t += v } pri

  • Python循环结构详解

    一.内容简介 使用while循环编写重复执行的语句 使用哨兵值控制循环 使用for循环实现计数器控制 使用break.continue控制循环 二.while循环 注意:循环控制时不要使用浮点型来比较等值 i = 1 # 循环变量的初值 while i < 10: # 循环变量的判断 print("当前第", i, "次循环") i += 1 # 循环变量的更新 PyCharm调试示例 # PyCharm中的调试 # 1. 设置断点:debug->调试

  • Python基础之python循环控制语句break/continue详解

    Python中提供了两个关键字用来控制循环语句,分别是break和continue break在条件成立时,不会执行循环中的后续代码,并且会停止整个循环 continue在条件成立时,会不执行循环中的后续代码,并且会停止本次循环 接下来我们通过两个案例来区分这两个控制语句 首先使用while循环语句打印1到5之间的数字,循环到3的时候,我们使用continue关键字跳出3的这次循环,需要注意的是,continue在条件成立时,不会执行后续代码,如果在continue关键字前,没有改变循环的条件,

  • Java Spring循环依赖原理与bean的生命周期图文案例详解

    前言 Spring是如何处理循环依赖的,又是怎么做到,互相注入对方的proxy bean而不是raw bean的?现在就分析一下 一.循环依赖是什么 Spring中放入两个Service,分别是C1和C2,然后C1和C2又互为对方的成员变量.这种情况C1和C2就可以说是相互循环依赖了 二.源码图解 1. bean的主要生命周期图解 上图是一个没有循坏依赖的bean的主要生命周期节点,下图的循坏依赖可以结合该图解一起看 2.循环依赖图解 可以看到里面有一个很重要的逻辑: 当一个bean经过所有的步

随机推荐