Туториал по fasm (windows x32 api/win32api), «hello world!»
Содержание:
- Рассмотрим команды ассемблера на практическом примере.
- Трансляция и запуск программы
- Основные характеристики аппаратного обеспечения ПК
- О программе
- Быть или не быть?
- Библиотека макросов для NASM «io.inc»
- Трансляция и линковка.
- Как пользоваться
- Стейтменты
- Командный файл для упрощения запуска
- Первая программа
- Почему это круто
- Шестнадцатеричная система счисления
- Как мыслит процессор
- 6.5.4 elf-расширение директивы COMMON
- 6.6 aout: Объектные файлы a.out Линукс
- 6.7 aoutb: Объектные файлы a.out NetBSD/FreeBSD/OpenBSD
- 6.8 as86: Объектные файлы as86 Линукс
- 6.9 rdf: Перемещаемые динамические объектные файлы
- Реализация
Рассмотрим команды ассемблера на практическом примере.
С использованием среды разработки TASMED или любого текстового редактора набираем код. Программа, задаст вопрос на английском языке о половой принадлежности (имеется ввиду ваш биологический пол при рождении). Если вы нажмете m (Man), будет выведено приветствие с мужчиной, если w (Woman), то с женщиной, после этого программа прекратит работу. Если будет нажата любая другая клавиша, то программа предположит, что имеет дело с гоблином, не поверит и будет задавать вам вопросы о половой принадлежности, пока вы не ответите верно.
;goblin.asm
.model tiny ; for СОМ
.code ; code segment start
org 100h ; offset in memory = 100h (for COM)
start: main proc
begin:
mov ah,09h
mov dx,offset prompt
int 21h
inpt:
mov ah,01h
int 21h
cmp al,’m’
je mode_man
cmp al,’w’
je mode_woman
call goblin
jmp begin
mode_man:
mov addrs,offset man; указатель на процедуру в addrs
jmp cont
mode_woman:
mov addrs,offset woman; указатель на процедуру в addrs
cont:
call word ptr addrs; косвенный вызов процедуры
mov ax,4c00h
int 21h
main endp
man proc
mov ah,09h
mov dx,offset mes_man
int 21h
ret
man endp
woman proc
mov ah,09h
mov dx,offset mes_womn
int 21h
ret
woman endp
goblin proc
mov ah,09h
mov dx,offset mes_gobl
int 21h
ret
goblin endp
;DATA
addrs dw 0;for procedure adress
prompt db ‘Are you Man or Woman [m/w]? : $’
mes_man db 0Dh,0Ah,»Hello, Strong Man!»,0Dh,0Ah,’$’ ; строка для вывода. Вместо ASCII смвола ‘$’ можно написать машинный код 24h
mes_womn db 0Dh,0Ah,»Hello, Beautyful Woman!»,0Dh,0Ah,’$’ ; строка для вывода
mes_gobl db 0Dh,0Ah,»Hello, Strong and Beautyful GOBLIN!»,0Dh,0Ah,24h ; строка для вывода. 24h = ‘$’ .
len = $ — mes_gobl
end start
1 |
;goblin.asm .modeltiny; for СОМ .code; code segment start org100h; offset in memory = 100h (for COM) startmainproc begin movah,09h movdx,offsetprompt int21h inpt movah,01h int21h cmpal,’m’ jemode_man cmpal,’w’ jemode_woman callgoblin jmpbegin mode_man movaddrs,offsetman; указатель на процедуру в addrs jmpcont mode_woman movaddrs,offsetwoman; указатель на процедуру в addrs cont callwordptraddrs; косвенный вызов процедуры movax,4c00h int21h mainendp manproc movah,09h movdx,offsetmes_man int21h ret manendp womanproc movah,09h movdx,offsetmes_womn int21h ret womanendp goblinproc movah,09h movdx,offsetmes_gobl int21h ret goblinendp addrsdw;for procedure adress promptdb’Are you Man or Woman [m/w]? : $’ mes_mandb0Dh,0Ah,»Hello, Strong Man!»,0Dh,0Ah,’$’; строка для вывода. Вместо ASCII смвола ‘$’ можно написать машинный код 24h mes_womndb0Dh,0Ah,»Hello, Beautyful Woman!»,0Dh,0Ah,’$’; строка для вывода mes_gobldb0Dh,0Ah,»Hello, Strong and Beautyful GOBLIN!»,0Dh,0Ah,24h; строка для вывода. 24h = ‘$’ . len=$-mes_gobl endstart |
Трансляция и запуск программы
Дважды щелкните по файлу , который вы скачали на шаге установки.
Откроется окно командной строки. Убедитесь, что все сделано правильно, набрав
команду и нажав . Вы должны увидеть, что в текущем каталоге
(вашем рабочем каталоге) находятся файлы и :
Примечание для тех, кто никогда прежде не работал с командной строкой.
Взаимодействие с ней устроено следующим образом: командная строка выводит
приглашение (в примере выше это ), далее пользователь вводит
команду (выше — ) и нажимает клавишу , после чего на
экране появляется вывод команды, то есть результат ее работы.
Для запуска программы требуется ее оттранслировать. Первый шаг — запуск
ассемблера MASM, который построит по исходному тексту програмы объектный
файл:
Аргумент инструктирует ассемблер выполнить только трансляцию в объектный
файл, без компоновки (которую мы выполним чуть позже). Аргумент
указывает формат объектного файла — COFF (Common Object File Format).
В рабочем каталоге появится файл . Запустите компоновщик:
Аргумент говорит компоновщику, что нужно построить
консольное Windows-приложение.
В рабочем каталоге появится файл . Это исполняемый файл, который
уже можно запустить:
Основные характеристики аппаратного обеспечения ПК
Основное аппаратное обеспечение ПК состоит из процессора, памяти и регистров. Регистры — это компоненты процессора, содержащие данные и их адреса в памяти. Чтобы выполнить программу, система копирует её с внешнего устройства в оперативную память. Затем процессор выполняет инструкции программы.
Данные в компьютере хранятся в битах: (ВКЛ) или (ВЫКЛ).
Процессор поддерживает следующие размеры данных:
word — 2-байтовый элемент данных;
doubleword — 4-байтовый (32-битный) элемент данных;
quadword — 8-байтовый (64-битный) элемент данных;
paragraph — 16-байтовая (128-битная) область;
kilobyte — 1024 байт;
megabyte — 1 048 576 байт.
О программе
В SASM Вы можете легко разрабатывать и выполнять программы, написанные на языках ассемблера NASM, MASM, GAS, FASM. Вводите код в форму и запускайте приложение. В Windows также возможен запуск приложения в отдельном окне. Входные данные указывайте в поле «Ввод». В поле «Вывод» Вы сможете увидеть результат работы программы. При этом все сообщения и ошибки компиляции будут выводиться в форму снизу. Вы можете сохранять исходный или скомпилированный (exe) код программы в файл, а также загружать свои программы из файла.
Программа поддерживает работу с несколькими проектами – новые файлы открываются и создаются в новых вкладках. При выходе из программы текущий набор открытых файлов сохраняется. При следующем запуске Вы сможете восстановить предыдущую сессию. В параметрах настраивается шрифт, цветовая схема и текст, отображающийся при создании нового файла. Интерфейс программы доступен на восьми языках (русский, английский, турецкий (спасибо Ali Goren), китайский (спасибо Ahmed Zetao Yang), немецкий (спасибо Sebastian Fischer), итальянский (спасибо Carlo Dapor), польский (спасибо Krzysztof Rossa), иврит (спасибо Elian Kamal), испанский (спасибо Mariano Cordoba)). Все окна в программе плавающие, с возможностью закрепления в одной из множества позиций. Имеется возможность переназначения горячих клавиш.
Стандартное меню «Правка» дополнено возможностью комментирования/раскомментирования выделенного куска кода и создания/удаления отступа в 4 пробела (Tab/Shift+Tab).
В SASM вы можете находить ошибки в своих программах с помощью интерфейса к отладчику gdb. В программе можно просматривать значения регистров и переменных, а также устанавливать точки останова и перемещаться по отлаживаемой программе. Дополнительно имеется возможность выполнять произвольные команды отладчика gdb, результаты которых будут отображаться в логе.
SASM полностью поддерживает работу с четырьмя ассемблерами NASM, MASM, GAS, FASM в двух режимах — x64 и x86, переключаться между которыми можно в настройках на вкладке «Построение». Там же можно изменить опции ассемблера и компоновщика и выбрать, какие программы будут использоваться для ассемблирования и компоновки.
Быть или не быть?
Так, нужно ли изучать ассемблер современному программисту? Если вы уже не новичок в программировании, и у вас серьёзные амбиции, то изучение ассемблера, внутреннего устройства операционных систем и функционирования железа (особенно процессоров, памяти), а также использование различных инструментов для дизассемблирования, отладки и анализа кода полезно тем, кто хочет писать действительно эффективные программы. Иначе будет сложно в полной мере понять, что происходит «под капотом» любимого компилятора (хотя бы в общих чертах), как оптимизировать программы на любом языке программирования и какой приём стоит предпочесть. Необязательно погружаться слишком глубоко в эту тему, если вы пишете на Python или JavaScript. А вот если ваш язык – C или C++, хорошенько изучить ассемблер будет полезно.
Вместе с тем, необходимо помнить не только о «тактике», но и о «стратегии» написания кода, поэтому не менее важно изучать и алгоритмы (правильный выбор которых зачастую более важен для создания эффективных программ, нежели низкоуровневая оптимизация), шаблоны проектирования и многие другие технологии, без которых программист не может считать себя современным
Библиотека макросов для NASM «io.inc»
В программу включена библиотека макросов для NASM «io.inc». В ней есть кроссплатформенные команды ввода-вывода и макросы: CMAIN — точка входа и CEXTERN для доступа к внешним функциям на языке C. Подробнее о ее командах Вы можете узнать здесь или ниже.
Имя макроса | Описание макроса |
PRINT_UDEC size, data
PRINT_DEC size, data |
Вывод числовых данных заданных параметром data в 10-чном представлении. Параметр size – число, указывающее размерность данных в байтах; допускаются значения 1, 2, 4, 8 (x64). В качестве параметра data может выступать числовая константа, символьная константа, имя переменной, имя регистра или адресное выражение (без спецификатора размера данных в памяти). Если задается регистр большего размера, то берется заданное параметром size количество младших разрядов. PRINT_UDEC интерпретирует число как беззнаковое, PRINT_DEC — как знаковое. |
PRINT_HEX size, data | Аналогично предыдущему, но данные выводятся в 16-чном представлении. |
PRINT_CHAR ch | Печатается символ, заданный параметром ch. В качестве параметра может выступать численная константа, символьная константа, имя переменной, имя регистра или адресное выражение (без спецификатора размера данных в памяти). Печатается всегда содержимое 8 младших разрядов. |
PRINT_STRING data | Печать строки текста, оканчивающейся символом с кодом 0. В качестве параметра можно передавать строковую константу, имя переменной или адресное выражение (без спецификатора размера данных в памяти). В случае печати строковой константы, наличие символа с кодом 0 в конце строки необязательно. |
NEWLINE | Макрос переводит печать на новую строку. |
GET_UDEC size, data
GET_DEC size, data |
Ввод числовых данных в 10-чном представлении с клавиатуры. Размер вводимых данных ограничен параметром size, который задается числом (1, 2, 4, 8 (x64)). Введенные данные обрезаются соответствующим образом. Параметр data – либо имя переменной, либо имя регистра, либо адресное выражение (без спецификатора размера данных в памяти). Если задается регистр большего размера, то старшие разряды заполняются знаковым битом в случае GET_DEC и нулями в случае GET_UDEC. GET_UDEC считывает беззнаковое число, GET_DEC — знаковое. Запрещается использовать в качестве параметра регистр esp. |
GET_HEX size, data | Аналогично предыдущему, но данные задаются в 16-чном представлении с префиксом 0x. |
GET_CHAR data | Аналогично предыдущему, но происходит считывание одного символа, нажатие Enter не требуется. Более того, нажатие Enter будет расцениваться как ввод управляющих символов перевода строки: 0xD 0xA в ОС Windows, 0xA в ОС *nix. Если параметр – регистр, размер которого больше 1 байта, значение считанного символа будет дополнено нулями. |
GET_STRING data, maxsz | Ввод последовательности символов длиной не более чем (maxsz-1). Чтение последовательности останавливается на EOF или переводе строки, причем перевод строки сохраняется в буфере. В конец считанной строки добавляется символ с кодом 0. Параметр data – либо имя переменной, либо адресное выражение (без спецификатора размера данных в памяти). Параметр maxsz – регистр или числовая константа. |
Трансляция и линковка.
Зачем создание программы разделено на две части — трансляцию и линковку:
Для того, чтобы дать возможность разделить работу по написанию кода на определённое число программистов — каждый пишет свой набор функций и сохраняет код в виде объектного файла. Затем объектные файлы соединяются
и получается полноценный программный продукт.
Чтобы можно было скрывать исходный код программ, продавая «полуфабрикат» — объектный файл (*.obj).
Для ускорения просчёта машиной больших по объёму программ
Во времена дефицита мощности процессоров это было важно. Если проект большой, то предварительно скомпилированная часть кода (уже проверенная и отлаженная) существенно разгружала компьютер.
Для совместимости использования различных ассемблеров (masm, tasm) — объектный файл стандартный и компонуется (линкуется) различными видами ассемблеров.
Для быстрого и удобного переноса кода, написанного на ассемблере в программы на Си, C++
Такая же история: *.obj файлы, генерированные TASM замечательно воспринимается Turbo C, Turbo C++ и другими линкерами языков высокого уровня.
К слову сказать, не все ассемблеры имеют «двухпроходный» подход к созданию кода. Например, Fasm (очень хороший ассемблер), создаёт программу одним действием. *.obj файл не создаётся. Это несколько усложняет вставки написанного на Fasm кода в проекты, созданные другими средствами разработки программ. В принципе, это основной недостаток Fasm, с лихвой перекрывающийся остальными его достоинствами.
Впрочем, в настоящее время всё выглядит немного иначе. Царствуют на рынке среды разработки программ, подходящие к вопросам совместимости эгоистично (Embarcadero RAD Studio, MS Visual Studio).
Для удобства создания программ, можно создать отдельные «батники», куда вписать команды трансляции и компоновки.
Как пользоваться
Скачивание и установка приложения проводится довольно быстро и легко. Для этого не понадобится каких-то особых знаний и умений. Читайте инструкцию и выполняйте каждый ее шаг.
Загрузка и установка
Перед загрузкой утилиты важно понимать, что она относится к сложным и многогранным инструментам. Перед началом работы с ней потребуется пройти соответствующее обучение
Но для начала давайте произведем инсталляцию программы на компьютер. Для этого делаем следующее:
- Внизу странички находим ссылку, по которой необходимо перейти для загрузки установочного дистрибутива.
- После распаковки архива запускаем инсталляцию софта, выполним двойной левый клик мышкой по исполняемому компоненту.
- Все дальнейшие действия осуществляются в соответствии с подсказками мастера установки. Изначально приложение будет на английском языке. Изменить его можно в настройках.
TASM в вашем полном распоряжении. Можно смело переходить к изучению и использованию программного обеспечения.
Инструкция по работе
Конечно же, в двух словах описать принципы работы с утилитой не получится. Для полного освоения софта вам потребуется не один день. Единственное, на чем хотелось бы сделать акцент, это то, что ввод, редактирование или копирование кодов здесь осуществляется через удобную панель. На этой же панели расположены основные клавиши для тестирования и запуска готового проекта. Кроме этого, в разделе настроек пользователь может изменить конфигурацию графического интерфейса или воспользоваться некоторыми дополнительными функциями.
Стейтменты
В ассемблере есть три вида стейтментов:
Выполняемые инструкции (или просто «инструкции») — сообщают процессору, что нужно делать. Каждая инструкция хранит в себе код операции (или «опкод») и генерирует одну инструкцию на машинном языке.
Директивы ассемблера — сообщают программе об аспектах компиляции. Они не генерируют инструкции на машинном языке.
Макросы — являются простым механизмом вставки кода.
В ассемблере на одну строку приходится один стейтмент, который должен соответствовать следующему формату:
mnemonic
1 | меткаmnemonicоперанды;комментарий |
Базовая инструкция состоит из названия инструкции () и операндов (они же «параметры»). Вот примеры типичных стейтментов ассемблера:
INC COUNT ; выполняем инкремент переменной памяти COUNT
MOV TOTAL, 48 ; перемещаем значение 48 в переменную памяти TOTAL
ADD AH, BH ; добавляем содержимое регистра BH к регистру AH
AND MASK1, 128 ; выполняем операцию AND с переменной MASK1 и 128
ADD MARKS, 10 ; добавляем 10 к переменной MARKS
MOV AL, 10 ; перемещаем значение 10 в регистр AL
1 |
INC COUNT;выполняеминкрементпеременнойпамятиCOUNT MOV TOTAL,48;перемещаемзначение48впеременнуюпамятиTOTAL ADD AH,BH;добавляемсодержимоерегистраBHкрегиструAH ANDMASK1,128;выполняемоперациюANDспеременнойMASK1и128 ADD MARKS,10;добавляем10кпеременнойMARKS MOV AL,10;перемещаемзначение10врегистрAL |
Командный файл для упрощения запуска
Когда вам надоест каждый раз набирать три команды для трансляции и запуска
программ, создайте такой командный файл (назвать его можно, например,
— то есть make/run):
Использовать его можно будет следующим образом:
Несколько комментариев по устройству этого командного файла:
-
Команда отключает дублирование каждой исполняемой команды в окне
командной строки. -
Аргумент при вызове ассемблера и компоновщика убирает строчку
“Copyright (C) Microsoft”, захламляющую экран. -
меняется на аргумент, который передан командному файлу, то есть имя
программы на ассемблере (выше — ). -
меняется на тот же аргумент, но без расширения (выше — ).
-
Связка выполняет очередную команду, только если предыдущая завершилась
успешно. В случае ошибок трансляции ваша программа запущена не будет.
Файл можно или копировать в каждый каталог, где вы планируете
размещать исходные тексты программ на ассемблере, или поместить его в каталог
, и тогда выполнять его будет можно из любого каталога, при
условии, что вы запустили командную строку при помощи .
Первая программа
Следующая программа на языке ассемблера выведет строку на экран:
section .text
global _start ; необходимо для линкера (ld)
_start: ; сообщает линкеру стартовую точку
mov edx,len ; длина строки
mov ecx,msg ; строка
mov ebx,1 ; дескриптор файла (stdout)
mov eax,4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра
mov eax,1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра
section .data
msg db ‘Hello, world!’, 0xa ; содержимое строки для вывода
len equ $ — msg ; длина строки
1 |
section.text global_start;необходимодлялинкера(ld) _start;сообщаетлинкерустартовуюточку mov edx,len;длинастроки mov ecx,msg;строка mov ebx,1;дескрипторфайла(stdout) mov eax,4;номерсистемноговызова(sys_write) int0x80;вызовядра mov eax,1;номерсистемноговызова(sys_exit) int0x80;вызовядра section.data msg db’Hello, world!’,0xa;содержимоестрокидлявывода len equ$-msg;длинастроки |
Результат выполнения программы:
Почему это круто
Ассемблер позволяет работать с процессором и памятью напрямую — и делать это очень быстро. Дело в том, что в Ассемблере почти не тратится зря процессорное время. Если процессор работает на частоте 3 гигагерца — а это примерно 3 миллиарда процессорных команд в секунду, — то очень хороший код на Ассемблере будет выполнять примерно 2,5 миллиарда команд в секунду. Для сравнения, JavaScript или Python выполнят в тысячу раз меньше команд за то же время.
Ещё программы на Ассемблере занимают очень мало места в памяти. Именно поэтому на этом языке пишут драйверы, которые встраивают прямо в устройства, или управляющие программы, которые занимают несколько килобайт. Например, программа, которая находится в брелоке сигнализации и управляет безопасностью всей машины, занимает всего пару десятков килобайт. А всё потому, что она написана для конкретного процессора и использует его возможности на сто процентов.
Справедливости ради отметим, что современные компиляторы С++ дают машинный код, близкий по быстродействию к Ассемблеру, но всё равно немного уступают ему.
Шестнадцатеричная система счисления
Шестнадцатеричная система счисления состоит из 16 символов: и . Символы используются для представления шестнадцатеричных цифр, соответствующих десятичным значениям с 10 по 15.
Шестнадцатеричные значения в вычислениях используются для сокращения длинных двоичных представлений. По сути, шестнадцатеричная система счисления представляет собой двоичные данные, деля каждый байт пополам и выражая значение каждого полубайта. В следующей таблице приведены десятичные, двоичные и шестнадцатеричные эквиваленты:
Десятичное представление | Двоичное представление | Шестнадцатеричное представление |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Для конвертации бинарного числа в его шестнадцатеричный эквивалент разбейте бинарное число на 4 последовательные группы, начиная справа, и запишите эти группы поверх соответствующих цифр шестнадцатеричного числа.
Пример: Бинарное число 1000 (8) 1100 (C) 1101 (D) 0001 (1) эквивалентно шестнадцатеричному 8CD1.
Чтобы конвертировать шестнадцатеричное число в двоичное, просто запишите каждую шестнадцатеричную цифру в её 4-значный двоичный эквивалент.
Пример: Шестнадцатеричное число FAD8 эквивалентно двоичному 1111 (F) 1010 (A) 1101 (D) 1000 (8).
Как мыслит процессор
Чтобы понять, как работает Ассемблер и почему он работает именно так, нам нужно немного разобраться с внутренним устройством процессора.
Кроме того, что процессор умеет выполнять математические операции, ему нужно где-то хранить промежуточные данные и служебную информацию. Для этого в самом процессоре есть специальные ячейки памяти — их называют регистрами.
Регистры бывают разного вида и назначения: одни служат, чтобы хранить информацию; другие сообщают о состоянии процессора; третьи используются как навигаторы, чтобы процессор знал, куда идти дальше, и так далее. Подробнее — в расхлопе ↓
Какими бывают регистры
Общего назначения. Это 8 регистров, каждый из которых может хранить всего 4 байта информации. Такой регистр можно разделить на 2 или 4 части и работать с ними как с отдельными ячейками.
Указатель команд. В этом регистре хранится только адрес следующей команды, которую должен выполнить процессор. Вручную его изменить нельзя, но можно на него повлиять различными командами переходов и процедур.
Регистр флагов. Флаг — какое-то свойство процессора. Например, если установлен флаг переполнения, значит процессор получил в итоге такое число, которое не помещается в нужную ячейку памяти. Он туда кладёт то, что помещается, и ставит в этот флаг цифру 1. Она — сигнал программисту, что что-то пошло не так.
Флагов в процессоре много, какие-то можно менять вручную, и они будут влиять на вычисления, а какие-то можно просто смотреть и делать выводы. Флаги — как сигнальные лампы на панели приборов в самолёте. Они что-то означают, но только самолёт и пилот знают, что именно.
Сегментные регистры. Нужны были для того, чтобы работать с оперативной памятью и получать доступ к любой ячейке. Сейчас такие регистры имеют по 32 бита, и этого достаточно, чтобы получить 4 гигабайта оперативки. Для программы на Ассемблере этого обычно хватает.
Так вот: всё, с чем работает Ассемблер, — это команды процессора, переменные и регистры.
Здесь нет привычных типов данных — у нас есть только байты памяти, в которых можно хранить что угодно. Даже если вы поместите в ячейку какой-то символ, а потом захотите работать с ним как с числом — у вас получится. А вместо привычных циклов можно просто прыгнуть в нужное место кода.
6.5.4 elf-расширение директивы COMMON
ELF позволяет задавать требования к выравниванию общих переменных. Это делается
путем помещения числа (которое должно быть степенью двойки) после имени и размера
общей переменной и отделения этого числа (как обычно) двоеточием. Например,
массив двойных слов, который должен быть выровнен по двойным словам:
common dwordarray 128:4
Эта строка объявляет массив размером 128 байт и требует, чтобы он был выровнен
по 4-байтной границе.
6.6 aout: Объектные файлы
a.out Линукс
Формат aout генерирует объектные файлы a.out
в форме, используемой устаревшими Линукс системами. (Он отличается от других
объектных файлов a.out магическим числом в первых
четырех байтах файла. Также некоторые реализации a.out,
например NetBSD, поддерживают позиционно-независимый код, который реализация
Линукс не знает).
Формат a.out подразумевает расширение выходных
файлов по умолчанию .o.
Этот формат очень простой. Он не поддерживает специальных директив и символов,
не использует SEG или WRT
и в нем нет расширений никаких стандартных директив. Он поддерживает только
три стандартных секции с именами .text, .data и
.bss.
6.7 aoutb: Объектные файлы
a.out NetBSD/FreeBSD/OpenBSD
Формат aoutb генерирует объектные файлы a.out
в форме, используемой различными BSD-клонами UNIX: NetBSD, FreeBSD и OpenBSD.
Для большинства объектных файлов этот формат не отличается от aout
за исключением магического числа в первых четырех байтах файла. Однако формат
поддерживает (как и формат elf) позиционно-независимый
код, поэтому вы можете использовать его для написания разделяемых библиотек
BSD.
Расширение объектных файлов формата aoutb по умолчанию
.o.
Формат не поддерживает специальных директив и символов и имеет только три стандартных
секции с именами .text, .data и .bss.
Несмотря на это, для обеспечения типов перемещений в позиционно-независимом
коде он поддерживает использование WRT так же,
как это делает elf. Более подробно это описано
в .
aoutb, как и elf
поддерживает также расширение директивы GLOBAL:
см. .
6.8 as86: Объектные файлы
as86 Линукс
16-битный ассемблер Линукс as86 имеет свой собственный
нестандартный формат объектных файлов. Хотя его компаньон компоновщик ld86
выдает что-то близкое к обычным бинарникам a.out,
объектный формат, используемый для взаимодействия между as86
и ld86, все же не является a.out.
NASM на всякий случай поддерживает данный формат как as86.
Расширение выходного файла по умолчанию для данного формата .o.
Формат as86 это очень простой объектный
формат (с точки зрения NASM). Он не поддерживает специальных директив и символов,
не использует SEG и WRT,
и в нем нет никаких расширений стандартных директив. Он поддерживает только
три стандартных секции с именами .text, .data и
.bss.
6.9 rdf: Перемещаемые динамические
объектные файлы
Выходной формат rdf создает объектные файлы RDOFF.
RDOFF это «доморощенный» формат объектных файлов, разработанный вместе
с NASM и отражающий в себе внутреннюю структуру ассемблера.
RDOFF не используется никакими широко известными операционными системами. Однако
тот, кто пишет собственную систему, возможно захочет использовать его в качестве
собственного объектного формата, так как разработан он прежде всего для упрощения
и содержит очень мало бюрократии в заголовках файлов.
Архив Unix NASM и архив DOS с исходниками имеют подкаталог rdoff,
содержащий набор RDOFF-утилит: RDF-компоновщик, менеджер статических библиотек,
утилита, делающая дамп RDF-файла, и программа, загружающая и выполняющая RDF-исполнимый
файл под Линукс.
Формат rdf поддерживает только стандартные секции
с именами .text, .data и .bss.
Реализация
Windows
В качестве ассемблера для 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).
Версии ассемблеров и компоновщиков для NASM подобраны с учетом рекомендуемых программ для курса «Архитектура ЭВМ и язык ассемблера» ВМК МГУ 1-го потока.
Также в программу включен отладчик gdb 7.4 (7.6 для x64) из пакета MinGW и немного измененная для отладки библиотека макросов ввода-вывода.
Начиная с версии 3.0, в SASM включены fasm 1.71.39 и gas 2.23.1 из MinGW (gas 2.23.2 из MinGW64).
Ассемблер MASM невозможно было включить в сборку из-за его лицензии. Чтобы им воспользоваться, Вы должны установить MASM на Ваш компьютер с сайта https://www.masm32.com/ и указать пути до ассемблера (ml.exe, путь обычно «C:/masm32/bin/ml.exe») и до компоновщика (link.exe, путь обычно «C:/masm32/bin/link.exe») в соответствующих полях на вкладке «Построение».
Под Windows SASM после установки сразу готов к работе.
Linux
Для работы программы на Linux должны быть установлены: nasm или gas (если их планируется использовать, fasm уже включён в сборку), gcc, gdb (для отладки).
Больше информации о программе и её использовании можно получить в Wiki проекта на GitHub.