Вставки Как скомпилировать asm, созданный GCC? Альтернативный компилятор ассемблера х86 Как скомпилировать файл asm.

Компиляция файлов.asm с помощью компилятора ml.exe — Архив WASM.RU

Этот материал дополняет статью MS Developer Studio - среда разработки для ASM . Здесь приведен формат командной строки компилятора MASM 6.1+, расшифровка ее опций и комментарии по их применению при работе в среде MS Developer Studio.

Командная строка MASM имеет вид:

    ML filename filename

  • /options - необязательный перечень опций (см.таблицу ниже)
  • filename - имена файлов исходных текстов, подлежищих компиляции, разделенные пробелами. В среде MS Developer Studio обычно указывается только одно имя в виде шаблона $(InputPath).
  • /link linkoptions - командная строка компоновщика в случае, если используется опция /Bl. В среде MS Developer Studio обычно не применяется.
опция назначение применение для win32
/AT Enable tiny model (.COM file)
Создать файл в формате.com (модель tiny)
Не применяется, так как формат исполняемого файла.com не используется в Win32.
/Bl Use alternate linker
Использовать альтернативный компоновщик
Обычно не применяется, так как возможностей link.exe вполне достаточно. Используется опция /c
/c Assemble without linking
Только компиляция, без компоновки
Обязательно для применения в среде MS Developer Studio, чтобы выполнять компоновку отдельным этапом.
/Cp Preserve case of user identifiers
Сохранение регистра пользовательских идентификаторов
Применение не обязательно, но возможно для дополнительного контроля синтаксиса. Вызывает ошибку "A2006: undefined symbol" при несовпадении регистра в объявлении идентификатора и обращении к нему. Позволяет избежать ошибок на этапе компоновки в случае, если идентификатор объявлен с неверным регистром.
/Cu Map all identifiers to upper case
Приведение всех пользовательских идентификаторов к верхнему регистру
Не применяется, так как компоновка приложений Win32 чувствительна к регистру.
/Cx Preserve case in publics, externs
Сохранение регистра идентификаторов, объявленных публичными и внешними
В применении нет необходимости. Регистр идентификаторов имеет смысл на этапе компоновки, но не на этапе компиляции.
/coff Generate COFF format object file
Создать файл в формате COFF
Применение обязательно: это стандартный для windows формат объектных и исполняемых файлов.
/D[=text] Define text macro
Описание текстового макроса
Применяется по усмотрению программиста. Аналог директив EQU или =. Если текст содержит пробелы, его следует взять в кавычки. Обычно используется в отладочном версии приложения для объявления имени DEBUG.
/EP Output preprocessed listing to stdout
Вывод листинга препроцессора в stdout
Обычно применять нет необходимости. Листинг препроцессора представляет собой исходный текст вместе с включаемыми файлами.
/F Set stack size (bytes)
Определить размер стека (байт)
Практически не применяется. То же, что опция /STACK компоновщика link.exe. Обычно используется значение по умолчанию - 1 Мбайт.
/Fe Name executable
Имя исполняемого файла
Не применяется, так как с учетом опции /c компилятор не создает исполняемого файла
/Fl Generate listing
Создание файла листинга
Обычно не применяется, так как средства MS Developer Studio, как правило, достаточны для работы с текстом приложения.
/Fm Generate map
Создание map-файла
Не применяется, так как map-файл создается компоновщиком, а с учетом опции /c компилятор не вызывает компоновщик
/Fo Name object file
Имя объектного файла
Обычно не применяется. Позволяет задать obj-файлу имя, отличное от имени asm-файла.
/FPi Generate 80x87 emulator encoding
Включение кода эмулятора сопроцессора 80x87
Начиная с выхода в свет процессора 486 не применяется, так как с тех пор арифметический сопроцессор является неотъемлемой частью современных процессоров.
/Fr Generate limited browser info
Включить ограниченную информацию броузера
Применение менее предпочтительно, чем /FR, так как в информацию броузера не включа.тся сведения о локальных идентификаторах.
/FR Generate full browser info
Включить полную информацию броузера
Позволяет получать быстрый доступ к любому идентификатору во всем пространстве проекта и заголовочных файлов API win32.
/G Use Pascal, C, or Stdcall calls
Использовать соглашения вызова Pascal, C или Stdcall
В применении нет необходимости. Обычно использование соглашений вызова stdcall регламентируется директивой.model в тексте программы.
/H Set max external name length
Установить максимальную длину внешних имен
Обычно не применяется. Значение по умолчанию - 31, и его достаточно для работы в среде win32.
/I Add include path
Добавить путь для inc-файлов
Не применяется, так как собственных возможностей MS Developer Studio обычно достаточно для определения путей к inc-файлам. Допускается использовать до 10 опций /I.
/link
Опции командной строки компоновщика и подключаемые библиотеки
Не применяется, так как компоновка отключена опцией /c .
/nologo Suppress copyright message
Не показывать баннерный текст компилятора
Как правило, следует применяеть, так как баннерный текст смысловой нагрузки при разработке проекта не несет.
/Sa Maximize source listing
Листинг максимального формата
Применяется редко, так как собственных средств MS Developer Studio обычно достаточно для работы с исходным и компилированным текстом программы, и в выдаче листинга нет необходимости.
/Sc Generate timings in listing
Включить в листинг синхронизацию
То же
/Sf Generate first pass listing
Листинг первого прохода
То же
/Sl Set line width
Длина строки листинга, символов: 60...255 или 0.
То же
/Sn Suppress symbol-table listing
Не включать в листинг таблицу символов
То же
/Sp Set page length
Высота страницы листинга, строк: 10...255 или 0.
То же
/Ss Set subtitle
Текст подзаголовков листинга
То же
/St Set title
Текст заголовка листига
То же
/Sx List false conditionals
Включить в листинг все фрагменты условной компиляции
То же
/Ta Assemble non-.ASM file
Компилировать не-.asm файлы
Обычно не применяется. Служит для компиляции файлов, имя котрых имеет расширение, отличное от.asm.
/w Same as /W0 /WX
То же, что /W0 /WX
См. далее.
/WX Treat warnings as errors
Трактовать предупреждения как ошибки
Обычно в применении нет необходимости. В случае возникновения предупреждений компиляция завершается неуспешно.
/W Set warning level
Установить уровень предупреждеинй
Обычно в применении нет необходимости. Устанавливает перечень событий компиляции, трактуемых как предупреждения.
/X Ignore INCLUDE environment path
Игнорировать путь, установленный переменной окружения INCLUDE
Обычно не применяется, так как при работе в среде MS Developer Studio переменная окружения INCLUDE не используется.
/Zd Add line number debug info
Включить отладочную информацию в виде номеров строк
Обычно не применяется, так как на этапе отладки более целесообразно использовать опцию /Zi.
/Zf Make all symbols public
Объявить все имена публичными
Обычно не применяется.
/Zi Add symbolic debug info
Включить полную отладочную информацию
Обязательно применяется на этапе отладки. Формат отладочной информации MASM полностью совместим с используемым встроенным отладчиком MS Developer Studio.
/Zm Enable MASM 5.10 compatibility
Включить совместимость с MASM 5.10
Обычно не применяется. Отключает полезные для прикладного программирования свойства MASM, введенные в версиях 6.1+.
/Zp[n] Set structure alignment
Установить выравнивание структур
Может быть использован для установки принятого в win32 выравнивания по умолчанию - на 8 байт. Однако обычно в применении нет необходимости, так как в win32 используется два варианта выравнивания структур - на 4 и на 8 байт, и определять их выравнивание целесообразно непосредственно в описании структуры директивой STRUCT . Возможные значения для этой опции - 1, 2, 4 и 8 (последнее - в версиях MASM 6.13 и выше).
/Zs Perform syntax check only
Выполнять только проверку синтаксиса
Обычно не применяется. Подавляет формирование объектного модуля.

