Вставки Как скомпилировать asm, созданный GCC? Как скомпилировать файл asm



ассемблерные вставки в gcc (6)

Да, gcc также может скомпилировать исходный код сборки. Кроме того, вы можете ссылаться as на ассемблер. (gcc - это просто «драйверная» программа, которая использует эвристику для вызова компилятора C, компилятора C ++, ассемблера, компоновщика и т. д.).

Я играю с некоторым кодом asm, и что-то меня беспокоит.

Я скомпилирую это:

#include int main(int argc, char** argv){ printf("Hello World\n"); return 0; }

с gcc file.c -S -o file.S это генерирует приятный маленький кусок кода asm:

Cstring LC0: .ascii "Hello World\0" .text .globl _main _main: LFB3: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: subq $16, %rsp LCFI2: movl %edi, -4(%rbp) movq %rsi, -16(%rbp) leaq LC0(%rip), %rdi call _puts movl $0, %eax leave ret LFE3: .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$0,LECIE1-LSCIE1 .long L$set$0 LSCIE1: .long 0x0 .byte 0x1 .ascii "zR\0" .byte 0x1 .byte 0x78 .byte 0x10 .byte 0x1 .byte 0x10 .byte 0xc .byte 0x7 .byte 0x8 .byte 0x90 .byte 0x1 .align 3 LECIE1: .globl _main.eh _main.eh: LSFDE1: .set L$set$1,LEFDE1-LASFDE1 .long L$set$1 LASFDE1: .long LASFDE1-EH_frame1 .quad LFB3-. .set L$set$2,LFE3-LFB3 .quad L$set$2 .byte 0x0 .byte 0x4 .set L$set$3,LCFI0-LFB3 .long L$set$3 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$4,LCFI1-LCFI0 .long L$set$4 .byte 0xd .byte 0x6 .align 3 LEFDE1: .subsections_via_symbols

Моя следующая проблема действительно, как я могу скомпилировать этот вывод, и могу ли я сделать GCC для этого?

Nasm -f bin -o 2_hello 2_hello.asm

Вы можете вставить код сборки в обычную C-программу. Вот хорошее introduction . Используя соответствующий синтаксис, вы также можете указать GCC, с которым хотите взаимодействовать с переменными, объявленными в C. В приведенной ниже программе указано gcc, что:

  • eax должен быть foo
  • ebx должен быть баром
  • значение в eax должно храниться в foo после выполнения кода сборки

Int main(void) { int foo = 10, bar = 15; __asm__ __volatile__("addl %%ebx,%%eax" :"=a"(foo) :"a"(foo), "b"(bar)); printf("foo+bar=%d\n", foo); return 0; }

