取余数遇到反汇编的问题?

img

img

请问4怎么在反汇编中变成80000003是什么?十六进制? 还是not补码了?怎么计算的?

80000003就是80000003H,是十六进制。至于为什么是80000003,其实对于取余运算,如果一个数a满足a=2^b,那么可以等效如下计算d%a=d&(a-1)。

也就是t%4=t&(4-1)=t&3

80000003的二进制就是10000000000000000000000000000011
不看最高位的1就是3
感觉这个汇编应该是经过优化的,没有使用除法计算

4的十六进制还是4

他是80000000003 ,因为它考虑了负数。and 后面接着就是 jns 正于是跳转,否则继续处理。

与上 80000003h 就是保留正负符号位和保留二进制的最后2位。
t % 4 就是求一个数除以3后的余数。不考虑正负数,其实就是 t & 3 ,考虑保留正负符号位,就是 t & 0x80000003
反汇编的结果是正确的
这是编译器做了优化后的结果。