Turbo assembler (tasm) 3.0.1

Адресация данных в памяти

Процесс, посредством которого процессор управляет выполнением инструкций, называется циклом выполнения, который состоит из трех последовательных шагов:

   Шаг №1: Извлечение инструкции из памяти.

   Шаг №2: Расшифровка или идентификация инструкции.

   Шаг №3: Выполнение инструкции.

Процессор может одновременно обращаться к одному или нескольким байтам памяти. Например, рассмотрим шестнадцатеричное значение 0824H, которое занимает 2 байта памяти. Байт старшего разряда или старший значащий байт – 08, младший байт – 24.

Процессор хранит данные в обратной последовательности байтов, т.е. байт младшего разряда сохраняется в нижнем адресе памяти (слева), а байт старшего разряда – в верхнем адресе памяти (справа). Таким образом, если процессор перенесет значение 0824H из регистра в память, то 24 будет в начале строки, а 08 – в конце, при этом читать данные процессор будет справа налево, а не слева направо (помним, что процессор работает в бинарной системе счисления):

Когда процессор переносит данные из памяти в регистр, то он опять меняет местами байты (т.е. 08 опять будет слева, а 24 – справа).

Есть 2 вида адресов памяти:

   абсолютный адрес — прямая ссылка на конкретное местоположение;

   сегментный адрес (или «смещение») — адрес сегмента памяти со значением смещения.

На следующем уроке мы рассмотрим установку среды разработки для языка ассемблера.

Литература и веб ресурсы

Beginners

  1. Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высшая школа, 1992. – 447 с.
  2. Брэдли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM.– М.: Радио и связь, 1988. – 448 с.
  3. Галисеев Г.В. Ассемблер IBM PC. Самоучитель.: – М.: Издательский дом «Вильямс», 2004. – 304 с.: ил.
  4. Дао Л. Программирование микропроцессора 8088. – М.: Мир, 1988. – 357 с.
  5. Жуков А.В., Авдюхин А.А. Ассемблер. – Спб.: БХВ-Петербург, 2003. – 448 с.: ил.
  6. Зубков С.В., Ассемблер для DOS, Windows и UNIX. – М.: ДМК Пресс, 2000. – 608 с.: ил. (Серия «Для программистов»).
  7. Ирвин К. Язык ассемблера для процессоров Intel, 4-е издание.: пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 912 с.: ил. – Парал. тит. англ.(см. также свежее 7-ое издание в оригинале)
  8. Нортон П., Соухэ Д. Язык ассемблера для IBM PC.– М.: Компьютер, 1992.– 352 с.
  9. Пильщиков В.Н. Программирование на языке ассемблера IBM PC.– М.: ДИАЛОГ-МИФИ, 1994–2014 288 с.
  10. Скляров И.С. Изучаем ассемблер за 7 дней www.sklyaroff.ru

