2016-02-19 2 views
0

Я пытаюсь изучить язык ассемблера, и я не уверен, что я на правильном пути. У меня есть программа на языке ассемблера, что мне нужно, чтобы преобразовать в С.Написание программы C с языка ассемблера

addq %rsi, %rdi 
addq %rdi, %rdx 
movq %rdx, %rax 
ret 

Пытаясь не работать через него сам я придумать что-то вдоль линий

long p1(long x, long y, long z) 
{ 
x = x + y; 
z = z + x; 
long a = z; 
return a; 
} 

Независимо от того, какой путь я смотрю на нем я чувствую, что я близок, но когда я objdump, я не получаю ничего подобного. Ищете какое-то руководство .. спасибо!

+2

Идите в другую сторону. 'gcc -S ur_c.c' будет производить сборку для просмотра. – dawg

+0

отредактируйте код. '' '' '' '' '' '. Есть ли какая-либо ошибка компиляции с вашим кодом? – Nik

+0

Это то, что я пытался, но выход сборки не соответствует этой проблеме. Я не думаю, что я ухожу, но, может быть, я? – Ben

ответ

3

Ваш код C выглядит хорошо, и, насколько я могу судить, он делает то же самое, что и ваш ассемблерный код.

Вы не должны ожидать, что компиляция вашего кода C даст точно такую ​​же сборку, как в примере. Существует множество способов конвертировать C в сборку.

Например, если я скомпилирую код C с помощью gcc -O0 (без оптимизации), я получаю гораздо более длинную сборку, в которой хранятся все аргументы и переменные функции в стеке. Это необязательно (и медленнее), но облегчает отладчик. Если я компилирую с gcc -O2, я получаю

leaq (%rdi,%rsi), %rax 
    addq %rdx, %rax 
    ret 

Здесь компилятор сделал умное использование lea instruction сделать пристройку и двигаться в одной команде.

+0

Ах, вот где вошло мое замешательство. Я представил себе, что я мог бы разобрать его, если бы я дал ему правильный код С. – Ben

+0

Это было бы то же самое, чтобы упростить его и сделать его long a = x + y + z; Правильно? – Ben

+0

@Ben: Да, или даже одна строка 'return x + y + z;' –

Смежные вопросы