2015-04-21 1 views
2

Я пытаюсь преобразовать этот код сборки в фрагмент кода C.Реверсивный инженерный фрагмент сборки x86?

movl $0, -4(%ebp) # 4 
movl -4(%ebp), %eax 
sall $2, %eax 
addl 8(%ebp), %eax 
movl (%eax), %eax 
cmpl 12(%ebp), %eax 
jg .L6 

.L6: 
nop 

Вот что у меня есть, но я думаю, что-то не так. Линия «movl (% eax), eax» смущает меня в частности.

int local = 0; 
if ((int*)((local << 2) + param1) > parameter2) { 
    ; // do nothing 
} 
+0

Это немного бесполезно, если мы не видим весь контекст. Вероятно, в этом коде есть чередование циклов. – Leeor

+0

http://reverseengineering.stackexchange.com/ –

ответ

3

Ваша интерпретация movl %(eax), %eax является правильным, но линии addl 8(%ebp), %eax нет. Правильный код может быть примерно таким:

// parameter1 is an int* at 8(%ebp) 
// parameter2 is an int at 12(%ebp) 
int local = 0; // at -4(%ebp) 
if (parameter1[local] > parameter2) { 
    ; // nop 
} else { 
    // whatever is betwween jg and .L6 
} 
+1

Большое спасибо, но почему мое использование addl не так? Я думал, что просто говорит eax = eax + param2 – jake32

+1

param1, а не param2. В вашем c-коде у вас есть «+ 2», что неверно - это «+ param1». – jlahd

+0

действительно ценю помощь, но если вы не возражаете, не могли бы вы объяснить, почему вы знаете его параметр [local], а не весь материал, который я написал? – jake32