Ассемблер nasm

Для работы вам потребуется ассемблер nasm, версии не ниже 2.04.
Сайт проекта – http://www.nasm.us

Документация на русском языке для версии 0.98: http://www.opennet.ru/docs/RUS/nasm/.  Несмотря на то, что текущая версия ушла сильно вперед (2.09.04 на февраль 2011), можно пользоваться в ознакомительных целях.

Скачать ассемблер nasm для можно здесь: http://www.nasm.us/pub/nasm/releasebuilds/2.09.04/linux/.

Если Вы работаете под операционной системой Windows, одним из решений является установка среды cygwin . Скачав отсюда сетевой инсталлятор 32 разрядной версии среды, вы сможете развернуть cygwin на Вашей машине и транслировать ассемблерные программы из-под нее. По-умолчанию nasm не устанавливается, его необходимо явно отметить при установке.

Другой вариант, позволяющий незамедлительно разрабатывать/транслировать/отлаживать – учебная среда разработки с открытым исходным кодом SASM. Она уже содержит в себе все требуемые компоненты (cygwin, nasm, gdb, …). Найти ее можно здесь:

Шаблон ассемблерной программы

Минимальная ассемблерная программа выглядит следующим образом:

%include "io.inc"

section .text
global CMAIN
CMAIN:
   ; вместо этого комментария здесь должен быть код
   ret

Строка %include “io.inc” обеспечивает программу средствами ввода/вывода и определяет должным образом идентификатор CMAIN, указывающий начало программы аналогично тому, как это делает функция main в Си-программах.

Пример “Hello world!” имеет следующий вид:

%include "io.inc"

section .data
msg db 'Hello, world!', 0

section .text
global CMAIN
CMAIN:
   PRINT_STRING msg
   NEWLINE
   ret

Замечание. Если написать в секции данных следующий код:

.data
   str db 'Hello, world!', 0

то ассемблер выдаст сообщение об ошибке. Причина тому – существование ассемблерной инструкции с кодом str.

Средства ввода/вывода

Имя макроса Описание макроса
PRINT_UDEC size, data

PRINT_DEC size, data

Вывод числовых данных заданных параметром data в 10-чном представлении. Параметр size – число, указывающее размерность данность в байтах; допускаются значения 1, 2, 4. В качестве параметра 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). Введенные данные обрезаются соответствующим образом. Параметр 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 – регистр (io.inc версия 1.1) или числовая константа.