2014-10-01 1 views
-7

Работа по изучению ассемблера и у меня есть следующий код, я должен перевести на C:ATT Ассамблея C

pushl %ebp 
movl %esp, %ebp 
movl 12(%ebp), %eax 
imull $886836204, %eax, %edx 
movl 8(%ebp), %eax 
addl %edx, %eax 
addl $629084528, %eax 
popl %ebp 
ret 

Я знаю, что он принимает два аргумента и в формате int func(int1, int2) {} и он возвращает что-то из сложения и умножения. Помимо этого я потерян. Как это выглядит в C?

+0

@isedev действительно. это именно то, о чем я думаю. – HuStmpHrrr

+0

Есть два способа сделать это. Первый способ заключается в том, чтобы эмулировать то, что делают инструкции по сборке (подсказка: вам понадобится реализация стека и некоторые переменные реестра). Второй способ - выяснить, что делает язык ассемблера, и написать код C, который выполняет одно и то же. Лично я голосую за последний подход. –

+0

, затем дополнительный намек: 'gcc -S' компилирует код C для сборки, поэтому вы можете проверить свои теории. – isedev

ответ

0

Я бы сказал, что int func(int a, int b){return b*886836204+a+629084528;}

0

Я уверен, что это возвращение одна линия, потому что оно не выделяет память в стеке для локальных переменных, но логика seens быть так:

int function(int x, int y){ 
    int eax; 
    int edx; 

    eax = x; 

    edx = 886836204 * eax; 

    eax = y; 
    eax = eax + edx; 
    eax = eax + 629084528; 

return eax; 

}

Что-то вроде этого:

return x * 886836204 + (x + y) + 629084528;