Запустите сборку intel no prefix x86-64 на MacOS - PullRequest
0 голосов
/ 05 мая 2018

Как часть класса, мне нужно написать ассемблерный код с определенным форматом. Учитель называет это «Intel синтаксис x86-64». Я попытался скомпилировать его с помощью данной команды (gcc -O3 -o op sc.s) и, несмотря на прекрасную работу на компьютере с Linux, он не работает на Mac. После некоторых исследований я обнаружил, что Mac OS не поддерживает этот синтаксис, и, следуя советам учителя, я попытался запустить Linux с загрузочного USB-ключа и на виртуальной машине (используя VirtualBox), но оба не удаются из-за проблем совместимости клавиатуры. Я искал несколько онлайн-решений, но ни один из них не мог скомпилировать исходный код без проблем. Как я могу запустить его, не покупая новый компьютер? Я хотел бы запустить этот точный синтаксис, если это возможно.
Спасибо, что читаете меня!

Вот пример кода, который он нам дал:

        .intel_syntax noprefix
        .data
msg:    .asciz "Hello, world!\n"
        .text
        .global main
        .type main, @function
main:   PUSH RBP
        MOV RBP, RSP
        MOV RDI, offset flat:msg
        CALL printf
        MOV EAX, 0
        POP RBP
        RET 

С может быть скомпилирован с помощью gcc (показано в прямом эфире), но при компиляции с gcc -o hw1 hw.s или gcc -o hw1 -masm=intel hw.s выдает следующую ошибку:

hw.s:6:9: error: unknown directive
        .type main, @function
        ^
hw.s:9:29: error: unknown token in expression
        MOV RDI, offset flat:msg

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я не думаю, что есть хорошее решение для MacOS. Насколько я знаю, GNU binutils не поддерживает двоичный формат Mach в macOS, что означает, что вы не можете просто использовать тот же ассемблер, что и в Linux (gas).

Проблема не только в синтаксисе, фактически, синтаксис как таковой частично поддерживается. Вы также столкнетесь с другими связанными с платформой различиями. Например, директива .type не будет использоваться в macOS, а имена символов начинаются с подчеркивания.

Если у вас возникли проблемы с клавиатурой в виртуальных машинах, я бы рекомендовал настроить какой-либо серверный дистрибутив Linux на виртуальной машине, а затем запустить его в автономном режиме. Получите доступ, войдя в систему с помощью ssh. Таким образом, вы взаимодействуете с ним через терминал, и у вас не должно быть проблем с клавиатурой.

Docker также может быть вариантом, так как он фактически запускает Linux на виртуальной машине под macOS, но может потребоваться больше усилий для выяснения.

В любом случае, если вас интересует версия кода, работающая на macOS:

        .intel_syntax noprefix
        .data
msg:    .asciz "Hello, world!\n"
        .text
        .global _main
_main:  PUSH RBP
        MOV RBP, RSP
        LEA RDI, [RIP + msg]
        CALL _printf
        MOV EAX, 0
        POP RBP
        RET 

Я удалил строку «.type», добавил подчеркивания к main и printf и изменил «MOV RDI, offset flat: msg» на «LEA RDI, [RIP + msg]».

Сборка с "clang -o hw1 hw1.s", нет причин притворяться, что мы запускаем gcc;)

0 голосов
/ 05 мая 2018

Вы пытаетесь собрать файл, используя синтаксис gas , поэтому вам нужно использовать ассемблер, который поддерживает это - либо gas iteself, либо что-то вроде yasm

...