vassamblere
.pdf
|
Окончание табл. 3.13 |
|
|
Команда |
Описание |
|
|
REPLACE |
Заменяет файлы |
RMDIR |
Удаляет каталог |
SET |
Отображает, устанавливает или удаляет переменные окружения Windows |
SETLOCAL |
Начинает локализацию окружения Windows в командных файлах |
SHIFT |
Сдвигает позицию заменяемых параметров в командных файлах |
SORT |
Выполняет сортировку |
START |
Запускает указанную команду или программу в отдельном окне |
SUBST |
Создает виртуальный диск |
TIME |
Отображает или устанавливает системное время |
TITLE |
Устанавливает имя окна для интерпретатора команд |
TREE |
Графически отображает структуру каталогов |
TYPE |
Отображает содержимое текстового файла |
VER |
Отображает версию Windows |
VERIFY |
Устанавливает режим проверки файлов на корректность записи на диск |
VOL |
Отображает метку тома и серийный номер |
XCOPY |
Копирует файлы и каталоги |
|
|
Как видите, команд операционной системы DOS не так уж и много и запомнить их не со" ставляет особого труда. Но даже этого делать не надо (те несколько команд, которые необ" ходимы для запуска и работы с ассемблером, будут рассмотрены подробно далее, а аналоги всех команд есть в системе Windows, так как режим DOS просто эмулируется системой Windows и в конечном итоге производится обращение к процедурам Windows). В Windows 98 и в более ранних версиях можно работать и непосредственно в DOS, так как эти системы являются только надстройками над DOS, но начиная с версии Windows NT все обстоит по"другому. Здесь системы DOS в чистом виде уже нет и вся работа производится только через процедуры Windows.
Чтобы получить более подробное описание каждой команды, необходимо набрать в ко" мандной строке имя команды и дополнить ее символами ‘‘/?’’. Например, если набрать cd /?, то получим следующую справку.
Отображает или изменяет имя текущего каталога. CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path] CD [..]
Две точки (..) указывают, что необходимо перейти к каталогу, включающему данный каталог.
Если набрать CD без параметров, то отобразится обозначение текущего тома и каталог. Если набрать CD с обозначением тома, то отобразится текущий каталог.
Параметр /D используется для переключения текущего тома на указанный том с не" обходимым каталогом.
Команда CHDIR используется в тех случаях, когда имена файлов или каталогов со" держат пробелы.
Глава 3. Введение в язык ассемблера |
83 |
А вот командные файлы, которые существовали еще в первых системах DOS, могут принести пользу даже при работе в системе Windows. Рассмотрим подробнее команд" ные файлы.
Командный файл
Как уже отмечалось, в среде DOS работать довольно неудобно, так как приходится вруч" ную набирать довольно длинные команды и пути файлов, что часто приводит к ошибкам. Командные файлы созданы для облегчения работы в среде DOS, но и в среде Windows они тоже приносят довольно ощутимую пользу.
Командный файл """ это обычный текстовый файл с последовательностью команд, ко" торые должна выполнить система. Командный файл можно написать в обычном тексто" вом редакторе и сохранить с расширением .bat. Файлы с таким расширением операци" онная система трактует как командные и вызывает для их выполнения интерпретатор команд, а не текстовый редактор.
В командный файл можно включать все команды DOS, а также команды условного пе" рехода for, goto и if, которые позволяют реализовывать различную последовательность выполнения команд в зависимости от наличия определенных условий. Еще несколько команд позволяют контролировать ввод"вывод и вызывать другие командные файлы.
Контролировать процесс выполнения можно по возвращаемым приложениями кодам ошибок, которые могут быть равны 0 (ошибок нет) или 1 (большие значения при нали" чии ошибок).
Командный файл может иметь параметры, которые дописываются в командный файл при его запуске на выполнение. Для подстановки параметров в команды используются переменные от %0 до %9. Если используется переменная %0, то вместо ее при запуске подставляется имя командного файла, а переменные от %1 до %9 заменяются соответст" вующими аргументами. Для доступа к аргументу за пределами %9 используется команда shift. Переменная %* ссылается на все аргументы, за исключением %0.
Например, для копирования содержимого каталога Folder1 в каталог Folder2 можно создать командный файл Mybatch.bat, содержимое которого будет представлять одну строку
xcopy %1\*.* %2
и при вызове этого файла как
Mybatch.bat C:\folder1 D:\folder2
вместо переменной %1 будет подставлен каталог Folder1, а вместо переменной %2 """
каталог Folder2.
Тот же самый результат можно получить, если в среде DOS выполнить команду
xcopy C:\folder1\*.* D:\folder2
Дополнительно с параметрами командного файла можно применять модификаторы. Модификаторы используют информацию о текущем диске и каталоге для расширения параметров. При использовании модификаторов сначала поставьте символ процента (%), затем тильду (~), а за ней """ требуемый модификатор.
Все возможные модификаторы перечислены в табл. 3.14.
84 |
Глава 3. Введение в язык ассемблера |
Таблица 3.14. Модификаторы для командных файлов
Модификатор |
Описание |
|
|
%~1 |
Удаляет все фрагменты, ограниченные кавычками ("") |
%~f1 |
Дополняет аргумент полным путем |
%~d1 |
Дополняет аргумент буквенным символом текущего диска |
%~p1 |
Дополняет аргумент путем |
%~n1 |
Дополняет аргумент именем файла |
%~x1 |
Дополняет аргумент расширением файла |
%~s1 |
Использует только короткие имена |
%~a1 |
Дополняет аргумент атрибутами файла |
%~t1 |
Дополняет аргумент датой и временем создания файла |
%~z1 |
Дополняет аргумент размером файла |
%~$PATH:1 |
Ищет каталоги, перечисленные в переменной окружения PATH |
|
и дополняет аргумент полным путем первого найденного каталога |
|
|
Подготовка к запуску ассемблера
Теперь, когда вы познакомились с командами DOS и командными файлами, сделаем так, чтобы было удобно запускать файлы на компиляцию, компоновку и отладку.
Для начала нужно обязательно указать пути, по которым операционная система будет находить каталог с установленными модулями ассемблера. Например, если ассемблер находится в каталоге E:\MASM615\, то необходимо выполнить следующую команду:
path E:\MASM615;%path%
После выполнения этой команды операционная система уже будет знать, в каких ката" логах искать исполняемый файл, если не указан полный путь, а введено только имя файла. Здесь используется модификатор %path% для сохранения всех ранее введенных каталогов.
А для того чтобы сделать активным каталог с вашими программами, необходимо вы" полнить команду cd. Например:
cd /d H:\Gennady\Work\Assembl\Book1\Programs
Чтобы не набирать текст каждый раз, создайте командный файл и включите в него эти строки, после чего нужно будет только запустить командный файл, и все выполнится ав" томатически.
Теперь можно откомпилировать разработанную ранее программу Hello, которая должна находиться в активном каталоге. Для этого необходимо вызвать компилятор. Ко" мандная строка для вызова компилятора имеет следующий синтаксис:
ML [ /options ] filelist [ /link linkoptions ]
Здесь options """ это опции, или дополнительные элементы настройки; filelist """
имя файла; linkoptions """ опции компоновщика. Так как имена заключены в квад" ратные скобки, то их указывать не обязательно. Если не установить соответствующие опции, эти файлы все равно будут созданы, но с именем исходного файла. Все допусти" мые опции перечислены в табл. 3.15.
Глава 3. Введение в язык ассемблера |
85 |
Таблица 3.15. Опции компилятора MASM
Опция |
Описание |
|
|
/AT |
Разрешена тонкая модель памяти (.COM) |
/Bl<linker> |
Использовать альтернативный компоновщик |
/c |
Компилировать без компоновки |
/Cp |
Сохранять регистры пользовательских идентификаторов |
/Cu |
Все идентификаторы в верхнем регистре |
/Cx |
Сохранять регистры для открытых и внешних идентификаторов |
/coff |
Генерировать объектный файл в формате COFF |
/D<name>[=text] |
Задать макроопределение |
/EP |
Вывести листинг препроцессора |
/F <hex> |
Задать размер стека в байтах |
/Fe<file> |
Ввести имя исполняемого файла |
/Fl[file] |
Генерировать листинг |
/Fm[file] |
Генерировать карту распределений |
/Fo<file> |
Ввести имя объектного файла |
/Fpi |
Эмулировать код 80× 87 |
/Fr[file] |
Генерировать ограниченную обзорную информацию |
/FR[file] |
Генерировать полную обзорную информацию |
/G<c|d|z> |
Использовать вызовы Pascal, C или Stdcall (по умолчанию Stdcall) |
/H<number> |
Установить максимальную длину внешних имен |
/I<name> |
Добавить пути для подключаемых файлов |
/link |
Задать <Опции компоновщика и библиотеки> |
/nologo |
Не выводить авторские права |
/omf |
Генерировать объектный файл в формате OMF |
/Sa |
Задать максимальный размер листинга |
/Sc |
Генерировать временные метки |
/Sf |
Генерировать листинг первого прохода |
/Sl<width> |
Задать длину строки |
/Sn |
Не выводить таблицу перекрестных ссылок |
/Sp<length> |
Задать длину страницы |
/Ss<string> |
Задать подзаголовок |
/St<string> |
Задать заголовок |
/Sx |
Выводить ошибочные условия |
/Ta<file> |
Компилировать файл с не .ASM"расширением |
/w |
То же самое, что и /W0 /WX |
/WX |
Трактовать предупреждения как ошибки |
/W<number> |
Задать уровень предупреждений |
/X |
Игнорировать путь к INCLUDE |
/Zd |
Добавить номера строк в отладочную информацию |
|
|
86 |
Глава 3. Введение в язык ассемблера |
Окончание табл. 3.15
Опция |
Описание |
|
|
/Zf |
Сделать все идентификаторы открытыми |
/Zi |
Добавить символическую отладочную информацию |
/Zm |
Обеспечить совместимость с MASM 5.10 |
/Zp[n] |
Выравнивать структуры |
/Zs |
Проверить синтаксис без создания выходного файла |
|
|
Теперь можно давать команду на трансляцию рассмотренного выше файла Hello, который находится в каталоге \Work\HelloWord, в следующем виде:
G:\Work\HelloWord>ML /nologo /B link32 /coff Hello.asm /link /nologo / SUBSYSTEM:CONSOLE F:\MASM615\LIB\KERNEL32.LIB F:\MASM615\LIB\USER32.LIB F:\ MASM615\LIB\Study32.lib
А это значит, что вы указываете транслятору не выводить информацию об автор" ских правах (/nologo), использовать 32"разрядный компоновщик (/Bl link32), создать объектный модуль формата coff (/coff) и использовать консольное окно (/SUBSYSTEM:CONSOLE). При компоновке необходимо использовать следующие библиоте" ки: F:\MASM615\LIB\KERNEL32.LIB, F:\MASM615\LIB\USER32.LIB, F:\MASM615\ LIB\Study32.lib
При трансляции программ для Windows следует использовать стандартные библиоте" ки Windows: KERNEL32.LIB и USER32.LIB, в которых находятся все необходимые про" цедуры и которые входят в поставку ассемблера. В данном случае использована также библиотека Study32.lib, в которой находятся процедуры, написанные пользователем. (Об этом уже говорилось ранее и еще будет говориться в дальнейшем, когда вы будете разрабатывать собственную библиотеку.)
При успешной трансляции на экране появится следующее сообщение:
Assembling: Hello.asm
G:\Work\HelloWord>
После трансляции в указанном каталоге появятся файлы с расширением .obj и .lst (при заданной опции). Полностью файл листинга (.lst) приведен ниже.
Microsoft (R) Macro |
Assembler Version 6.15.8803 |
08/15/06 16:28:02 |
||
(.asm) |
Page |
1 |
- 1 |
|
TITLE |
(.asm) |
|
|
|
.386 |
|
|
|
|
.model flat, stdcall
ExitProcess PROTO,
x:dword
WaitMsg PROTO
WriteString PROTO
Crlf PROTO
00000000 |
|
|
|
|
.data |
00000000 |
48 65 |
6C |
6C |
6F |
strHello BYTE "Hello Word!",0 |
|
20 57 |
6F |
72 |
64 |
|
|
21 00 |
|
|
|
|
00000000 |
|
|
|
|
.code |
Глава 3. Введение в язык ассемблера |
87 |
00000000 |
|
main PROC |
|
|
|
00000000 |
BA 00000000 R |
|
|
|
|
mov EDX, OFFSET strHello ; Аргументы для WriteString. |
|||||
invoke WriteString |
; Вывод строки на консоль. |
||||
invoke Crlf |
|
; Перевод каретки. |
|||
invoke WaitMsg |
|
; Запрос для нажатия клавиши. |
|||
invoke ExitProcess,0 |
; Корректное окончание программы. |
||||
0000001B |
main ENDP |
|
|
|
|
|
END main |
|
|
|
|
Microsoft (R) Macro Assembler Version 6.15.8803 |
08/15/06 16:28:02 |
||||
(.asm) |
Symbols 2 - 1 |
|
|
|
|
Segments |
and Groups: |
|
|
|
|
N a m e |
Size |
Length |
Align |
Combine |
Class FLAT GROUP |
_DATA . |
. 32 Bit |
0000000C |
DWord |
Public |
'DATA' |
_TEXT . |
. 32 Bit |
0000001B |
DWord |
Public |
'CODE' |
Procedures, |
parameters and locals: |
|
||
N a m e |
Type |
Value |
Attr |
|
Crlf . . . .P Near |
00000000 |
FLAT Length= 00000000 External STDCALL |
||
ExitProcess P Near |
00000000 |
FLAT Length= 00000000 External STDCALL |
||
WaitMsg . . P Near |
00000000 |
FLAT Length= 00000000 |
External STDCALL |
|
WriteString P Near |
00000000 |
FLAT Length= 00000000 |
External STDCALL |
|
main . . . P Near |
00000000 _TEXT Length= 0000001B Public STDCALL |
||
Symbols: |
|
|
|
N a m e |
Type |
Value |
Attr |
@CodeSize . . . . |
. ..Number |
00000000h |
|
@DataSize . . . . |
. . Number |
00000000h |
|
@Interface . . . . |
. . Number |
00000003h |
|
@Model . . . . . . |
. . Number |
00000007h |
|
@code . . . . . . |
. . Text |
|
_TEXT |
@data . . . . . . |
. . Text |
|
FLAT |
@fardata? . . . . |
. . Text |
|
FLAT |
@fardata . . . . . |
. . Text |
|
FLAT |
@stack . . . . . . |
. . Text |
|
FLAT |
strHello . . . . . |
. . Byte |
00000000 _DATA |
|
0 Warnings
0Errors
Вэтом листинге приведена вся информация о созданной программе, начиная с ис" ходных команд и их машинных эквивалентов и заканчивая распределением имен, памяти
исегментов. При профессиональном программировании приходится довольно часто об" ращаться к файлам листингов, но на первом этапе изучения языка в этом большой необ" ходимости нет.
Синтаксические ошибки
Очень немного найдется программистов, которые сразу смогут написать даже неболь" шую программу без ошибок. Поэтому ассемблер проверяет написанные команды и вы" водит на экран все строки, в которых есть ошибки, причем с их объяснением. Например, если в программе Hello первую команду MOV ошибочно набрать как MIV, то появится следующее сообщение:
88 |
Глава 3. Введение в язык ассемблера |
Assembling: Hello.asm
Hello.asm(17) : error A2008: syntax error : edx
Иными словами, компилятор зафиксирует синтаксическую ошибку перед операндом edx в строке номер 17.
Компоновка программы
После компиляции будет получен объектный файл с расширением .obj, который не" обходимо преобразовать в исполняемый модуль. На данном этапе используется про" грамма"компоновщик, которая использует объектный файл (в данном случае hello.obj) в качестве входного и создает выполняемый файл, называя его hello.exe. Командная строка для компоновщика имеет следующий формат:
LINK [options] [files] [@commandfile]
Здесь link """ имя программы компоновщика, files """ файлы библиотек.
Не будем рассматривать все опции компоновщика, так как на первом этапе они не приго" дятся. Необходимо знать только опцию /DEBUG (она заставляет компоновщик вставлять в создаваемую программу нужные для отладчика коды) и опцию /SUBSYSTEM:CONSOLE (приводит к созданию формата файла, который ‘‘понимает’’ Windows и рассчитан на ра" боту в консольном режиме). Чтобы просмотреть все опции 32"разрядного отладчика, просто наберите в командном окне имя отладчика link32. Также можно использовать опцию /MAP, которая приводит к созданию файла распределения памяти с расширением
.map. Попробуйте создать этот файл и проанализируйте его. От его использования тоже может быть ощутимая польза.
После работы компоновщика будет создан исполняемый файл с расширением .exe, который уже можно запускать на выполнение как любую программу Windows.
Использование программы ML позволяет выполнять компиляцию и компоновку одной командой. Но можно использовать отдельно компилятор (MASM) и 32"разрядный компо" новщик (LINK32). Также необходимо отметить, что версии 32"разрядного компоновщика, которые Microsoft использует в более поздних версиях, чем MASM615, называются просто LINK, без цифр 32 (в версии MASM615 так называется 16"разрядный компоновщик). На" чиная с этой версии, Microsoft уже не разрабатывает 16"разрядные компоновщики.
Запуск программы
Для запуска программы наберите в командной строке имя выполняемой программы hello или просто щелкните на ней мышкой в среде Windows.
Отладчик
Основной инструмент, с которым приходится работать при создании программ на ас" семблере, """ отладчик. В дальнейшем будут рассматриваться небольшие примеры про" грамм на языке ассемблера, и лучшим способом для их изучения является использование отладчика. Отладчик """" это программа, позволяющая отображать на экране значения необ" ходимых переменных, получать состояние всех регистров и ячеек памяти при пошаговом выполнении программы, вносить изменения в программу, указывать точки останова и многое другое. Это необходимо при проверке написанных на языке ассемблера программ.
Существует несколько хороших отладчиков, но мы будем использовать универсаль" ный и довольно удобный отладчик Microsoft, который распространяется бесплатно и на" зывается dbg_x86_6.5.3.8.exe. Этот отладчик имеет оконный интерфейс и привыч" ные для работающих в среде Windows функции.
Глава 3. Введение в язык ассемблера |
89 |
Простая программа
Для знакомства с отладчиком напишем на языке ассемблера небольшую программу Sum, которая складывает три числа и сохраняет сумму в памяти. Оттранслируем и вы" полним компоновку программы с использованием опций отладки, как показано на рис. 3.14, а затем начнем работу с отладчиком.
Рис. 3.14. Компиляция и компоновка программы с опциями отладки
Программа Sum
TITLE Программа суммирования (sum.asm)
.386
.MODEL flat, stdcall |
; Задаем модель памяти. |
WaitMsg PROTO |
; Прототип функции WaitMsg. |
ExitProcess PROTO, |
; Прототип функции ExitProcess. |
x: DWORD |
|
|
.DATA |
|
; Задаем сегмент данных. |
sum DW ? |
; Объявляем переменную sum, не присваивая значения. |
|
.CODE |
|
; Задаем сегмент кодов. |
main PROC |
; Точка входа в программу. |
|
MOV |
EAX,5 |
; Поместить в регистр AX значение 5. |
ADD |
EAX,10 |
; Сложить содержимое регистра EAX с 10. |
ADD |
EAX,15 |
; Сложить содержимое регистра EAX с 15. |
MOV |
sum, AX |
; Сохранить содержимое регистра EAX в sum. |
invoke WaitMsg |
; Запрос для нажатия клавиши. |
|
invoke ExitProcess,0 ; Корректное окончание программы. |
||
main ENDP |
; Конец процедуры. |
|
END main |
; Конец программы (для компилятора). |
|
MOV EAX, 5 |
EAX = 5 |
ADD EAX, 10 |
EAX = 15 |
ADD EAX, 15 |
EAX = 35 |
Память |
|
|
011C |
|
011E |
35 |
0120 |
|
0122 |
|
0124 |
|
0126 |
Рис. 3.15. Диаграмма выполнения простой программы
Каждая строка в процедуре main этой програм" мы начинается с кода команды (MOV, ADD) с соответствующими операндами или вызова про" цедуры (макроопределение invoke). Если после этого поставить точку с запятой, то до конца строки все будет восприниматься как комментарий, не влияющий на ход выполнения программы.
Пошаговая диаграмма выполнения показана на рис. 3.15.
90 |
Глава 3. Введение в язык ассемблера |
Команда MOV заставляет процессор переместить или скопировать значение исходного операнда в принимающий оператор, поэтому в первой строке число 5 перемещается в регистр AX. Во второй строке происходит суммирование числа 10 и содержимого реги" стра AX, в результате значение регистра становится равным 15. В третьей строке также складываются содержимое регистра AX с числом 20. В регистре AX уже будет находиться число 35. Далее это число копируется в ячейку памяти по адресу, определенному для пе" ремененной sum. Команды в пятой и шестой строках необходимы для выхода из про" граммы и передачи управления системе.
Как обычно, программу можно написать в текстовом редакторе и сохранить в файле с именем sum.asm, после чего ее нужно откомпилировать с опцией /Zi, которая застав" ляет отладчик включить в объектный модуль информацию для отладчика. Затем нужно будет вызвать компоновщик для получения исполняемого файла. Однако поскольку эта программа в дальнейшем будет использоваться с отладчиком, то необходимо запускать компоновщик с опцией /DEBUG, т.е. команда вызова компоновщика будет включать оп" цию, включающую информацию для отладчика, в исполняемый модуль:
/link /DEBUG
После получения выполняемого файла можно запустить отладчик и поработать с этой программой, для чего необходимо сначала открыть исходный, а затем исполняемый файл (это команда File Open Sourse File и команда File Open Executable). После чего мож" но настроить рабочий стол отладчика, как показано на рис. 3.16.
Рис. 3.16. Рабочий стол отладчика dbg_x86_6.5.3.8
На рисунке вы видите открытым окно с исходной программой и дополнительные окна Registers (значения всех регистров), Disassembly (восстановленная последовательность команд) и Command (окно ввода команд). Все окна можно закрывать и открывать по желанию
Глава 3. Введение в язык ассемблера |
91 |
пользователя, создавая удобную для себя среду отладки. Все окна по умолчанию стараются пристыковаться к ближайшей границе (dock) окна, хотя их можно сделать и плавающими (floating). Потребуется некоторая практика, чтобы быстро создавать удобный рабочий стол от" ладчика. Щелчок правой кнопкой мыши на заголовке окна приводит к появлению контекст" ного меню, которое позволяет установить необходимый режим работы окна.
Окна можно открывать либо воспользовавшись пунктом меню Window, либо с помо" щью отдельных кнопок, расположенных на управляющей панели. Названия кнопок, ко" торые появляются в момент задержки курсора на кнопке, перечислены в табл. 3.16.
Таблица 3.16. Названия управляющих кнопок
Название |
Быстрые клавиши |
Описание |
|
|
|
Open sourse file |
Ctrl"O |
Открыть файл |
Cut |
Ctrl"X |
Удалить выделенный текст |
Copy |
Ctrl"C |
Копировать выделенный текст |
Paste |
Ctrl"V |
Вставить выделенный текст |
Go |
F5 |
Выполнить программу |
Restart |
Ctrl"Shft"F5 |
Подготовить отладчик к выполнению программы |
Stop debugging |
Shft"F5 |
Закончить отладку |
Break |
Ctrl"Break |
Передача управления отладчику |
Step into |
F11 (F8) |
Заходить в процедуры |
Step over |
F10 |
Выполнять программу без захода в процедуры |
Step out |
Shft"F11 |
Выйти из процедуры |
Run to cursor |
Ctrl"F10 (F11) |
Выполнить до курсора |
Insert or remove breakpoint |
F9 |
Установить или убрать точку останова |
Command |
Alt"1 |
Отобразить окно команд |
Watch |
Alt"2 |
Показать текущие переменные |
Locals |
Alt"3 |
Показать локальные переменные |
Registers |
Alt"4 |
Показать регистры |
Memory window |
Alt"5 |
Показать фрагмент памяти |
Call stack |
Alt"6 |
Показать текущую информацию из стека |
Disassembly |
Alt"7 |
Дисассемблировать исходный файл |
Scratch pad |
Alt"8 |
Открыть окно буфера обмена |
Sourse mode on |
|
Использовать исходный текст |
Sourse mode off |
|
Использовать ассемблерный текст |
Font |
|
Использовать шрифты |
Options |
|
Использовать настройки |
|
|
|
Работа с отладчиком не представляет особых трудностей. Необходимо только ввести исходный файл (.asm), соответствующий ему исполняемый файл (.exe) и выполнить дисассемблирование. Затем установить точку прерывания на процедуре main и выпол" нить команду Go. Отладчик остановится на первой команде, после чего можно проводить отладку, просматривая состояние всех регистров, флагов, памяти и текущих команд,
92 |
Глава 3. Введение в язык ассемблера |
