2016-11-11 79 views
-2

我必须从C程序集中逆向转换C语言中的switch语句。当我编译使用-S标志来从我写到C的汇编代码,这是不正确的。任何有关我在做什么错误的见解?逆向工程C语言中的switch语句来自x86程序集

在此先感谢!

这是大会

.file "switch_prob-soln.c" 
.text 
.globl switch_prob 
.type switch_prob, @function 
switch_prob: 
.LFB0: 
.cfi_startproc 
subq $50, %rsi 
cmpq $5, %rsi 
ja .L2 
jmp *.L7(,%rsi,8) 
.section .rodata 
.align 8 
.align 4 
.L7: 
.quad .L3 
.quad .L2 
.quad .L3 
.quad .L4 
.quad .L5 
.quad .L6 
.text 
.L3: 
leaq 0(,%rdi,4), %rax 
ret 
.L4: 
movq %rdi, %rax 
sarq $2, %rax 
ret 
.L5: 
leaq (%rdi,%rdi,2), %rdi 
.L6: 
imulq %rdi, %rdi 
.L2: 
leaq 10(%rdi), %rax 
ret 
.cfi_endproc 
.LFE0: 
.size switch_prob, .-switch_prob 
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" 
.section .note.GNU-stack,"",@progbits 

这是CI写道

long switch_prob(long x, long n){ 
    long result = x; 
    switch(n){ 

     case 50: 
     case 51: 
     result + 4; 
     break; 

     case 52: 
     result >> 2; 
     break; 

     case 53: 
     result + result + 2; 

     merge: 
     result * result 
     break; 

     default: 
     result * 10; 
     break; 
    } 
    return result; 
    } 
+3

除了这个事实,'长期结果 - X;'并不意味着什么,并没有你的计算有任何副作用,也有一个函数中定义的函数,它不是C. – jxh

+0

*“......它是不正确的。”*如何?你没有解释实际问题是什么。 – user694733

+0

您应该将您的C代码编译为'gcc -Wall -S -O -fverbose-asm',并且您需要改进代码,直到没有任何警告。注意'result * 10;'(第4行到最后一行)没有可观察的副作用,因此可能会被优化和删除。也许你的意思是“返回结果* 10”,而这只是一种猜测。 –

回答

0

只是下面的汇编代码的逻辑,我猜是这样的:

int switch_prob(int x, int n) { 
    int result = x; 

    switch (n - 50) { 

     case 0: 
     case 2: 
      result += 4; 
      break; 

     case 3: 
      result >>= 2; 
      break; 

     case 4: 
      result += 2; 

     case 5: 
      result *= result; 
      break; 

     default: 
      result += 10; 
    } 

    return result; 
} 

你可以测试你的解决方案的一种方法是编写一个驱动程序,如:

test.c的

#include <stdio.h> 

int switch_prob(int x, int n); 


int main() { 

    printf("%d\n", switch_prob(1, 54)); 

    return 0; 
} 

,然后编译汇编代码,是否与您的系统兼容,与驱动程序:

gcc -Wall test.c switch_prob-soln.s 

然后编辑test1.c文件更改参数到switch_prob()看看你的假设是否成立。我猜跳转表告诉我们介绍一下情况:

.quad .L3 # case 0: addition (LEA) 
.quad .L2 # default: (no case 1:) addition (LEA) 
.quad .L3 # case 2: is case 0: again 
.quad .L4 # case 3: right shift (SAR) 
.quad .L5 # case 4: addition (LEA) 
.quad .L6 # case 5: multiplication (IMUL) 
+0

这很有帮助,谢谢!我肯定会试一试 –

+0

最后一个问题,我知道lea可以用于操作,因为它在这里,但我也读过它,它本质上是一种将某个索引移动到另一个索引的方式,比如在一个数组中,还是我解释错了? (对不起,我对装配很陌生,OO的逻辑飞跃对我来说很难)。 –