我正在处理一个赋值的一部分,它要求我确定哪些参数传递给函数以跳过某个函数。这是有问题的汇编代码。
这是函数的开始,它将一个参数移动到eax并执行算术:
0x080499ca <+0>: push %ebp
0x080499cb <+1>: mov %esp,%ebp
0x080499cd <+3>: sub $0x8,%esp
0x080499d0 <+6>: mov 0x8(%ebp),%eax
0x080499d3 <+9>: sub $0x37,%eax // subtract 55
0x080499d6 <+12>: cmp $0x13,%eax // compare against 19
0x080499d9 <+15>: ja 0x8049a4a <transform+128>
开始时,movzbl函数将值0x804(并将其扩展为零)移动到寄存器中。二进制值为:001000000001001101001000111000
“xor”将此值与常量1进行比较。测试采用eax的最低8位,即寄存器,使用此新值:
0x08049a4a <+128>: movzbl 0x804d238,%eax
0x08049a51 <+135>: xor $0x1,%eax
0x08049a54 <+138>: test %al,%al
0x08049a56 <+140>: je 0x8049a5d <transform+147>
如果设置了ZFLAG,那么它会跳转(这就是我想要的)。我不知道为什么每次都使用相同的值,根据我传入WHOLE函数的参数,标志会有所不同。它似乎应该每次都提供相同的结果。为什么有时标志正在设置,有时它没有被设置?
另外,我可以在参数中添加什么值以确保它跳转?
答案 0 :(得分:0)
因此...
0x08049a4a <+128>: movzbl 0x804d238,%eax
0x08049a51 <+135>: xor $0x1,%eax
0x08049a54 <+138>: test %al,%al
0x08049a56 <+140>: je 0x8049a5d <transform+147>
... xor $0x01
翻转加载到%eax
的值的第0位; test %al, %al
ands %al
与它自己(丢弃结果,但保持对标志的影响);因此如果je
为零,则会%al
。那就是......如果((value ^ 1) & 0xFF) == 0
,将会跳转。