Типовая командная строка для этапа отладки (активен проект Win32 Debug) имеет вид:

Альтернативный компилятор ассемблера для х86. Ассемблер написан сам на себе имеет очень простой синтаксис. Позволяет создавать.com файл для ДОС. Поддерживает 32 разрядные режимы адресации и данных. Доступен вместе с исходным кодом.

Описание ассемблера.

  • Ассемблер работает из командной строки. Входной файл должен иметь любое имя с расширением:
    • .xxx или любым другим - значения не имеет, главное чтобы оно было

    Запуск на компиляцию:asm filename.ext. Результат - сообщение об ошибке в строке с № или filename.com / filename.obj

  • Ассемблер создает только*.com файлы, *.exe не созжаются. Конечно.com файл имеет ограничение 64 кб. кода, однако вряд ли кто-нибудь напишет на ассемблере больше. Т.к. создаются только*.com файлы не надо думать о сегментах. Нет у ассемблера и компоновщика. Он просто не нужен.
  • Ассемблер позволяет создавать модули*.obj , которые потом можно внедрять в код программ, как внешние подключаемые модули – подпрограммы.
  • Команды можно записывать в строчку разделяя их";"
  • Разделительные пробелы между командами и операндами вставлятьНЕ обязательно. Система команд х86 позволяет интерпретировать их и без пробелов.
  • Поскольку командаMOV встречается в программах на ассемблере наиболее часто ее имя писать не обязательно.
  • Регистр не имеет значения. Компилятор одинаково интерпретирует строки

    MOV AH,09
    movah,9
    aH,9

  • Ассемблер понимает 32 битные режимы адресации и автоматически вставляет префискы 32 битного адреса и данных, 66 и 67, когда это необходимо
  • Cистемa сообщения об ошибках довольно слабая. Сообщениеошибка в строке N следует понимать, какошибка в строке N +/- 1.
  • Команды математического сопроцессораНЕ поддерживаются .
  • * Коментарии вставляются между парными*
  • Основными синтаксическими элементами являются символы"=" и " () "
    • =Label= Вводит меку адреса.
    • (Label) вставляет значение адреса в код.

    Метки чувствительны к регистру.

