鉴于以下简短的程序集片段:
shr rax, 3
adc rax, 0
我解决了这个问题:
- 我们知道
SHR用最后一位移位来设置 CF。 - 我们知道
ADC dest, 0只是添加 CF。
所以看着点点滴滴,
128 64 32 16 8 4 2 1
8 7 6 5 4 3 2 1
------------------------------
1 1 1 1 1 CF X X
CF=1 | 0 0 0 1 1 1 1 1 ; shr 3
所以如果我们 div 8 并添加 CF 最正确的功能是这样的,
def f(x):
return x//8 + int( (x//4) % 2 )
什么时候有用。快速测试一下,我可以看到我是对的。
rax = 0 -> 0
rax = 1 -> 0
rax = 2 -> 0
rax = 3 -> 0
rax = 4 -> 1
rax = 7 -> 1
rax = 8 -> 1
rax = 11 -> 1
rax = 12 -> 2
rax = 13 -> 2
rax = 14 -> 2
rax = 15 -> 2
rax = 16 -> 2
rax = 17 -> 2
rax = 18 -> 2
rax = 19 -> 2
...
rax = 20 -> 3
rax = 28 -> 4
用 Radare 反编译在这里也没有用,
int64_t entry0 (void) {
rax >>= 3;
__asm ("adc rax, 0");
}
因此,我的问题是,尽管我确实理解这些指令对操作数寄存器的直接影响,但该指令序列的更高级别含义是什么?
这是来自XCHG RAX、RAX书中的谜语0x09。