Как установить sasm на Ubuntu

Обновлено: 04.07.2024

В этом посте я расскажу о том, как запустить MASM вместе с библиотекой Irvine в вашей системе Linux. MASM и библиотека Irvine являются обязательными для курса языка ассемблера в моем колледже, и я не фанат Windows, поэтому вот они для Linux.

Давайте просто познакомимся с программным обеспечением, которое нам понадобится:

  • MASM: Microsoft Macro Assembler, ассемблер x86 для систем Windows.
  • WINE: WINE — это не эмулятор, а уровень совместимости, который запускает программное обеспечение Windows в системах macOS и *nix.
  • PlayOnLinux: это программное обеспечение, которое помогает вам управлять программами WINE и упрощает использование WINE.
    • Есть также PlayOnMac, который делает то же самое, но для macOS.
    • Похоже, что Visual Studio 2005 Express работает с PlayOnLinux, поэтому вы можете использовать его вместо SASM, если вам покажется, что SASM недостаточно многофункционален. — это библиотека, которая переписывает часть кода Irvine Library, но мне не удалось заставить ее работать по нескольким причинам, поэтому я просто не беспокоился.
    • Я наткнулся на репозиторий masm-unix на GitHub через 2 месяца после первоначальной публикации этой статьи. Я не проверял его, но, возможно, его стоит посмотреть.

    Мы не будем их использовать, но вы можете попробовать и рассказать мне о результатах.

    Примечание. Вы можете попробовать выполнить те же действия в macOS, поскольку WINE также поддерживается на ней. Я не проверял это, поэтому понятия не имею, сработает это или нет.

    Первым шагом, конечно же, является загрузка необходимого программного обеспечения.

    Загрузите MASM отсюда, НЕ устанавливайте его с сайта Microsoft, так как он не будет работать.

    Загрузите SASM отсюда, обязательно загрузите версию для Windows, так как версия для Linux не поддерживает MASM из-за лицензионного соглашения Microsoft.

    Загрузите библиотеку Irvine отсюда.

    Загрузка WINE и PlayOnLinux

    Их довольно легко установить в большинстве дистрибутивов Linux.

    Вам необходимо загрузить следующие пакеты, проверьте, как они называются в вашем дистрибутиве:

    При желании вам также может потребоваться загрузить следующие файлы:

    Если вы используете Ubuntu/Linux Mint/elementaryOS, вы можете ознакомиться с этими руководствами по установке PlayOnLinux:

    Также проверьте это, чтобы установить WINE, который необходим для работы PlayOnLinux:

    Создание виртуального диска и установка MASM

    Теперь, когда у нас установлены WINE и PlayOnLinux, мы можем установить MASM, SASM и Irvine Library.

    Небольшое примечание о том, как работает PlayOnlinux. По сути, у него есть виртуальные диски, которые действуют как установки Windows, где вы можете установить несколько программ и библиотек на один и тот же виртуальный диск, и все они будут работать так, как если бы они находились на одном диске C:\. диск на реальной установке Windows (в большинстве случаев).

    Запустите PlayOnLinux и нажмите значок плюса с надписью «Установить», затем выберите «Установить программу, не указанную в списке» в левом нижнем углу.

    установить не в списке

    Прочитайте эти инструкции, они будут полезны, если вы собираетесь использовать PlayOnLinux для другого программного обеспечения позже.

    warnings

    Нажав пару раз «Далее», вы должны перейти на этот экран. Выберите «Установить программу на новый виртуальный диск».

    install-1

    Нажмите «Далее», а затем выберите имя для своего виртуального диска. Я установил значение «MASM».

    Нажимайте «Далее», пока не дойдете до этого экрана и не выберите «Установка 64-разрядной версии Windows».

    64bit

    На этом этапе, особенно если вы используете Ubuntu или любую из ее производных, PlayOnLinux может попросить вас автоматически установить wine_gecko и wine-mono. В этом случае позвольте ему установить его. Загрузка займет некоторое время, а размер зависит от вашего дистрибутива и версии WINE.

    После этого вы попадете на этот экран. Первое, что вы хотите установить, это MASM. Нажмите «Обзор» и перейдите в каталог, где находится установщик, и установите его, как если бы вы устанавливали программу Windows. Если вас спросят, на какой раздел установить MASM32, выберите C:\, а НЕ Z:\.

    browse

    masminstall

    extract

    После того, как вы просмотрите экраны подсказок, MASM, вероятно, был установлен, но PlayOnLinux не может его обнаружить, так как он все еще выполняет некоторые тесты.Мы можем нажать «Отмена» в окне подсказки PlayOnLinux, в котором говорится «PlayOnLinux устанавливает ваше приложение…» через минуту или две.

    Установка SASM и библиотеки Irvine

    Нажмите на значок шестеренки с надписью «Настроить» в главном интерфейсе PlayOnLinux.

    Выберите только что созданный виртуальный диск и нажмите «Разное». После этого выберите запуск .exe на виртуальном диске.

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

    Теперь у нас все установлено!

    В том же окне «Настройка», которое вы открыли, перейдите в «Общие» и выберите создание ярлыка с диска.

    Прокрутите вниз, пока не найдете файл sasm.exe, и выберите его. После этого нажмите «Я не хочу делать еще один ярлык», а затем «Далее».

    sasm

    Теперь SASM появится в PlayOnLinux и на вашем рабочем столе! Запустите его.

    Откройте настройки:

    В «Сборке» установите ассемблер на «MASM».

    В разделе «Общие» установите понравившийся шрифт и его размер, а также установите следующий текст редактора кода по умолчанию. Что касается шрифта, мне больше всего подходит Liberation Mono размера 15.

    Теперь всякий раз, когда вы хотите запустить свою программу, нажмите "Создать", а затем "Запустить в новом окне".

    run

    running

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

    Мы можем это немного изменить.

    В PlayOnLinux перейдите в окно настройки, в разделе «Wine» выберите «Настроить Wine».

    Перейдите в «Графика» и немного увеличьте DPI. Это будет отличаться от системы к системе. Мой ноутбук работал хорошо с 130. На моем рабочем столе 96 работал без проблем.

    dpi

    После этого перейдите в раздел «Интеграция с рабочим столом»

    Вы можете установить темы .msstyles и применить их. Это работало на моем ноутбуке, но по какой-то причине на моем рабочем столе приложение вылетало, если я применял какую-либо тему.

    xp

    Вы также можете заметить, что если вывод в консоли становится слишком большим, вы теряете строки вверху. Чтобы сделать консоль прокручиваемой и увеличить размер буфера, сделайте следующее:

    Запустите любой образец программы сборки, щелкните правой кнопкой мыши консоль и выберите "Свойства".

    properties

    Установите высоту буферной зоны в «Конфигурации» на 1000 или любое другое большое число.

    buff

    Еще один курс, который я изучаю в этом семестре, — это логическое программирование, для которого требуется «Visual Prolog».

    Это не имеет никакого отношения к сборке, но стоит только упомянуть, что вы можете без проблем запускать программное обеспечение с помощью WINE. Просто установите его таким же образом, создав новый виртуальный диск или установив его на тот же виртуальный диск, что и MASM.

    SASM (SimpleASM) — простая кроссплатформенная IDE с открытым исходным кодом для языков ассемблера NASM, MASM, GAS, FASM. SASM имеет подсветку синтаксиса и отладчик. Программа работает из коробки и отлично подходит для начинающих изучать язык ассемблера. SASM переведен на русский, английский, турецкий (спасибо Али Горен), китайский (спасибо Ахмед Зетао Ян), немецкий (спасибо Себастьян Фишер), итальянский (спасибо Карло Дапор), польский (спасибо Кшиштоф Росса), иврит (спасибо Элиан Камаль) , испанский (спасибо Мариано Кордоба). Под лицензией GNU GPL v3.0. На основе Qt.

    SASM

    Чтобы загрузить SASM для Linux, выберите свой дистрибутив и архитектуру (i386 / amd64) после перехода по соответствующей ссылке.

    Также вы можете собрать SASM из исходников, размещенных в репозитории GitHub.

    Внести вклад в SASM

    PayPal и карты:

    WebMoney: Z282016332582 или R331674303467

    О программе

    В SASM вы можете легко разрабатывать и выполнять программы, написанные на языках ассемблера NASM, MASM, GAS или FASM. Введите код в форму и просто запустите программу. В Windows SASM может выполнять программы в отдельном окне. Введите свои входные данные в поле стыковки «Ввод». В поле «Вывод» вы можете увидеть результат выполнения программы. При этом все сообщения и ошибки компиляции будут отображаться в форме внизу.Вы можете сохранить исходный или уже скомпилированный (exe) код вашей программы в файл и загрузить свои программы из файла.

    SASM поддерживает работу со многими открытыми проектами — новые файлы открываются и создаются в новых вкладках. При выходе из SASM сохраняется текущий набор открытых файлов. При следующем запуске вы можете восстановить предыдущую сессию. В настройках вы можете установить шрифт, цветовую схему и исходный текст. SASM переведен на русский, английский, турецкий (спасибо Али Горен), китайский (спасибо Ахмед Зетао Ян), немецкий (спасибо Себастьян Фишер), итальянский (спасибо Карло Дапор), польский (спасибо Кшиштоф Росса), иврит (спасибо Элиан Камаль) , испанский (спасибо Мариано Кордоба). Все диалоговые окна в SASM стыкуются - вы можете выбрать одно из многих положений их положения. Также есть возможность переназначить горячие клавиши.

    Стандартное меню "Правка" дополнено возможностью комментировать/раскомментировать фрагмент исходного кода и создавать/удалять отступ в 4 пробела (Tab/Shift+Tab).

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

    SASM поддерживает 4 работы с ассемблером - NASM, MASM, GAS и FASM в 2-х режимах - x64 и x86. Выбрать режим можно в настройках на вкладке "Build". Также там можно изменить параметры ассемблера и компоновщика и выбрать программы для сборки и компоновки.

    SASM

    Устранение неполадок

    Если у вас что-то не работает (возникают ошибки при компиляции, отладке и т.п.), прочтите главу "Устранение неполадок" в справке программы (F1) или в Wiki проекта на GitHub. Возможно, там вы найдете полезные советы для решения ваших проблем.

    Библиотека макросов NASM "io.inc"

    Реализация

    Окна

    В качестве ассемблера NASM использовался nasm 2.11.02, в качестве линкера - gcc 4.6.2 от MinGW (gcc 4.8.1 от MinGW64 в режиме x64) или ld 2.22 от MinGW (ld 2.23.2 от MinGW64 в режиме x64).< /p>

    SASM 3.0 и более поздние версии содержат fasm 1.71.39 и gas 2.23.1 от MinGW (gas 2.23.2 от MinGW64).

    Также SASM содержит отладчик gdb от MinGW и библиотеку макросов "io.inc".

    Все ассемблеры (кроме MASM) включены в SASM, и вы можете использовать их сразу после выбора. Ассемблер MASM не может быть включен в сборку из-за его лицензии. Для его использования необходимо установить MASM на свой компьютер с сайта https://www.masm32.com/ и указать путь к ассемблеру MASM (ml.exe, путь обычно "C:/masm32/bin/ml.exe") и к компоновщику MASM (link.exe, путь обычно "C:/masm32/bin/link.exe") в соответствующих полях на вкладке "Сборка" в настройках.

    В Windows SASM готов к работе сразу после установки.

    Линукс

    Для корректной работы в Linux должны быть установлены следующие пакеты: nasm или gas (если вы будете их использовать, fasm уже включен в SASM), gcc, gdb (для отладки). MASM в Linux не поддерживается.

    Более подробную информацию о SASM вы можете найти в Wiki проекта на GitHub.

    Журнал изменений:

    09.03.2022 - установщик версии 3.12.2 и фикс zip (zip, exe)

    06.02.2022 - версия 3.12.2 (zip, exe):

    • Исправить макрос GET_DEC/GET_UDEC/GET_HEX с адресными выражениями ESP.
    • Исправить ошибки отображения и запуска GDB с помощью .gdbinit.
    • Исправить отладку для программ с директивой сегмента и оператором push ebp/rbp.
    • Исправлено выделение и отладка многострочных комментариев NASM.
    • Исправить выбор поиска при изменении текста.

    13.02.2021 - версия 3.12.1 (zip, exe):

    08.02.2021 - версия 3.12.0 (zip, exe):

    • Запуск и отладка в текущем каталоге кода, если код сохранен (для удобного файлового ввода-вывода).
    • Поддержка UTF-8.
    • Поддержка Qt 5 для Linux.
    • Португальский язык (спасибо alglus).
    • GET_DEC записывает в неправильную память в Windows исправление.

    03.02.2020 - версия 3.11.1 (zip, exe):

    31.01.2020 - версия 3.11.0 (zip, exe):

    • Исправлены ошибки взаимодействия с GDB 8.
    • Исправлена ​​ошибка синтаксического анализа регистрации.
    • Исправлен сбой после щелчка в окне памяти (спасибо Hofmer13).
    • Исправлена ​​ошибка, связанная с отсутствием горячей клавиши отладки.
    • Исправлена ​​ошибка, не позволявшая открывать файлы без расширения.
    • Сохранение файла перед добавлением функции сборки.
    • Добавлена ​​функция поиска выделенного текста.
    • Исправлен итальянский перевод (спасибо Mek101).

    08.10.2018 - версия 3.10.1 (zip, exe):

    • Исправлено отсутствие объекта макроса в параметрах связывания после обновления 3.10.0.

    01.10.2018 - версия 3.10.0 (zip, exe):

    • Поддержка ОС BSD (спасибо Martinfx).
    • Исправлена ​​ошибка, из-за которой не работала отладка в системах, где gcc имеет параметр PIE по умолчанию (спасибо lberserq).
    • Добавлен испанский язык (спасибо Мариано Кордоба).
    • Небольшие исправления удобства использования настроек.

    12.09.2017 - версия 3.9.0 (zip, exe):

    • Добавлено более удобное средство наблюдения за выражениями памяти.
    • Исправлена ​​ошибка сбоя отладчика (спасибо lberserq).
    • Добавлен перевод на польский язык (спасибо Кшиштофу Россе).
    • Добавлен перевод на иврит (спасибо Элиану Камалю).

    19.02.2017 - версия 3.8.0 (zip, exe):

    • Улучшен анализ регистров во время отладки.
    • Добавлен параметр "Построить в текущем каталоге".
    • Добавлен перевод на итальянский язык.

    30.10.2016 – версия 3.7.0 (zip, exe):

    • Добавлен китайский язык.
    • Добавлен немецкий язык.
    • Исправлена ​​ошибка, приводившая к падению отдельных приложений.
    • Исправлена ​​ошибка с непечатаемыми символами в выводе программы.

    25.09.2016 – версия 3.6.0:

    • Добавлен турецкий язык.
    • Улучшено действие клавиши Tab.

    26.08.2016 – версия 3.5.1:

    • Исправлена ​​ошибка перетаскивания, ошибка отладки и некоторые небольшие ошибки.

    19.03.2016 – версия 3.5.0:

    • Поддержка компоновщика GoLink.
    • Исправлена ​​ошибка с неверными именами файлов при сохранении и открытии.

    11.02.2016 – версия 3.4.0:

    • Возможность изменить цвет шрифта номера строки.
    • Возможность отключить вставку строки отладки.

    27.01.2016 – версия 3.3.0:

    • Режим одного окна.
    • Перетащите, чтобы открыть файл.
    • Улучшенная справка: расширенная глава об устранении неполадок и новая глава о настройках системы здания.
    • Исправлено множество ошибок, в том числе ошибка с нестандартными путями в Windows и ошибка с отображением регистров FPU.

    14.06.2015 – версия 3.2.0:

    • Возможность сборки программ без запуска компоновщика.
    • Новый FASM 1.71.39.
    • Исправлены некоторые проблемы с отладкой.

    27.05.2015 - версия 3.1.4: исправление проблемы отладки локализованных систем.

    30.03.2015 - версия 3.1.3: добавлен показ описания принимаемого сигнала.

    27.03.2015 - версия 3.1.2: улучшена отладка файлов с включением.

    24.03.2015 - версия 3.1.1: исправлены ошибки с подсветкой синтаксиса.

    29.08.2014 — версия 3.1.0: изменения запросов на вытягивание и проблем с GitHub — подвижные вкладки, предупреждающее сообщение о неправильном исполняемом файле ассемблера или компоновщика, улучшенная операция отступа, параметр noexecstack для двоичных файлов в Linux.

    24.07.2014 - версия 3.0.1: добавлено дополнительное представление регистров в отладчике.

    13.07.2014 – версия 3.0:

    • Добавлены новые ассемблеры: теперь поддерживаются NASM, GAS, MASM, FASM, включая подсветку синтаксиса, отладку и режимы x86/x64. Добавлена ​​возможность выбора собственного пути заполнения ассемблера или компоновщика к ним.
    • Множество улучшений в отладке. Теперь можно отлаживать программы даже без отладочной информации для GDB (например, написанные на MASM). Добавлена ​​возможность приостанавливать работу программы, а также устанавливать точку останова во время ее выполнения. Добавлена ​​папка для включаемых файлов.
    • Исправлена ​​проблема с текстовым редактором, приводившая к большой нагрузке на процессор при открытии больших файлов. Исправлена ​​ошибка с нарушением работы интерфейса после открытия окна настроек. Исправлено множество мелких ошибок и ошибок.

    23.04.2014 - версия 2.3.1: исправлена ​​ошибка с пробелами в пути к временной директории (теперь SASM работает на Windows XP).

    03.04.2014 – версия 2.3:

    • Добавлены возможности выбора режима (x64 или x86) и изменения опций ассемблера и компоновщика. Добавлены инструменты для компиляции и отладки 64-битного кода.
    • Реализована подсветка 64-битных инструкций и регистров, а также макроассемблера NASM. Библиотека "io.inc", адаптированная для использования в 64-битных приложениях.
    • Исправлено множество ошибок.

    16.02.2014 – версия 2.2:

    • Значительно улучшен интерфейс и удобство использования SASM. Полноцветная настройка и подсветка синтаксиса. Все виджеты становятся пристыкованными окнами с множеством вариантов их расположения. Улучшены виджеты регистра и памяти, добавлена ​​возможность сохранения их состояния. Добавлены значки и панели инструментов.
    • Улучшены контрольные точки. Улучшена отладка макросов.
    • Улучшения горячих клавиш и возможность их переназначения.

    13.11.2013 – версия 2.1:

    • Исправлено множество ошибок, исправлены проблемы совместимости - созданы установочные пакеты для многих систем Linux, добавлена ​​совместимость с Qt 4, улучшено создание из исходников.
    • Добавлено множество улучшений, расширена функциональность. В отладчике добавлены: регистры и часы памяти, точки останова, команда continue; улучшено: выполнение команд gdb, выделение текущей строки, последовательный вывод при отладке, "io.inc" макрос изменен.
    • Компиляция во временной папке. Метка несохраненного документа. Последовательный вывод в программах. Статус завершения программы. Время выполнения программы. Выбор шрифта.
    • Обновлена ​​справка. Новый значок. Тем не менее, множество мелких улучшений и функций.

    06.04.2013 - версия 2.0: реализован отладчик, улучшена подсветка, добавлена ​​поддержка многих файлов, SASM (новое имя) переписан на Qt и стал Open Source и кроссплатформенным. Исходники и новый сайт размещены на GitHub.

    Сравните Ubuntu и SASM и посмотрите, в чем их отличия

    NinjaOne предоставляет программное обеспечение для удаленного мониторинга и управления, сочетающее мощные функциональные возможности с быстрым современным пользовательским интерфейсом. Легко устраняйте проблемы с ИТ, автоматизируйте стандартные задачи и поддерживайте конечных пользователей с помощью мощных инструментов управления ИТ.

    Целевая страница Ubuntu

    Целевая страница Ubuntu

    Целевая страница SASM

    Целевая страница SASM

    Подробнее об Ubuntu

    Детали SASM

    Видео Ubuntu

    Обзор Ubuntu 19.10 | Лучший рабочий стол GNOME?

    Еще видео:

    Видео SASM

    Компьютер, звуковая панель, Studio Monitore/Lautsprecehr/Boxen Swissonic SASM 7 в распаковке

    Еще видео:

    Популярность категории

    Убунту

    САСМ

    Отзывы

    Это некоторые из внешних источников и отзывы пользователей на сайте, которые мы использовали для сравнения Ubuntu и SASM

    Обзоры Ubuntu

    Ubuntu – самый популярный и часто используемый дистрибутив Linux для веб-разработки, Python и других целей. За прошедшие годы, благодаря поддержке Canonical и сообщества открытого исходного кода, Ubuntu превратилась в одно из основных направлений настольного сценария Linux.

    Опять же, это что-то субъективное, потому что, если вы не хотите никаких вредоносных программ, в Ubuntu есть минимальные опции Ubuntu, которые поставляются только с самым необходимым, так что вы можете выбрать, какое приложение установить.

    Отзывы SASM

    Социальные рекомендации и упоминания

    По нашим данным, Ubuntu более популярен. С марта 2021 года его упомянули 134 раза. Мы отслеживаем рекомендации и упоминания продукта на Reddit, HackerNews и некоторых других платформах. Они помогут вам определить, какой продукт более популярен и что о нем думают люди.

    Ubuntu упоминает (134)

    • ВОЗМОЖНО, Я ПОЛУЧИЛ БОЛЬШУЮ ИНФОРМАЦИЮ. МНЕ НУЖНЫ ИДЕИ

    Создайте загрузочный USB-накопитель Linux с Ubuntu с другого компьютера. Затем загрузитесь в него, и если вам повезет, вы сможете смонтировать раздел c: (он имеет другое имя в Linux) и перенести данные на другой USB или жесткий диск. Тогда вам придется сбросить окна. – Источник: Reddit / 4 дня назад

    Предварительные условия Я предполагаю, что у вас есть домен и сервер Linux с установленными Ubuntu, Debian или Centos. В этом примере я использую Ubuntu 20.04. - Источник: dev.to / 6 дней назад

    Все инструменты, которые я собираюсь представить, работают на Ubuntu v20.04.4 LTS. К тому времени, как вы это прочтете, большинство из них, вероятно, будут работать и в более новых версиях. - Источник: dev.to / 6 дней назад

    Linux Mint — это новый дистрибутив, который рекомендуется новичкам. Раньше он был Ubuntu и до сих пор остается самым популярным, но я думаю, что люди стали настороженно относиться к Canonical и перестали ему доверять. – Источник: Reddit / 8 дней назад

    SASM упоминает (0)

    Мы пока не отслеживали никаких упоминаний SASM. Отслеживание рекомендаций SASM началось примерно в марте 2021 года.

    Какие есть альтернативы?

    При сравнении Ubuntu и SASM вы также можете рассмотреть следующие продукты

    Linux Mint. Linux Mint — один из самых популярных дистрибутивов Linux для настольных ПК, которым пользуются миллионы людей.

    Visual Studio Code: создавайте и отлаживайте современные веб-приложения и облачные приложения от Microsoft

    Arch Linux. Вы попали на веб-сайт Arch Linux, облегченного и гибкого дистрибутива Linux®, который старается сделать его простым. В настоящее время у нас есть официальные пакеты, оптимизированные для архитектуры x86-64.

    Sublime Text — Sublime Text — это сложный текстовый редактор для кода, html и прозы — любых текстовых файлов. Вам понравится приятный пользовательский интерфейс и необычные функции. Полностью настраиваемый с помощью макросов и подсветки синтаксиса для большинства основных языков.

    Manjaro Linux — Manjaro Linux — это новый дистрибутив Linux, основанный на Arch Linux. Получить ManjaroДобро пожаловать на официальную страницу установочного носителя Manjaro Linux.Узнайте больше о Manjaro Linux.

    Vim — текстовый редактор с широкими возможностями настройки, позволяющий эффективно редактировать текст

    В этом руководстве показано, как писать программы на ассемблере для архитектуры x86-64.

    Вы будете писать как (1) автономные программы, так и (2) программы, которые интегрируются с C.

    Мы не будем слишком заморачиваться.

    Ваша первая программа

    Прежде чем изучать nasm, убедитесь, что вы умеете вводить текст и запускать программы.

    Убедитесь, что установлены и nasm, и gcc. Сохраните одну из следующих программ как hello.asm, в зависимости от платформы вашего компьютера. Затем запустите программу в соответствии с данными инструкциями.

    Если вы используете ОС на базе Linux:

    Если вы используете macOS:

    Структура программы NASM

    NASM основан на строках. Большинство программ состоят из следующих за ними одного или нескольких файлов . Строки могут иметь необязательный . За большинством строк следует ноль или более символов .

    nasmstructure.jpg

    Как правило, вы помещаете код в раздел с именем .text, а ваши постоянные данные — в раздел с именем .data.

    Подробнее

    Ваши первые несколько инструкций

    Три вида операндов

    Зарегистрировать операнды

    В этом руководстве нас интересуют только целочисленные регистры и регистры xmm. Вы уже должны знать, что такое регистры, но вот краткий обзор. 16 целочисленных регистров имеют ширину 64 бита и называются:

    (Обратите внимание, что 8 регистров имеют альтернативные имена.) Вы можете обращаться с младшими 32-битами каждого регистра как с самим регистром, но используя следующие имена:

    Вы можете рассматривать младшие 16 бит каждого регистра как регистр, но используя следующие имена:

    По историческим причинам биты с 15 по 8 R0 .. R3 названы так:

    И, наконец, есть 16 регистров XMM, каждый из которых имеет ширину 128 бит, с именами:

    Изучите эту картинку; надеюсь, это поможет:

    rdx.jpg

    Операнды памяти

    • [ число ]
    • [рег.]
    • [ reg + reg*scale ] масштаб только 1, 2, 4 или 8
    • [рег.+номер]
    • [ reg + reg*масштаб + число ]

    Число называется смещением; простой регистр называется базовым; регистр со шкалой называется индексом.

    Непосредственные операнды

    Они могут быть написаны разными способами. Вот несколько примеров из официальной документации.

    Инструкции с двумя операндами памяти встречаются крайне редко

    Определение данных и резервирование пространства

    Эти примеры взяты из главы 3 документации. Чтобы поместить данные в память:

    Есть и другие формы; проверьте документы NASM. Позже.

    Чтобы зарезервировать место (без инициализации), вы можете использовать следующие псевдоинструкции. Они должны находиться в разделе с именем .bss (вы получите сообщение об ошибке, если попытаетесь использовать их в разделе .text):

    Еще один пример

    Вот программа для macOS для изучения:

    • cmp выполняет сравнение
    • je переходит к метке, если предыдущее сравнение было равно. У нас также есть jne (прыгать, если не равно), jl (прыгать, если меньше), jnl (прыгать, если не меньше), jg (прыгать, если больше), jng (прыгать, если не больше), jle (прыгать, если меньше или равно), jnle (перейти, если не меньше или равно), jge (перейти, если больше или равно), jnge (перейти, если не больше или равно) и многие другие.
    • equ на самом деле не настоящая инструкция. Он просто определяет аббревиатуру для использования самим ассемблером. (Это глубокая идея.)
    • Раздел .bss предназначен для доступных для записи данных.

    Использование библиотеки C

    Написание автономных программ только с системными вызовами — это круто, но редко. Мы хотели бы использовать хорошие возможности библиотеки C.

    Помните, как в C выполнение «начинается» с функции main ? Это потому, что библиотека C на самом деле имеет метку _start внутри себя! Код в _start выполняет некоторую инициализацию, затем вызывает main , затем выполняет некоторую очистку, а затем выполняет системный вызов для выхода. Так что вам просто нужно реализовать main . Мы можем сделать это в сборке!

    Если у вас Linux, попробуйте следующее:

    Под macOS это будет выглядеть немного иначе:

    В macOS функции C (или любые функции, которые экспортируются из одного модуля в другой) должны начинаться с префикса подчеркивания. Стек вызовов должен быть выровнен по 16-байтовой границе (подробнее об этом позже). А при доступе к именованным переменным требуется префикс rel.

    Соглашения о вызовах

    Как мы узнали, что аргумент puts должен быть передан в RDI? Ответ: в отношении звонков соблюдается ряд соглашений.

    Понял? Нет? Нужно больше примеров и практики.

    Вот программа, иллюстрирующая, как нужно сохранять и восстанавливать регистры:

    Смешение C и ассемблера

    Эта программа представляет собой простую функцию, которая принимает три целочисленных параметра и возвращает максимальное значение.

    Вот программа на C, которая вызывает функцию языка ассемблера.

    Условные инструкции

    • s (знак)
    • z (ноль)
    • с (нести)
    • о (переполнение)

    У условных инструкций есть три основные формы: j для условного перехода, cmov для условного перемещения и set для условного набора. Суффикс инструкции имеет одну из 30 форм: s ns z nz c nco no p npp pe po e nl le nleg ng ge nge na aae nae b nb be nbe .

    Аргументы командной строки

    Вы знаете, что в C main — это обычная старая функция, и у нее есть пара собственных параметров:

    Как вы уже догадались, argc будет иметь значение rdi, а argv (указатель) — значение rsi. Вот программа, которая использует этот факт для простого вывода аргументов командной строки программе, по одному на строку:

    Более длинный пример

    Обратите внимание, что в библиотеке C аргументы командной строки всегда являются строками. Если вы хотите обрабатывать их как целые числа, вызовите atoi . Вот изящная программа для вычисления x y .

    Инструкции с плавающей запятой

    Аргументы с плавающей запятой помещаются в регистры xmm. Вот простая функция для суммирования значений в двойном массиве:

    Обратите внимание, что инструкции с плавающей запятой имеют суффикс sd; это самый распространенный, но мы увидим некоторые другие позже. Вот программа на C, которая его вызывает:

    Разделы данных

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

    Рекурсия

    Как ни странно, для реализации рекурсивных функций не требуется ничего необычного. Вы просто должны быть осторожны, чтобы сохранить регистры, как обычно. Типичная стратегия — вталкивание и выталкивание рекурсивного вызова.

    Пример вызывающего абонента:

    Параллелизм SIMD

    Вот функция, которая одновременно добавляет четыре числа с плавающей запятой:

    Насыщенная арифметика

    Вот пример. Он также иллюстрирует, как вы загружаете регистры XMM. Вы не можете загружать немедленные значения; вы должны использовать movaps для перемещения из памяти. Есть и другие способы, но в этом руководстве мы не рассмотрим все.

    Графика

    Локальные переменные и фреймы стека

    Во-первых, прочитайте статью Эли Бендерски. Этот обзор более полный, чем мои краткие заметки.

    При вызове функции вызывающая сторона сначала помещает параметры в правильные регистры, а затем выдает инструкцию вызова. Дополнительные параметры, помимо тех, которые охвачены регистрами, будут помещены в стек перед вызовом. Инструкция call помещает адрес возврата на вершину стека. Итак, если у вас есть функция

    Тогда при входе в функцию x будет в edi, y будет в esi, а адрес возврата будет на вершине стека. Куда мы можем поместить локальные переменные? Простой выбор находится в самом стеке, но если у вас достаточно регистров, используйте их.

    Если вы работаете на машине, поддерживающей стандартный ABI, вы можете оставить rsp там, где он есть, и получить доступ к «дополнительным параметрам» и локальным переменным непосредственно из rsp, например:

    Итак, наша функция выглядит так:

    Если бы наша функция выполняла еще один вызов, вам пришлось бы настроить rsp, чтобы в это время она не мешала.

    В Windows вы не можете использовать эту схему, потому что, если произойдет прерывание, все, что выше указателя стека, будет замазано. Этого не происходит в большинстве других операционных систем, потому что есть «красная зона» в 128 байтов после указателя стека, которая защищена от таких вещей. В этом случае вы можете сразу освободить место в стеке:

    поэтому наш стек выглядит так:

    Вот функция. Обратите внимание, что мы должны не забыть заменить указатель стека перед возвратом!

    Использование NASM в macOS

    • Этот формат объектного файла — macho64 , а не elf64 .
    • Номера системных вызовов совершенно разные.
    • Символы, используемые модулями, будут начинаться с префикса подчеркивания.
    • Похоже, компоновщик gcc в macOS не разрешает абсолютную адресацию, если вы не измените некоторые настройки. Поэтому добавляйте rel по умолчанию, когда вы ссылаетесь на помеченные ячейки памяти, и всегда используйте lea для получения адресов.
    • Кроме того, оказывается, что иногда в Linux требование выравнивания 16-битного стека не применяется, но оно всегда применяется в macOS.

    Итак, вот средняя программа, написанная для macOS.

    Использование NASM в Windows

    • Первые четыре целочисленных параметра передаются в RCX, RDX, R8 и R9. Остальные должны быть помещены в стек.
    • Вызываемый объект должен сохранять RBX, RBP, RDI, RSI, RSP, R12, R13, R14 и R15.
    • Как вы уже догадались, передаются первые четыре параметра с плавающей запятой: XMM0, XMM1, XMM2 и XMM3.
    • Возвращаемые значения идут в формате RAX или XMM0.

    ВАЖНО. Есть одна вещь, которую очень трудно найти в любой документации: соглашение о вызовах x64 требует, чтобы вы выделяли 32 байта теневого пространства перед каждым вызовом и удаляли его после вашего вызова. Это означает, что ваша программа «hello world» выглядит так:

    Вы заметили, что мы на самом деле зарезервировали 40 байт? Тридцать два байта теневого пространства — минимальное требование. В нашей основной функции мы вызываем другую функцию, поэтому наш стек должен быть выровнен по 16-байтовой границе. Когда вызывается main, адрес возврата (8 байт) был помещен в буфер обмена, поэтому мы должны «добавить» дополнительные 8 байтов в теневое пространство.

    Читайте также: