2015-03-30 3 views
1

У меня есть фрагмент кода, который мне нужно преобразовать в комментируемую сборку Intel 64. Я дал ему выстрел, но я знаю, что сделал некоторые ошибки, поэтому я был бы признателен, если бы кто-то мог указать на эти ошибки для меня и сказать мне правильный способ сделать это.Преобразование в сборку Intel 64

Код для преобразования:

void test (int x) 
{ 
    int y, z; 
    y = 5; 
    z = 2*y; 
    x = z+x; 
    if (z>0) 
     z = -z; 
    while (z<0) { 
     y = y+y; 
     z++; 
    } 
} 

int main() 
{ 
    int x = 8; 
    test (x); 
} 

Моя попытка преобразования:

test:  pop rax; x variable from stack 
      mov rbx 5; y variable 
      mov rcx rbx; z variable 
      imul rcx 2; z = z*y 
      add rdx rcx; x = z+x 

ifz:  cmp rcx 0; if statement 
      jle whilez; 
      imul rcx -1; z = -z 

whilez:  cmp rcx 0; while statement 
      jge endwhile; 
      add rbx rbx; y=y+y 
      add rcx 1; z++ 
      jmp whilez; loop back 

endwhile: 

main:  mov rax 8; int x = 8 
      push rax; push x onto stack for method call 
      jmp test; 
+0

Синтаксис сборки не соответствует любому ассемблеру, с которым я знаком. Обычно между аргументами к инструкциям есть запятые. Я не уверен, почему вы используете прыжок для вызова функции. Обычно вы должны использовать 'call'. При выполнении вызовов в мире, совместимом с C, также существует специальное соглашение о вызове. Быстрый способ конвертировать C в сборку - запустить 'gcc -S myfile.c', а затем вручную отредактировать/оптимизировать/украсить связанный файл' .s' (который будет в формате AT & T). – lurker

+1

@lurker: Если вам не нравится AT & T (что мне нравится), вы можете передать '-masm = intel' в gcc. – EOF

+0

@EOF почему вы считаете, что мне не нравится формат AT & T? Я ничего не сказал о том, нравится мне это или не нравится. Я указывал, что формат AT & T - это то, что вы получаете по умолчанию с помощью '-S'. Под «beatify» я хотел использовать, возможно, более читаемые имена переменных, метки и т. Д. OP, похоже, склоняется к формату Intel. – lurker

ответ

1

Какие ошибки вы получаете во время компиляции/связывания этого?

С самого начала я заметил, что у вас есть синтаксические ошибки. Для Intel-Based сборки синтаксис Mov являются ...

mov rax, rbx  ; You forgot the comma 
add rcx, 8  ; Just another example 

Это также относится к «IMUL», «добавить» и «ЧМК» называет.

Также, если вы не ошибочно технически, вы добавляете точки с запятой в конец строк. В Сборочных точках с запятой не обязательно в конце и вместо этого являются идентификатором комментариев. Главные проблемы, которые я заметил, были запятыми. Я бы попытался скомпилировать и связать это, и если он все еще не работает, я могу взглянуть еще раз.

+0

Я havent скомпилировал это, и я не знаю, как проверить, дает ли мой код тот же результат. Спасибо за запятые, да, я их забыл. В основном это упражнение, чтобы преобразовать его на бумаге. У меня в основном было 2 вопроса: правильно ли я выполнял свой метод? Я переместил переменную в стек, а затем вытащил ее, это правильно? Также мне нужно выполнить некоторую команду в конце вызываемой функции, чтобы сообщить компьютеру, что это конец функции? Спасибо – kabeersvohra

+1

О, ладно. Да, вы нажали и правильно выскочили в стек. Вместо использования «jmp» я всегда использую «вызов», но это не должно иметь значения. И, наконец, в разделе «endwhile» вы хотите выполнить команду «ret», чтобы это не было бесконечным циклом/ – CMilby

+1

Фактически использование 'jmp' в этом случае будет иметь огромное значение, поскольку функция' test' doesn ' t "return", и он возвращается обратно в 'main'. Это проблема.«Call» следует использовать с подходящим 'ret' в конце функции' test'. – lurker

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