深入探索位操作、标志位与分支跳转
1. 通过进位标志位旋转位
在 x86/x64 指令集中,有另一对旋转指令:RCR(右循环进位旋转)和 RCL(左循环进位旋转)。它们的操作方式与 ROL 和 ROR 类似,但有一个关键区别:操作数末尾移出的位会通过进位标志位(CF)重新进入操作数的开头。这意味着在通过 CF 进行旋转时,单个位的移动路径比 ROL 和 ROR 多一位。
2. 设置进位标志位的值
需要注意的是,之前的指令可能会在 CF 中留下值,这些值会在 RCL 或 RCR 指令执行时被旋转到操作数中。有些人错误地认为在移位或旋转指令执行前,CF 会被强制置为 0,这是不正确的。如果在 RCR 或 RCL 指令执行前,另一条指令在 CF 中留下了 1 位,那么无论你是否希望,这个 1 位都会进入目标操作数。
若在旋转操作开始时,需要将 CF 设置为已知值,可以使用 x86 指令 CLC 和 STC。CLC 将进位标志位清零(置为 0),STC 将进位标志位置 1。这两条指令都不需要操作数,也没有其他副作用。
3. 位操作实战:十六进制转储程序
在 Linux 中,显示文本相对方便,但如果要将寄存器中的数值以十六进制数字形式显示,就需要先将数值转换为字符串表示,然后通过系统调用 sys_write 内核服务来显示字符串。
以下是一个十六进制转储程序 hexdump1gcc.asm 的代码:
; Executable name : hexdump1gcc
;
超级会员免费看
订阅专栏 解锁全文
461

被折叠的 条评论
为什么被折叠?