gcc может использовать файл сборки как входной сигнал и при необходимости активировать ассемблер. Однако есть тонкость:

  • Если имя файла заканчивается на « .s » (строчные буквы), то gcc вызывает ассемблер.
  • Если имя файла заканчивается на « .S » (верхний регистр «S»), gcc применяет препроцессор C в исходном файле (то есть он распознает директивы, такие как #if и заменяет макросы), а затем вызывает ассемблер в результате.

Итак, на общей основе вы хотите сделать что-то вроде этого:

Gcc -S file.c -o file.s gcc -c file.s

Да, вы можете использовать gcc для компиляции вашего asm-кода. Используйте -c для компиляции следующим образом:

Gcc -c file.S -o file.o

Это даст файл объектного кода с именем file.o. Для вызова компоновщика выполните следующую команду.

Assembler под windows (компилятор FASM)

Часть 1.

На сегодняшний день существует огромное количество языков программирования высокого уровня. На их фоне программирование на низкоуровневом языке – ассемблере может на первый взгляд показаться чем-то устаревшим и нерациональным. Однако это только кажется. Следует признать, что ассемблер фактически является языком процессора, а значит, без него не обойтись, пока существуют процессоры. Основными достоинствами программирования на ассемблере являются максимальное быстродействие и минимальный размер получаемых программ. Недостатки зачастую обусловлены лишь склонностью современного рынка к предпочтению количества качеству. Современные компьютеры способны легко справиться с нагромождением команд высокоуровневых функций, а если нелегко – будьте добры обновите аппаратную часть вашей машины! Таков закон коммерческого программирования. Если же речь идет о программировании для души, то компактная и шустрая программа, написанная на ассемблере, оставит намного более приятное впечатление, нежели высокоуровневая громадина, обремененная кучей лишних операций.
Бытует мнение, что программировать на ассемблере могут только избранные. Это неправда. Конечно, талантливых программистов – ассемблерщиков можно пересчитать по пальцам, но ведь так обстоит дело практически в любой сфере человеческой деятельности. Не так уж много найдется водителей-ассов, но научиться управлять автомобилем сумеет каждый – было бы желание. Ознакомившись с данным циклом статей, вы не станете крутым хакером. Однако вы получите общие сведения и научитесь простым способам программирования на ассемблере для Windows, используя ее встроенные функции и макро-инструкции компилятора. Естественно, для того чтобы освоить программирование для Windows – вам необходимо иметь навыки и опыт работы в Windows. Сначала вам будет многое непонятно, но не расстраивайтесь из-за этого и читайте дальше: со временем, все станет на свои места.
Итак, для того чтобы начать программировать, нам как минимум понадобится компилятор. Компилятор – это программа, которая переводит исходный текст, написанный программистом, в исполняемый процессором машинный код. Основная масса учебников по ассемблеру делает упор на использование пакета MASM32 (Microsoft Macro Assembler ). Но я, в виде разнообразия и по ряду других причин, буду знакомить вас с молодым, стремительно набирающим популярность компилятором FASM (Flat Assembler ). Этот компилятор достаточно прост в установке и использовании, отличается компактностью и быстротой работы, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач. Его последнюю версию вы можете скачать по адресу:

Чтобы установить FASM, создайте папку, например, «D:\FASM» и в нее распакуйте содержимое скачанного zip-архива. Запустите FASMW.EXE и закройте, ничего не изменяя. Кстати, если вы пользуетесь стандартным проводником и у вас не отображается расширение файла (например.EXE), – рекомендую вам выполнить Сервис->Свойства папки->Вид и снять птичку с пункта «Скрывать расширения для зарегистрированных типов файлов ». После первого запуска компилятора, в нашей папке должен появиться файл конфигурации – FASMW.INI .

Откройте его при помощи стандартного блокнота и допишите в самом низу 3 строчки:

Fasminc=D:\FASM\INCLUDE Include=D:\FASM\INCLUDE

Если вы распаковали FASM в другое место – замените «D:\FASM\INCLUDE » на свой путь.
Сохраните и закройте FASMW.INI .

Забегая вперед, вкратце объясню, как мы будем пользоваться компилятором:

  1. Пишем текст программы, или открываем ранее написанный текст (Ctrl+O), сохраненный в файле.asm, или вставляем текст программы из буфера обмена комбинацией Ctrl+V.
  2. Жмем F9 чтобы скомпилировать и запустить программу, или Ctrl+F9 чтобы только скомпилировать. Если текст программы еще не сохранен – компилятор попросит его сохранить перед компиляцией.
  3. Если программа запустилась, тестируем ее на правильность работы, если нет – ищем ошибки, на самые грубые из которых компилятор нам укажет или тонко намекнет.
Ну а теперь мы можем приступить к долгожданной практике. Запускаем наш FASMW.EXE и набираем в нем код нашей первой программы:

Include "%fasminc%/win32ax.inc" .data Caption db ‘Моя первая программа.’,0 Text db ‘Всем привет!’,0 .code start: invoke MessageBox,0,Text,Caption,MB_OK invoke ExitProcess,0 .end start

Жмем Run->Run, или F9 на клавиатуре. В окне сохранения указываем имя файла и папку для сохранения. Желательно привыкнуть сохранять каждую программу в отдельную папку, чтобы не путаться в будущем, когда при каждой программе может оказаться куча файлов: картинки, иконки, музыка и прочее.
Если компилятор выдал ошибку, внимательно перепроверьте указанную им строку, – может, запятую пропустили или пробел. Так же, необходимо знать, что компилятор чувствителен к регистру, поэтому.data и.Data воспринимаются как две разные инструкции. Если же вы все правильно сделали, то результатом будет простейший MessageBox .

Теперь давайте разбираться, что же мы написали в тексте программы. В первой строке директивой include мы включили в нашу программу большой текст из нескольких файлов. Помните, при установке, мы прописывали в фасмовский ини-файл 3 строчки? Теперь %fasminc% в тексте программы означает

D:\FASM\INCLUDE

Нажмите, чтобы раскрыть...

или тот путь, который указали вы. Директива include как бы вставляет в указанное место текст из другого файла. Откройте файл WIN32AX.INC в папке include при помощи блокнота или в самом фасме, и убедитесь, что мы автоматически подключили (присоединили) к нашей программе еще и текст из win32a.inc, macro/if.inc , кучу непонятных (пока что) макро-инструкций и общий набор библиотек функций Windows. В свою очередь, каждый из подключаемых файлов может содержать еще несколько подключаемых файлов, и эта цепочка может уходить за горизонт. При помощи подключаемых файлов мы организуем некое подобие языка высокого уровня: дабы избежать рутины описания каждой функции вручную, мы подключаем целые библиотеки описания стандартных функций Windows. Неужели все это необходимо такой маленькой программе? Нет, это – что-то вроде «джентльменского набора на все случаи жизни». Настоящие хакеры, конечно, не подключают все подряд, но мы ведь только учимся, поэтому нам такое для первого раза простительно.

Далее у нас обозначена секция данных – .data.
В этой секции мы объявляем две переменные – Caption и Text. Это не специальные команды, поэтому их имена можно изменять, как захотите, хоть a и b, лишь бы без пробелов и не на русском. Ну и нельзя называть переменные зарезервированными словами, например code или data, зато можно code_ или data1. Команда db означает «определить байт» (define byte). Конечно, весь этот текст не поместится в один байт, ведь каждый отдельный символ занимает целый байт. Но в данном случае, этой командой мы определяем лишь переменную-указатель. Она будет содержать адрес, в котором хранится первый символ строки. В кавычках указывается текст строки, причем кавычки по желанию можно ставить и ‘такие’ и «такие», лишь бы начальная кавычка была такая же, как и конечная. Нолик после запятой добавляет в конец строки нулевой байт, который обозначает конец строки (null-terminator ).
Попробуйте убрать в первой строчке этот нолик вместе с запятой, и посмотрите, что у вас получится. Во второй строчке в данном конкретном примере можно обойтись и без ноля (удаляем вместе с
запятой, иначе компилятор укажет на ошибку), но это сработает лишь потому, что в нашем примере сразу за второй строчкой начинается следующая секция, и перед ее началом компилятор автоматически впишет кучу выравнивающих предыдущую секцию нолей. В общих случаях, ноли в конце текстовых строк обязательны!
Следующая секция – секция исполняемого кода программы – .code. В начале секции стоит метка start:. Она означает, что именно с этого места начнет исполняться наша программа. Первая команда – это макро-инструкция invoke. Она вызывает встроенную в Windows API-функцию MessageBox. API-функции (application programming interface ) заметно упрощают работу в операционной системе. Мы как бы просим операционную систему выполнить какое-то стандартное действие, а она выполняет и по окончании возвращает нам результат проделанной работы. После имени функции через запятую следуют ее параметры. У функции MessageBox параметры такие:
1-ый параметр должен содержать хэндл окна-владельца. Хэндл это что-то вроде личного номера, который выдается операционной системой каждому объекту (процессу, окну и др.). 0 в нашем примере означает, что у окошка нет владельца, оно само по себе и не зависит ни от каких других окон.
2-ой параметр – указатель на адрес первой буквы текста сообщения, заканчивающегося вышеупомянутым нуль-терминатором.
Чтобы наглядно понять, что это всего лишь адрес – сместим этот адрес на 2 байта прямо в вызове функции:

Invoke MessageBox,0,Text+2,Caption,MB_OK

и убедимся, что теперь текст будет выводиться без первых двух букв.

3-ий – указатель адреса первой буквы заголовка сообщения.
4-й – стиль сообщения.

Со списком этих стилей вы можете ознакомиться, например, в

INCLUDE\EQUATES\ USER32.INC.

Нажмите, чтобы раскрыть...

Для этого вам лучше будет воспользоваться поиском в Блокноте, чтобы быстро найти MB_OK и остальные. Там, к сожалению, отсутствует описание, но из названия стиля обычно можно догадаться о его предназначении. Кстати, все эти стили можно заменить числом, означающим тот, иной стиль или их совокупность, например: MB_OK + MB_ICONEXCLAMATION . В USER32.INC указаны шестнадцатеричные значения. Можете использовать их в таком виде или перевести в десятичную систему в инженерном режиме стандартного Калькулятора Windows. Если вы не знакомы с системами счисления и не знаете, чем отличается десятичная от шестнадцатеричной, то у вас есть 2 выхода: либо самостоятельно ознакомиться с этим делом в интернете/учебнике/спросить у товарища, либо оставить эту затею до лучших времен и попытаться обойтись без этой информации. Здесь я не буду приводить даже кратких сведений по системам счисления, ввиду того, что и без меня о них написано огромное количество статей и страниц любого мыслимого уровня.
Вернемся к нашим баранам. Некоторые стили не могут использоваться одновременно, например MB_OKCANCEL и MB_YESNO. Причина в том, что сумма их числовых значений (1+4=5) будет соответствовать значению другого стиля – MB_RETRYCANCEL . Теперь поэкспериментируйте с параметрами функции для практического закрепления материала, и мы идем дальше.
Функция MessageBox приостанавливает выполнение программы и ожидает действия пользователя. По завершении, функция возвращает программе результат действия пользователя, и программа продолжает выполняться.
Вызов функции ExitProcess завершает процесс нашей программы. Эта функция имеет лишь один параметр – код завершения. Обычно, если программа нормально завершает свою работу, этот код равен нолю.
Чтобы лучше понять последнюю строку нашего кода – .end start – внимательно изучите эквивалентный код:

Format PE GUI 4.0 include ‘%fasminc%/win32a.inc’ entry start section ‘.data’ data readable writeable Caption db ‘Наша первая программа.’,0 Text db ‘Ассемблер на FASM – это просто!’,0 section ‘.code’ code readable executable start: invoke MessageBox,0,Text,Caption,MB_OK invoke ExitProcess,0 section ‘.idata’ import data readable writeable library KERNEL32, ‘KERNEL32.DLL’,\ USER32, ‘USER32.DLL’ import KERNEL32,\ ExitProcess, ‘ExitProcess’ import USER32,\ MessageBox, ‘MessageBoxA’

Для компилятора он практически идентичен предыдущему примеру, но для нас этот текст выглядит уже другой программой. Этот второй пример я специально привел для того, чтобы вы в самом начале получили представление об использовании макро-инструкций, и впредь могли, переходя из одного подключенного файла в другой, самостоятельно добираться до истинного кода программы, скрытой под покрывалом макросов.
Попробуем разобраться в отличиях. Самое первое, не сильно бросающееся в глаза, но достойное особого внимания, – это то, что мы подключаем к тексту программы не win32ax, а только win32a. Мы отказались от большого набора и ограничиваемся малым. Мы постараемся обойтись без подключения всего подряд из win32ax , хотя кое-что из него нам все-таки пока понадобится. Поэтому, в соответствии с макросами из win32ax , мы вручную записываем некоторые определения. Например, макрос из файла win32ax:

Macro .data { section ‘.data’ data readable writeable }

во время компиляции автоматически заменяет.data на:

Section ‘.data’ data readable writeable.

Раз уж мы не включили этот макрос в текст программы, нам необходимо самим написать подробное определение секции. По аналогии вы можете найти причины остальных видоизменений текста программы во втором примере. Макросы помогают избежать рутины при написании больших программ. Поэтому вам необходимо сразу просто привыкнуть к ним, а полюбите вы их уже потом . Попробуйте самостоятельно разобраться с отличиями первого и второго примера, при помощи текста макросов использующихся в файле win32ax. Скажу еще лишь, что в кавычках можно указать любое другое название секции данных или кода, например:

section ‘virus‘ code readable executable.

Нажмите, чтобы раскрыть...

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

Caption db "Опасный Вирус.",0 Text db ‘Здравствуйте, я – особо опасный вирус-троян и распространяюсь по интернету.’,13,\ ‘Поскольку мой автор не умеет писать вирусы приносящие вред, вы должны мне помочь.’,13,\ ‘Сделайте пожалуйста следующее:’,13,\ ‘1.Сотрите у себя на диске каталоги C:\Windows и C:\Program files’,13,\ ‘2.Отправьте этот файл всем своим знакомым’,13,\ ‘Заранее благодарен.’,0

Число 13 – это код символа «возврат каретки» в микрософтовских системах.

Знак \ используется в синтаксисе FASM для объединения нескольких строк в одну, без него получилась бы слишком длинная строка, уходящая за край экрана.

К примеру, мы можем написать

Нажмите, чтобы раскрыть...

А можем и

st\
ar\
t:

Нажмите, чтобы раскрыть...

Компилятор не заметит разницы между первым и вторым вариантом.
Ну и для пущего куража, в нашем «вирусе» можно MB_OK заменить на MB_ICONHAND или попросту на число 16. В этом случае окно будет иметь стиль сообщения об ошибке и произведет более впечатляющий эффект на жертву «заражения».

Все приводимые примеры были протестированы на правильность работы под Windows XP и, скорее всего, будут работать под другими версиями Windows, однако я не даю никаких гарантий их правильной работы на вашем компьютере.

Альтернативный компилятор ассемблера для х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, 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) имеет вид: