selph
selph
发布于 2022-01-10 / 323 阅读
0
0

《xchg rax,rax》片段分析0x09--判断附近整数

前言

本次是该系列的的第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


评论