2015-07-10 166 views
-2

我是intel x86汇编的新手,我试着理解下面的代码片段并将其转换为C代码。还有更多,但现在我只是想明白是怎么回事,它如何可能看起来在C.intel x86汇编到C

mov eax, [ebp+var_154]  ; get the address of var_154 
    add eax, 1 
    mov ecx, [ebp+var_160]  ; get the address of var_160 
    sub ecx, eax 
    cmp [ebp+var_16c], ecx 
    jnb loc_443CDF 
    mov eax, [ebp+var_176]  ; get address of var_176 
    add eax, [ebp+var_16c] 
    movsx ecx, byte ptr [eax] ; get first byte of eax? 
    and ecx, 1 
    mov [ebp+var_18c], c1 
+0

那么,你有什么想法?注意:'mov eax,[ebp + var_154]'获取值,而不是地址。 – Jester

+0

不知道。一般来说,不可能将设置转换回C. –

+3

我正在投票结束这个问题,因为这是一个关于汇编器> C转换的问题(通常不可能),而且OP不懂汇编。 –

回答

1

等效的C代码将是:

int a_1, c_1, var_154, var_160, var_16c; 
char *a_2, *var_176; 
char c_2, var_186; 

a_1 = var_154; 
a_1++; 
c_1 = var_160; 
c_1 -= a_1; 
if (var_16c < c_1) { 
    a_2 = var_176; 
    a_2 += var_16c; 
    c_2 = *a_2; 
    c_2 &= 1; 
    var_18c = c_2; 

这不会甚至接近类似于原始代码。这些类型可能都是不同的,并且这些语句中的许多将被合并为一个。这也可能是误导。您可以通过使用这些类型,而不是得到等效代码:

int a_1, var_154, var_176; 
char *a_2, *c_1, *var_160, *var_16c; 
char c_2, var_186; 

或者:

int var_16c; 
char *a_1, *a_2, *c_1, *var_154, *var_160, *var_176; 
char c_2, var_186; 

要了解你需要学习汇编语言汇编语言。没有人会把你看到的每一个汇编程序都翻译成C语言。一旦你学习汇编语言,你会看到如何毫无意义地将它转换成C实际上是。