У меня есть фрагмент кода, который мне нужно преобразовать в комментируемую сборку 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;
Синтаксис сборки не соответствует любому ассемблеру, с которым я знаком. Обычно между аргументами к инструкциям есть запятые. Я не уверен, почему вы используете прыжок для вызова функции. Обычно вы должны использовать 'call'. При выполнении вызовов в мире, совместимом с C, также существует специальное соглашение о вызове. Быстрый способ конвертировать C в сборку - запустить 'gcc -S myfile.c', а затем вручную отредактировать/оптимизировать/украсить связанный файл' .s' (который будет в формате AT & T). – lurker
@lurker: Если вам не нравится AT & T (что мне нравится), вы можете передать '-masm = intel' в gcc. – EOF
@EOF почему вы считаете, что мне не нравится формат AT & T? Я ничего не сказал о том, нравится мне это или не нравится. Я указывал, что формат AT & T - это то, что вы получаете по умолчанию с помощью '-S'. Под «beatify» я хотел использовать, возможно, более читаемые имена переменных, метки и т. Д. OP, похоже, склоняется к формату Intel. – lurker