我如何知道包含读取汇编的循环中包含的内容

时间:2016-04-02 19:54:42

标签: c gcc assembly

所以我们正在努力将装配恢复到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语句?

1 个答案:

答案 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,则完成此步骤。