所以我们正在努力将装配恢复到C ......
我们得到的只是函数
long part2(long x, long y);
并通过反汇编我们获得的目标文件:
0: 48 8d 04 7f lea (%rdi,%rdi,2),%rax
4: 48 c1 e0 04 shl $0x4,%rax
8: 48 8d 56 1f lea 0x1f(%rsi),%rdx
c: 48 85 f6 test %rsi,%rsi
f: 48 0f 49 d6 cmovns %rsi,%rdx
13: 48 c1 fa 05 sar $0x5,%rdx
17: 48 21 d0 and %rdx,%rax
1a: c3 retq
到目前为止,我有一些看起来像这样的东西:
long someVar = 3x;
someVar = someVar << 4;
long anotherVar = y + 31;
//here is where I start to loose it....
if (y&y) {
anotherVar>>5;
...
我如何知道何时关闭if语句?
答案 0 :(得分:2)
在汇编程序中,if
通常被编译为测试和条件跳转。有时候会有一个额外的无条件跳转跳过else
部分。你知道if
何时结束跳跃的位置。但请注意,优化会使代码混乱并使其难以理解。
例如:
if (x)
{ /* if_code * }
next_instruction;
变为:
text x,x
jz Label
/* if_code */
Label:
next_instruction
然而,在你的特定例子中,没有跳跃。而是使用CMOVNS
指令。这是一个有条件的举动。也就是说,如果NS
条件成立,即S
标记未设置,则%rsi
中的值将移至%rdx
。这是条件中唯一的指令!
但请注意,条件标志为S
(符号),而不是Z
(零)。因此,如果%rsi >= 0
,则完成此步骤。