我是靠谱客的博主 个性季节,最近开发中收集的这篇文章主要介绍x86汇编_循环左/右移_带进位的循环左/右移_笔记48ROL指令ROR指令RCL指令RCR指令,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
英文全称 | 汇编指令 | 中文翻译 | 说明 |
Rotate Left | ROL | 循环左移 | 目标操作数循环向左移,最后一个被移出来的数字放入CF标志位,同时循环回最右边(LSB)。 |
Rotate Right | ROR | 循环右移 | 目标操作数循环向右移,最后一个被移出来的数字放入CF标志位,同时循环回最左边(MSB)。 |
Rotate With Carry Left | RCL | 带进位的循环左移 | 将CF位放到目标操作数的最左边,一起参与循环,从CF位移出去的数字循环回LSB。 |
Rotate With Carry Right | RCR | 带进位的循环右移 | 将CF位放到目标操作数的最右边,一起参与循环,从CF位移出去的数字循环回MSB。 |
ROL指令
在下例中,请注意最高位是如何复制到进位标志位和位 0 的:
mov al,40h ; AL = 01000000b
rol al,1 ; AL = 10000000b, CF = 0
rol al,1 ; AL = 00000001b, CF = 1
rol alz1 ; AL = 00000010b, CF = 0
利用 ROL 可以交换一个字节的高四位(位 4〜7)和低四位(位 0〜3)。例如,26h 向任何方向循环移动 4 位就变为 62h:
mov al, 26h
rol al, 4 ; AL = 62h
使用rol指令每转动4个位,则十六进制数刚好转动1个数字。例如,将 6A4Bh 反复循环左移四位,最后就会回到初始值:
mov ax, 6A4Bh
rol ax, 4 ; AX = A4B6h
rol ax, 4 ; AX = 4B6Ah
rol ax, 4 ; AX = B6A4h
rol ax, 4 ; AX = 6A4Bh
ROR指令
在下例中,请注意最低位是如何复制到进位标志位和结果的最高位的:
mov al, 0lh ; AL = 00000001b
ror al, 1 ; AL = 10000000b, CF = 1
ror al, 1 ; AL = 01000000b, CF = 0
当循环计数值大于 1 时,进位标志位保存的是最后循环移出 LSB 的位:
mov al, 00000100b
ror al, 3 ; AL = 10000000b, CF = 1
RCL指令
如果把进位标志位当作操作数最高位的附加位,那么 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
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
最后
以上就是个性季节为你收集整理的x86汇编_循环左/右移_带进位的循环左/右移_笔记48ROL指令ROR指令RCL指令RCR指令的全部内容,希望文章能够帮你解决x86汇编_循环左/右移_带进位的循环左/右移_笔记48ROL指令ROR指令RCL指令RCR指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复