Advanced

  1. Касперски К. Фундаментальные основы хакерства. Искусство дизассемблирования. – М.: СОЛОН-Пресс, 2004. 448 с. – (Серия «Кодокопатель»)
  2. Касперски К. Техника отладки программ без исходных текстов. – Спб.: БХВ-Петербург, 2005. – 832 с.: ил.
  3. Касперски К. Компьютерные вирусы изнутри и снаружи. – Спб.: Питер, 2006. – 527 с.: ил.
  4. Касперски К. Записки исследователя компьютерных вирусов. – Спб.: Питер, 2006. – 316 с.: ил.
  5. Кнут Д. Искусство программирования, том 3. Сортировка и поиск, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2003. – 832 с.: ил. – Парал. тит. англ.
  6. Колисниченко Д.Н. Rootkits под Windows. Теория и практика программирования «шапок-невидимок», позволяющих скрывать от системы данные, процессы, сетевые соединения. – Спб.: Наука и Техника, 2006. – 320 с.: ил.
  7. Лямин Л.В. Макроассемблер MASM.– М.: Радио и связь, 1994.– 320 с.: ил.
  8. Магда Ю. Ассемблер для процессоров Intel Pentium. – Спб.: Питер, 2006. – 410 с.: ил.
  9. Майко Г.В. Ассемблер для IBM PC.– М.: Бизнес-Информ, Сирин, 1997.– 212 с.
  10. Уоррен Г. Алгоритмические трюки для программистов, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 512 с.: ил. – Парал. тит. англ.
  11. Скляров И.С. Искуство защиты и взлома информации. – Спб.: БХВ-Петербург, 2004. – 288 с.: ил.
  12. Уэзерелл Ч. Этюды для программистов: Пер. с англ. – М.: Мир, 1982. – 288 с., ил.
  13. Электронная библиотека братьев Фроловых www.frolov-lib.ru
  14. Чекатов А.А. Использование Turbo Assembler при разработке программ.– Киев: Диалектика, 1995.– 288 с.
  15. Юров В. Assembler: специальный справочник.– Спб.: Питер, 2001.– 496 с.: ил.
  16. Юров В. Assembler. Практикум. 2-е изд. – Спб.: Питер, 2006. – 399 с.: ил.
  17. Юров В. Assembler. Учебник для вузов. 2-е изд. – Спб.: Питер, 2007. – 637 с.: ил.
  18. Пирогов В. Assembler учебный курс. 2001 Нолидж
  19. Пирогов В. АССЕМБЛЕР учебный курс 2003 Нолидж-БХВ
  20. Пирогов В. Assembler для windows 
    1-ое издание ― М.: изд-во Молгачева С.В., 2002 
    2-ое издание ― СПб.:. БХВ-Петербург, 2003 ― 684 с.: ил. 
    3-ье издание ― СПб.:. БХВ-Петербург, 2005 ― 864 с.: ил. 
    4-ое издание ― СПб.:. БХВ-Петербург, 2012 ― 896 с.: ил.
  21. Пирогов В. Ассемблер на примерах. ― СПб.:. БХВ-Петербург, 2012 ― 416 с.: ил.
  22. Пирогов В. АССЕМБЛЕР и дизассемблирование. ― СПб.:. БХВ-Петербург, 2006. ― 464 с.: ил.
  23. Пирогов В. работа над книгой ’64-битовое программирование на ассемблере (Windows,Unix)’. В книге рассматривается программирование на fasm в 64-разрядных Windows и Unix
  24. Юров В., Хорошенко С. Assembler: учебный курс.– Спб.: Питер, 1999. – 672 с.
  25. Ю-Чжен Лю, Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем.– М.: Радио и связь, 1987.– 512 с.
  26. Agner Fog: Software optimization resources (assembly/c++) 1996 – 2017. Веб-страница
  27. Intel 64 and IA-32 Architectures Optimization Reference Manual
  28. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture
  29. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M
  30. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z
  31. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1
  32. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2
  33. Leiterman J.C. 32/64-BIT 80×86 Assembly Language Architecture. 2005, Wordware Publishing, Inc (568 pages) 2320 Los Rios Boulevard Plano, Texas 75074
  34. Turbo Assembler Version 3.2 User’s Guide Borland International. Inc 1800 Green Hills Road P.O. BOX 660001, Scotts Valley, CA 95067-0001
  35. Статьи с сайта wasm.in
  36. Статьи с сайта sasm.narod.ru
  37. Сайт MASM32 и форум
  38. Сайт FASM и форум
  39. Сайт 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:

  • Bill Aitken’s tutorials for using GoAsm and the IDE
  • мануал Роберта Cordonnier на французском
  • справочник Патрика Ruiz
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:

  • FASM на asmworld
  • Цикл статей «Ассемблер под Windows для чайников»
  • Сайт на narod’е
  • Уроки Iczelion’а от Sulaiman Chang на диалекте FASM
  • Понимание FASM
  • Программирование на языке Assembler в FASM
  • Создание заплаток на ассемблере FASM
  • Норсеев С.А. «Разработка оконных приложений на FASMе»
  • Руслан Аблязов «Программирование на ассемблере на платформе x86-64»
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

;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

 
;DATA

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
2
3

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”, захламляющую экран.

  • меняется на аргумент, который передан командному файлу, то есть имя
    программы на ассемблере (выше — ).

  • меняется на тот же аргумент, но без расширения (выше — ).

  • Связка выполняет очередную команду, только если предыдущая завершилась
    успешно. В случае ошибок трансляции ваша программа запущена не будет.

Файл можно или копировать в каждый каталог, где вы планируете
размещать исходные тексты программ на ассемблере, или поместить его в каталог
, и тогда выполнять его будет можно из любого каталога, при
условии, что вы запустили командную строку при помощи .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector