c - 我如何知道读取程序集的循环中包含什么

标签 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 语句?

最佳答案

在汇编程序中,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,则移动完成。

关于c - 我如何知道读取程序集的循环中包含什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36378047/

相关文章:

c - 我如何将一个函数内的int指针传递给另一个函数,并在那里进行操作?

c - 为什么在我的例子中多线程比顺序编程慢?

c - 程序集字符*链接

c - 为什么我不能将FS寄存器的PID block 的值赋值给一个unsigned int?

c - 在 LightOJ 中解决 #1015(画笔)

c - 最初和 sleep 结束时在 C 中打印时间

linux - 尝试引导 gcc/glibc 工具链

对 gcc -static 选项或其在虚拟机中的行为感到困惑

java - 任务 ':app:transformClassesWithDexForDebug' 执行失败 dex 进程返回代码 1

c - printf 函数中表达式的求值