Дальше рассмотрим пример HelloWorld .

* Кстати комментарии вставляются между парными звездочками
Пример1 "Hello World" выводит на экран надпись.*

JMPS(S)
=A1= "Hello World !"
=A2= 0A
=S= AX,B800;ES,AX;AX,3;INT10
CX,(A2-A1);SI,(A1);DI,500
AH,[(A2)]
=L= LODSB;STOSW;LOOP(L)
RET

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

JMP - кодирует длинный переход в пределах сегмента.
JMPS - короткий +/- 127 байт.
Со второй строкой все понятно. Третья строка:
По адресу (А2) в памяти ЭВМ размещается байт равный 0А.
Т.е.
Хотите зарезервировать в памяти байт - пищите так:
=vmode= 00 или =adr= 12
Надо выделить два байта пишите:
=X= 0000 или wo0
или
=Y=
wo something for example rd ptr 1234

Есть три ключевых слова определяющих размер.

  • by- BYTE (8)
  • wo - WORD (16)
  • dw - DWORD (32)

ассемблер проигнорирует все что встретит между этими буквами и первой цифрой.
Нужен массив из двойных слов - пожалуйста:
=array= dw0;12345678;01234;dw12;...
Желаете иметь таблицу адресов чего-нибудь - no problem:
=mytable= (adr1);(adr2);(adr3);dword(adr4)...
C адресами возможны следующие манипуляции:
CX,(A2-A1) * В CX получается длина строки(см пример)*
jmps (adr)+2;
mov ,(adr3-adr4)-5
В 386 процессоре появились команды длинного условного перехода. Отличаются они от коротких так:
JZ (adr) - короткий
JZ
_N (adr) - длинный.
Префиксы "66" и "67" вставляются автоматически.
Префиксы сегментов надо использовать в следующем виде:
ES:
LODSB
или
ES:;LODSB
SS:;MOVAX,}