Turbo assembler (tasm) 3.0.1
Содержание:
- Адресация данных в памяти
- Литература и веб ресурсы
- Описание и возможности
- О компиляторах
- Двоичная система счисления
- Рассмотрим команды ассемблера на практическом примере.
- Разбор: что значат этот весь текст?
- Реализация
- Команды ассемблера и команды процессора.
- Как мыслит процессор
- Трансляция и запуск программы
- Трансляция и линковка.
- Простейшая программа
- Секции ассемблера
- О программе
- Командный файл для упрощения запуска
Адресация данных в памяти
Процесс, посредством которого процессор управляет выполнением инструкций, называется циклом выполнения, который состоит из трех последовательных шагов:
Шаг №1: Извлечение инструкции из памяти.
Шаг №2: Расшифровка или идентификация инструкции.
Шаг №3: Выполнение инструкции.
Процессор может одновременно обращаться к одному или нескольким байтам памяти. Например, рассмотрим шестнадцатеричное значение 0824H, которое занимает 2 байта памяти. Байт старшего разряда или старший значащий байт – 08, младший байт – 24.
Процессор хранит данные в обратной последовательности байтов, т.е. байт младшего разряда сохраняется в нижнем адресе памяти (слева), а байт старшего разряда – в верхнем адресе памяти (справа). Таким образом, если процессор перенесет значение 0824H из регистра в память, то 24 будет в начале строки, а 08 – в конце, при этом читать данные процессор будет справа налево, а не слева направо (помним, что процессор работает в бинарной системе счисления):
Когда процессор переносит данные из памяти в регистр, то он опять меняет местами байты (т.е. 08 опять будет слева, а 24 – справа).
Есть 2 вида адресов памяти:
абсолютный адрес — прямая ссылка на конкретное местоположение;
сегментный адрес (или «смещение») — адрес сегмента памяти со значением смещения.
На следующем уроке мы рассмотрим установку среды разработки для языка ассемблера.
Литература и веб ресурсы
Beginners
- Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высшая школа, 1992. – 447 с.
- Брэдли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM.– М.: Радио и связь, 1988. – 448 с.
- Галисеев Г.В. Ассемблер IBM PC. Самоучитель.: – М.: Издательский дом «Вильямс», 2004. – 304 с.: ил.
- Дао Л. Программирование микропроцессора 8088. – М.: Мир, 1988. – 357 с.
- Жуков А.В., Авдюхин А.А. Ассемблер. – Спб.: БХВ-Петербург, 2003. – 448 с.: ил.
- Зубков С.В., Ассемблер для DOS, Windows и UNIX. – М.: ДМК Пресс, 2000. – 608 с.: ил. (Серия «Для программистов»).
- Ирвин К. Язык ассемблера для процессоров Intel, 4-е издание.: пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 912 с.: ил. – Парал. тит. англ.(см. также свежее 7-ое издание в оригинале)
- Нортон П., Соухэ Д. Язык ассемблера для IBM PC.– М.: Компьютер, 1992.– 352 с.
- Пильщиков В.Н. Программирование на языке ассемблера IBM PC.– М.: ДИАЛОГ-МИФИ, 1994–2014 288 с.
- Скляров И.С. Изучаем ассемблер за 7 дней www.sklyaroff.ru
Advanced
- Касперски К. Фундаментальные основы хакерства. Искусство дизассемблирования. – М.: СОЛОН-Пресс, 2004. 448 с. – (Серия «Кодокопатель»)
- Касперски К. Техника отладки программ без исходных текстов. – Спб.: БХВ-Петербург, 2005. – 832 с.: ил.
- Касперски К. Компьютерные вирусы изнутри и снаружи. – Спб.: Питер, 2006. – 527 с.: ил.
- Касперски К. Записки исследователя компьютерных вирусов. – Спб.: Питер, 2006. – 316 с.: ил.
- Кнут Д. Искусство программирования, том 3. Сортировка и поиск, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2003. – 832 с.: ил. – Парал. тит. англ.
- Колисниченко Д.Н. Rootkits под Windows. Теория и практика программирования «шапок-невидимок», позволяющих скрывать от системы данные, процессы, сетевые соединения. – Спб.: Наука и Техника, 2006. – 320 с.: ил.
- Лямин Л.В. Макроассемблер MASM.– М.: Радио и связь, 1994.– 320 с.: ил.
- Магда Ю. Ассемблер для процессоров Intel Pentium. – Спб.: Питер, 2006. – 410 с.: ил.
- Майко Г.В. Ассемблер для IBM PC.– М.: Бизнес-Информ, Сирин, 1997.– 212 с.
- Уоррен Г. Алгоритмические трюки для программистов, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 512 с.: ил. – Парал. тит. англ.
- Скляров И.С. Искуство защиты и взлома информации. – Спб.: БХВ-Петербург, 2004. – 288 с.: ил.
- Уэзерелл Ч. Этюды для программистов: Пер. с англ. – М.: Мир, 1982. – 288 с., ил.
- Электронная библиотека братьев Фроловых www.frolov-lib.ru
- Чекатов А.А. Использование Turbo Assembler при разработке программ.– Киев: Диалектика, 1995.– 288 с.
- Юров В. Assembler: специальный справочник.– Спб.: Питер, 2001.– 496 с.: ил.
- Юров В. Assembler. Практикум. 2-е изд. – Спб.: Питер, 2006. – 399 с.: ил.
- Юров В. Assembler. Учебник для вузов. 2-е изд. – Спб.: Питер, 2007. – 637 с.: ил.
- Пирогов В. Assembler учебный курс. 2001 Нолидж
- Пирогов В. АССЕМБЛЕР учебный курс 2003 Нолидж-БХВ
- Пирогов В. Assembler для windows
1-ое издание ― М.: изд-во Молгачева С.В., 2002
2-ое издание ― СПб.:. БХВ-Петербург, 2003 ― 684 с.: ил.
3-ье издание ― СПб.:. БХВ-Петербург, 2005 ― 864 с.: ил.
4-ое издание ― СПб.:. БХВ-Петербург, 2012 ― 896 с.: ил. - Пирогов В. Ассемблер на примерах. ― СПб.:. БХВ-Петербург, 2012 ― 416 с.: ил.
- Пирогов В. АССЕМБЛЕР и дизассемблирование. ― СПб.:. БХВ-Петербург, 2006. ― 464 с.: ил.
- Пирогов В. работа над книгой ’64-битовое программирование на ассемблере (Windows,Unix)’. В книге рассматривается программирование на fasm в 64-разрядных Windows и Unix
- Юров В., Хорошенко С. Assembler: учебный курс.– Спб.: Питер, 1999. – 672 с.
- Ю-Чжен Лю, Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем.– М.: Радио и связь, 1987.– 512 с.
- Agner Fog: Software optimization resources (assembly/c++) 1996 – 2017. Веб-страница
- Intel 64 and IA-32 Architectures Optimization Reference Manual
- Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture
- Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M
- Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z
- Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1
- Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2
- Leiterman J.C. 32/64-BIT 80×86 Assembly Language Architecture. 2005, Wordware Publishing, Inc (568 pages) 2320 Los Rios Boulevard Plano, Texas 75074
- Turbo Assembler Version 3.2 User’s Guide Borland International. Inc 1800 Green Hills Road P.O. BOX 660001, Scotts Valley, CA 95067-0001
- Статьи с сайта wasm.in
- Статьи с сайта sasm.narod.ru
- Сайт MASM32 и форум
- Сайт FASM и форум
- Сайт NASM
Описание и возможности
Программное обеспечение может использоваться как специалистами для полноценной работы, так и новичками для обучения. Приложение включает полноценную справочную систему, где можно найти ответы на все интересующие вас вопросы по теме. Графический интерфейс инструмента для программирования довольно простой и симпатичный. Работать с ним вполне комфортно. К ключевым возможностям можно отнести:
- Удобный поиск и замена отдельных элементов программы в автоматическом режиме.
- Работа с исполняемыми файлами – сбор и запуск.
- Создание и хранение файлов с кодами.
- Отправка файлов с кодами на печатающие устройства.
- Разработка различного софта и его тестирование.
- Работа с расширенными или стандартными сегментарными директивами.
О компиляторах
Какую операционную систему вы бы хотели использовать?
Windows | DOS | Linux | BSD | QNX | MacOS, работающий на процессоре Intel/AMD |
|
---|---|---|---|---|---|---|
FASM | x | x | x | x | ||
GAS | x | x | x | x | x | x |
GoAsm | x | |||||
HLA | x | x | ||||
MASM | x | x | ||||
NASM | x | x | x | x | x | x |
RosAsm | x | |||||
TASM | x | x |
Качество документации
Документация | Комментарии | |
---|---|---|
FASM | Хорошая | Большую часть свободного времени автор отдает в разработку инновационного FASMG. Тем не менее, автор обеспечивает поддержку FASM время от времени обновляет мануалы, а новые функции описывает на собственном форуме. Документацию можно считать достаточно хорошей. Веб-страница документации. |
Gas | Плохая | документирован слабо и документация, скорее, имеет «общий вид». gas ― это ассемблер, который был разработан, чтобы можно было легко писать код для разных процессоров. Документация, которая существует, в основном описывает псевдо коды и ассемблерные директивы. В режиме работы «intel_syntax» документация практически отсутствует. Книги, в которых используется синтаксис «AT&T»: «Программирование с нуля» Джонатона Бартлетта и «Профессиональный язык ассемблера» Ричарда Блюма, Konstantin Boldyshev asmutils — Linux Assembly. |
GoAsm | Слабая | Большая часть синтаксиса описана в руководстве, и опытный пользователь найдет то, что ищет. Множество руководств и размещено на сайте (http://www.godevtool.com/). Несколько учебников GoAsm:
|
HLA | Обширая | HLA имеет справочное руководство на 500 страниц. Сайт содержит десятки статей и документацию по HLA. |
MASM | Хорошая | Компанией Microsoft написано значительное количество документацию для MASM, существует большое количество справочников написанных для этого диалекта. |
NASM | Хорошая | Авторы NASM больше пишут программное обеспечение для этого диалекта, оставляя написание руководства на «потом». NASM существует достаточно долго, поэтому несколько авторов написали руководство для NASM Джефф Дунтеман (Jeff Duntemann) «Assembly Language Step-by-Step: Programming with Linux», Jonathan Leto «Writing A Useful Program With NASM», на русском языке есть книга Столярова (Сайт А.В. Столярова). |
RosAsm | Слабая | не очень интересные «онлайновые учебники». |
TASM | Хорошая | Компания Borland в свое время выпускала отличные справочные руководства, для TASM были написаны справочные руководства авторами-энтузиастами не связанными с фирмой Borland. Но Borland больше не поддерживает TASM, поэтому большая часть документации, предназначенная для TASM, не печатается и ее становится всё труднее и труднее найти. |
Учебники и учебные материалы
Комментарии | |
---|---|
FASM | Несколько учебников, в которых описывается программирование на FASM:
|
Gas | Учебник с использованием синтаксиса AT&TУчебник Ассемблер в Linux для программистов C |
HLA | 32-разрядная версия «The Art of Assembly Language Programming» (существует и в электронной, и в печатной форме), программирование под Windows или Linux |
MASM | большое количество книг по обучению программированию под DOS. Не очень много книг о программировании под Win32/64 Пирогов, Юров, Зубков, Фленов |
NASM | много книг, посвященных программированию в DOS, Linux, Windows. В книге Джеффа Дунтемана «Assembly Language Step-by-Step: Programming with Linux» используется NASM для Linux и DOS. Учебник Пола Картера использует NASM (DOS, Linux). |
TASM | Как и для MASM, для TASM было написано большое количество книг на основе DOS. Но, так как Borland больше не поддерживает этот продукт, писать книги об использовании TASM перестали. Том Сван написал учебник, посвященный TASM, в котором было несколько глав о программировании под Windows. |
Двоичная система счисления
Каждая система счисления использует позиционные обозначения разрядов чисел (их значений). Каждое следующее позиционное значение состоит из предыдущего позиционного значения, умноженного на 2 (именно на 2, так как это бинарная система, которая состоит из двух чисел). Если битом является , то позиционное значение умножается на 2, а если — позиционное значение остается . В бинарной системе счисления отсчет ведется справа налево, а не слева направо (как в десятичной системе).
Например, в следующей таблице показаны позиционные значения 8-битного двоичного числа :
Бит | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Позиционное значение | 128 | 64 | 32 | 16 | 8 | 4 | 1 |
Номер бита | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
Значение бинарного числа равно сумме позиционных значений всех бит:
Двоичное = десятичное .
Примечание: Детально о конвертации чисел из двоичной системы в десятичную и наоборот, а также о сложении двоичных чисел, читайте в материалах урока №44.
Рассмотрим команды ассемблера на практическом примере.
С использованием среды разработки 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 |
Разбор: что значат этот весь текст?
На 1 строчке: «format PE Console» — это строчка говорит FASM-у какой файл скомпилировать, точнее 1 слово, все остальные слова это аргументы (можно так сказать).
PE — EXE файл, программа.
Console — говорим что это у нас консольная программа, но вам некто не мешает сделать из консольной программы оконную и наоборот.
Но есть кроме это остальные:
-
format MZ — EXE-файл НО под MS-DOS
-
format PE — EXE-файл под Windows, аналогично format PE GUI 4.0
-
format PE64 — EXE-файл под Windows, 64 битное приложение.
-
format PE GUI 4.0 — EXE-файл под Windows, графическое приложение.
-
format PE Console — EXE-файл под Windows, консольная программа. (просто подключается заранее консоль)
-
format PE Native — драйвер
-
format PE DLL — DLL-файл Windows, поясню позднее.
-
format COFF — OBJ-файл Linux
-
format MS COFF — аналогично предыдущему
-
format ELF — OBJ-файл для gcc (Linux)
-
format ELF64 — OBJ-файл для gcc (Linux), 64-bit
Сразу за командой (для компилятора) идет это значит комментарий. К сожалению он есть только однострочный.
3 строка:
Говорим windows-у где\в каком месте стартовать. «start» это метка, но о метках чуть позже.
5 строка:
Подключает к проекту файл, в данном случае «win32a.inc» он находиться в папке INCLUDE (в папке с FASM). этот файл создает константы и создает макросы для облегчения программирования.
8 строка:
Секция данных, то есть программа делиться на секции (части), к этим секциям мы можем дать разрешение, имя.
Флаг «data» (Флаг это бит\байт\аргумент хранившей в себе какую-то информацию) говорит то что эта секция данных.
Флаги «readable writeable» говорят то что эта секция может читаться кем-то и записываться кем-то.
Текст ‘.data’ — имя секции
10 строка:
hello — это метка, она может быть любого имени (почти, есть некоторые зарезервированные имена), эта метка хранит в себе адрес строки, это не переменная, а просто адрес, но чтобы не запоминать адреса в ручную, помогает FASM он запоминает адрес и потом когда видит эту метку снова, то он заменяет слово на адрес.
db — говорит то что под каждый символ резервируем 1 байт. То есть 1 символ храниться в одном байте.
‘hello world!’ — наша строка в кодировке ASCII
Что значит «,0» в конце строки? — это символ с номером 0 (или просто ноль), у вас на клавиатуре нет клавиши которая имела символ с номером 0, по этому этот символ используют как показатель конца строки. То есть это значит конец строки. Просто ноль записываем в байт после строки.
12 строка:
Флаг «code» — говорит то что это секция кода.
Флаг «executable» — говорит то что эта секция исполняема, то есть в этой секции может выполняться код.
Все остальное уже разобрали.
14 строка:
Это второй вид меток. Просто эта метка указывает на следующую команду
Обратите внимание на то что в 3 строке мы указали start как метку входа в программу, это она и есть. Может иметь эта метка любое имя, главное не забудьте ваше новое имя метки вписать в
15 строка:
Функция printf — выводит текст\число в консоль. В данном случае текст по адресу «hello»
Это штото на подобие команды, но это и близко не команда ассемблера, а просто макрос.
Макрос — Это макро команда для компилятора, то есть вместо имени макроса подставляется что-то другое.
Например, макро команда invoke делиться на такие команды: (взят в пример команда с 15 строки)
Не переживайте если нечего не поняли.
17 строка:
getch — функция получения нажатой кнопки, то есть просто ждет нажатия кнопки и потом возвращает нажатую кнопку.
20 строка:
ExitProcess — WinAPI функция, она завершает программу. Она принимает значение, с которым завершиться, то есть код ошибки, ноль это нет ошибок.
23 строка:
Флаг «import» — говорит то что это секция импорта библиотек.
24-25 строки:
Макро команда «library» загружает DLL библиотеки в виртуальную память (не в ОЗУ, вам ОЗУ не хватит чтоб хранить всю виртуальную память).
Что такое DLL объясню позже.
kernel — имя которое привязывается к библиотеке, оно может быть любым.
Следующий текст после запятой: — это имя DLL библиотеки который вы хотите подключить.
Дальше есть знак это значит что текст на следующей строке нужно подставить в эту строку.
То есть код:
Заменяется на:
Это нужно потому что у ассемблера 1 строка это 1 команда.
27-28 строка:
— Макро команда, которая загружает функции из DLL.
— Имя к которой привязана DLL, может быть любым.
— Как будет называться функция в программе, это имя будет только в вашей программе, и по этому имени вы будете вызывать функцию. (WinAPI функция)
— Это имя функции которое будет загружено из DLL, то есть это имя функции которое прописано в DLL.
Дальше думаю не стоит объяснять, вроде все понятно.
Реализация
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.
Команды ассемблера и команды процессора.
Стоит пояснить, что если к вопросу подойти формально строго, то команды процессора и команды ассемблера — это не одно и то же. Ассеммблер — хоть и низкоуровневый язык программирования, но иногда он без спроса программиста «корректирует код под себя». Причём у каждого ассемблера (masm, tasm, fasm) это может быть по-разному. Самый яркий пример — команда ret. В ассемблерном коде мы запишем ret, а реальный ассемблер ассемблирует её как retf или retn 8. Может также изменяться код, добавлением в качестве выравнивания кода команды процессора nop (об этом ниже в статье) и т.п. Чтобы не усложнять суть вопроса, под понятиями команды процессора и команды ассемблера мы будем подразумевать одно и то же.
Команды процессора (команды ассемблера) в большинстве своём работают с аргументами, которые в ассемблере называются операндами. Система машинного кода процессоров Intel содержит более 300 команд (команды процессора, сопроцессора, MMX-расширения, XMM-расширения). С каждым новым процессором их количество растёт. Для того, чтобы профессионально программировать, не надо зубрить и разбирать все команды процессора. При необходимости можно воспользоваться справочником. В процессе чтения статей, вы поймёте, что основная суть знания ассемблера состоит не в доскональном знании всех команд, а в понимании работы системы.
Не следует забывать, что команды процессор видит в виде цифр, которые можно рассматривать как данные. Например, команда NOP занимает один байт и её машинный код — 90h.
Начиная изучать язык низкого уровня, мы будем иметь дело с ограниченным набором старых-добрых команд процессора. Иные команды ассемблера понадобятся специалистам, заинтересованным в оптимизацией кода, связанного со сложными математическими расчетами данных большого объёма.
Основные (т.н. целочисленные) команды ассемблера позволяют написать практически любую программу для операционных систем MS-DOS и Windows. Количество команд ассемблера, которыми вы будете пользоваться будет расти со временем прохождения курса. Для более детального понимания, в последствии можете обратиться к справочнику команд.
Как мыслит процессор
Чтобы понять, как работает Ассемблер и почему он работает именно так, нам нужно немного разобраться с внутренним устройством процессора.
Кроме того, что процессор умеет выполнять математические операции, ему нужно где-то хранить промежуточные данные и служебную информацию. Для этого в самом процессоре есть специальные ячейки памяти — их называют регистрами.
Регистры бывают разного вида и назначения: одни служат, чтобы хранить информацию; другие сообщают о состоянии процессора; третьи используются как навигаторы, чтобы процессор знал, куда идти дальше, и так далее. Подробнее — в расхлопе ↓
Какими бывают регистры
Общего назначения. Это 8 регистров, каждый из которых может хранить всего 4 байта информации. Такой регистр можно разделить на 2 или 4 части и работать с ними как с отдельными ячейками.
Указатель команд. В этом регистре хранится только адрес следующей команды, которую должен выполнить процессор. Вручную его изменить нельзя, но можно на него повлиять различными командами переходов и процедур.
Регистр флагов. Флаг — какое-то свойство процессора. Например, если установлен флаг переполнения, значит процессор получил в итоге такое число, которое не помещается в нужную ячейку памяти. Он туда кладёт то, что помещается, и ставит в этот флаг цифру 1. Она — сигнал программисту, что что-то пошло не так.
Флагов в процессоре много, какие-то можно менять вручную, и они будут влиять на вычисления, а какие-то можно просто смотреть и делать выводы. Флаги — как сигнальные лампы на панели приборов в самолёте. Они что-то означают, но только самолёт и пилот знают, что именно.
Сегментные регистры. Нужны были для того, чтобы работать с оперативной памятью и получать доступ к любой ячейке. Сейчас такие регистры имеют по 32 бита, и этого достаточно, чтобы получить 4 гигабайта оперативки. Для программы на Ассемблере этого обычно хватает.
Так вот: всё, с чем работает Ассемблер, — это команды процессора, переменные и регистры.
Здесь нет привычных типов данных — у нас есть только байты памяти, в которых можно хранить что угодно. Даже если вы поместите в ячейку какой-то символ, а потом захотите работать с ним как с числом — у вас получится. А вместо привычных циклов можно просто прыгнуть в нужное место кода.
Трансляция и запуск программы
Дважды щелкните по файлу , который вы скачали на шаге установки.
Откроется окно командной строки. Убедитесь, что все сделано правильно, набрав
команду и нажав . Вы должны увидеть, что в текущем каталоге
(вашем рабочем каталоге) находятся файлы и :
Примечание для тех, кто никогда прежде не работал с командной строкой.
Взаимодействие с ней устроено следующим образом: командная строка выводит
приглашение (в примере выше это ), далее пользователь вводит
команду (выше — ) и нажимает клавишу , после чего на
экране появляется вывод команды, то есть результат ее работы.
Для запуска программы требуется ее оттранслировать. Первый шаг — запуск
ассемблера MASM, который построит по исходному тексту програмы объектный
файл:
Аргумент инструктирует ассемблер выполнить только трансляцию в объектный
файл, без компоновки (которую мы выполним чуть позже). Аргумент
указывает формат объектного файла — COFF (Common Object File Format).
В рабочем каталоге появится файл . Запустите компоновщик:
Аргумент говорит компоновщику, что нужно построить
консольное Windows-приложение.
В рабочем каталоге появится файл . Это исполняемый файл, который
уже можно запустить:
Трансляция и линковка.
Зачем создание программы разделено на две части — трансляцию и линковку:
Для того, чтобы дать возможность разделить работу по написанию кода на определённое число программистов — каждый пишет свой набор функций и сохраняет код в виде объектного файла. Затем объектные файлы соединяются
и получается полноценный программный продукт.
Чтобы можно было скрывать исходный код программ, продавая «полуфабрикат» — объектный файл (*.obj).
Для ускорения просчёта машиной больших по объёму программ
Во времена дефицита мощности процессоров это было важно. Если проект большой, то предварительно скомпилированная часть кода (уже проверенная и отлаженная) существенно разгружала компьютер.
Для совместимости использования различных ассемблеров (masm, tasm) — объектный файл стандартный и компонуется (линкуется) различными видами ассемблеров.
Для быстрого и удобного переноса кода, написанного на ассемблере в программы на Си, C++
Такая же история: *.obj файлы, генерированные TASM замечательно воспринимается Turbo C, Turbo C++ и другими линкерами языков высокого уровня.
К слову сказать, не все ассемблеры имеют «двухпроходный» подход к созданию кода. Например, Fasm (очень хороший ассемблер), создаёт программу одним действием. *.obj файл не создаётся. Это несколько усложняет вставки написанного на Fasm кода в проекты, созданные другими средствами разработки программ. В принципе, это основной недостаток Fasm, с лихвой перекрывающийся остальными его достоинствами.
Впрочем, в настоящее время всё выглядит немного иначе. Царствуют на рынке среды разработки программ, подходящие к вопросам совместимости эгоистично (Embarcadero RAD Studio, MS Visual Studio).
Для удобства создания программ, можно создать отдельные «батники», куда вписать команды трансляции и компоновки.
Простейшая программа
Для следующего шага вам потребуется текстовый редактор, пригодный для работы
с программным кодом. Заметим, что Microsoft Word или встроенный в Windows
редактор WordPad являются текстовыми процессорами и для работы с программным
кодом непригодны. Редактор Notepad (Блокнот) подходит для работы с текстовыми
файлами (plain text), но неудобен в качестве программистского
редактора — в нем отсутствует подсветка синтаксиса и другие стандартные
для таких редакторов функции.
Вы можете воспользоваться вашим любимым текстовым редактором или, если вы
затрудняетесь с выбором, скачать простой программистский текстовый редактор
Notepad2.
Примечание: Если вы решили скачать Notepad2, при первом запуске
установите ширину табуляции (Tabulator width) в значение 8 при помощи
меню Settings > Tab Settings.
Создайте в вашем рабочем каталоге файл следующего содержания:
Примечание: В Notepad2 при сохранении введите имя файла , и
подсветка синтаксиса включится автоматически.
Эта программа выводит пять раз строчку “Hello World” на экран. Для вывода
текста используется макрос , который определен в файле
.
Секции ассемблера
Секция data используется для объявления инициализированных данных или констант. Данные в этой секции НЕ могут быть изменены во время выполнения программы. Вы можете хранить константные значения и названия файлов в этой секции. Синтаксис объявления:
section.data
1 | section.data |
Секция bss используется для объявления переменных. Синтаксис объявления:
section.bss
1 | section.bss |
Секция text используется для хранения кода программы. Данная секция должна начинаться с объявления , которое сообщает ядру, откуда нужно начинать выполнение программы. Синтаксис объявления:
section.text
global _start
_start:
1 |
section.text global_start _start |
О программе
В 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, переключаться между которыми можно в настройках на вкладке «Построение». Там же можно изменить опции ассемблера и компоновщика и выбрать, какие программы будут использоваться для ассемблирования и компоновки.
Командный файл для упрощения запуска
Когда вам надоест каждый раз набирать три команды для трансляции и запуска
программ, создайте такой командный файл (назвать его можно, например,
— то есть make/run):
Использовать его можно будет следующим образом:
Несколько комментариев по устройству этого командного файла:
-
Команда отключает дублирование каждой исполняемой команды в окне
командной строки. -
Аргумент при вызове ассемблера и компоновщика убирает строчку
“Copyright (C) Microsoft”, захламляющую экран. -
меняется на аргумент, который передан командному файлу, то есть имя
программы на ассемблере (выше — ). -
меняется на тот же аргумент, но без расширения (выше — ).
-
Связка выполняет очередную команду, только если предыдущая завершилась
успешно. В случае ошибок трансляции ваша программа запущена не будет.
Файл можно или копировать в каждый каталог, где вы планируете
размещать исходные тексты программ на ассемблере, или поместить его в каталог
, и тогда выполнять его будет можно из любого каталога, при
условии, что вы запустили командную строку при помощи .