前言
本次是该系列的的第0x09篇
实验环境:
- Windows10 + VS2022 + masm
0x09
代码片段链接:xorpd | xchg rax,rax 0x09
shr rax,3
adc rax,0
代码分析
指令介绍:
- shr:按位右移指令,移出的那一位会留在进位标志位上
- adc:带进位加法指令
测试代码1:
纯汇编写测试输入,输入的最后3位有0-7共8个数字,当后三位大于4的时候,第三位(0100b)必为1,否则必为0
.code
main proc
lea rax, [17]
shr rax,3 ; rax = rax / 8, CF = rax & 0100b
adc rax,0 ; rax = rax + CF
ret
main ENDP
END
最后三位也就是对8进行取余操作得到的值,当余数大于4的时候会给结果+1,那这里判断的就是一个数是8的n倍(n是最后计算结果)附近的整数(n的计算相当于给输入+4之后再除8)
测试代码2:
#include<stdio.h>
int main(int argv)
{
for (int i = 0; i < 15; i++)
{
int res = 0;
__asm {
mov eax, dword ptr ds : [i] ;
shr rax, 3;
adc rax, 0;
mov dword ptr ds : [res] , eax;
}
printf("%02d:%d, %d\r\n",i,res,i%8);
}
return 0;
}
输出结果:
00:0, 0
01:0, 1
02:0, 2
03:0, 3
04:1, 4
05:1, 5
06:1, 6
07:1, 7
08:1, 0
09:1, 1
10:1, 2
11:1, 3
12:2, 4
13:2, 5
14:2, 6
15:2, 7
等价于(rax+4)/8