1. Использование Turbo Debugger для отладки программ на ассемблере.
Запуск отлаживаемого приложения. Выполняется по клавише F9 или по команде RUN из
меню RUN. Программа выполняется в полном объеме, если только не указана точка
останова (breakpoint) на строку в окне с текстом программы или окне CPU. Точка останова
устанавливается при помощи клавиши F2.
Выполнить программу до строки, где находится курсор. Команда выполняется при
помощи клавиши F4 или посредством меню.
Выполнить единичную команду. Команда выполняется по нажатию клавиши F7. Если мы
находимся в окне с текстом программы, то выполняется оператор соответствующего
языка. Если мы находимся в окне CPU, то выполняется инструкция микропроцессора.
Выполнение команды с переходом через процедуру. Данная команда выполняется по
нажатию клавиши F8. Отличается от предыдущей команды тем, что не происходит вход в
процедуру, но все инструкции в процедуре выполняются автоматически.
Выполнить процедуру. Если курсор находится на команде вызова процедуры, то можно
выполнить лишь одну эту процедуру командой Alt+F8.
При выполнении любой из перечисленных команд также могут быть заданы опции
командной строки - Run/Arguments...
Окно слежения за переменными. Можем по желанию добавить в окно переменные, за
значением которых мы хотим наблюдать.
Окно стека. Показывает текущее состояние стека.
Окно точек останова. Здесь содержится информация обо всех установленных в программе
точках останова. Здесь же можно добавить или установить точки останова.
Окно регистрации (Log). В нем хранится информация о происходящих в отладчике
событиях.
Окно переменных. Отображает все переменные, доступные в данном месте.
Окно файлов. В этом окне можно просмотреть двоичный файл и исправить его при
необходимости.
Окно отображения памяти. Дает возможность построчного просмотра памяти.
Окно сопроцессора. Данное окно отображает текущее состояние сопроцессора.
Окно истории выполнения (Execution History). Окно содержит историю выполнения
программы.
Окно иерархии (Hierarchy). Выводит на дисплей иерархическое дерево для всех объектов
и всех типах классов, используемых в текущем модуле.
Текст программы можно увидеть на экране, обратившись к пункту меню Module. При
этом программа должна быть оттранслирована с опциями, обеспечивающими сохранение
в исполняемом модуле отладочной информации.
Если отладочную информацию в исполняемом модуле Turbo Debugger не распознает, Вам
при отладке придется использовать окно CPU. Окно разделено на пять частей (против
часовой стрелки)
1. Инструкции микропроцессора.
2. Сегмент данных.
3. Сегмент стека.
4. Состояние регистров.
5. Основные флаги.
2. Программная модель процессора: адресация памяти.
Сегментация — механизм адресации, обеспечивающий существование нескольких
независимых адресных пространств для защиты задач от взаимного влияния. В основе
механизма сегментации лежит понятие сегмента, который представляет собой
независимый поддерживаемый на аппаратном уровне блок памяти.
Каждая программа в общем случае может состоять из любого количества сегментов, но
непосредственный доступ она имеет только к трем основным сегментам (кода, данных и стека). Операционная система размещает сегменты программы в оперативной
памяти по определенным физическим адресам, после чего помещает значения этих
адресов в соответствующие сегментные регистры. Внутри сегмента программа
обращается к адресам относительно начала сегмента линейно, то есть начиная с 0 и
заканчивая адресом, равным размеру сегмента. Этот относительный адрес, или смещение,
который процессор использует для доступа к данным внутри сегмента, называется
эффективным.
Под физическим адресом понимается адрес памяти, выдаваемый на шину адреса
процессора. Другое название этого адреса — линейный адрес.
Формирование физического адреса в реальном режиме.
Характеристики механизма адресации физической памяти в реальном режиме.
* Диапазон изменения физического адреса — от 0 до 1 Мбайт. Эта величина определяется тем, что шина адреса i8086 имела 20 линий.
* Максимальный размер сегмента— 64 Кбайт. Это объясняется 16-разрядной
архитектурой 18086.
* Для обращения к конкретному физическому адресу оперативной памяти необходимо определить адрес начала сегмента (сегментную составляющую) и смещение внутри сегмента.
Исходя из разрядности сегментных регистров, можно утверждать, что сегментная
составляющая адреса (или база сегмента) представляет собой всего лишь 16-разрядное
значение, помещенное в один из сегментных регистров. Максимальное значение, которое
при этом получается, соответствует 216 - 1. В сегментном регистре содержатся только
старшие 16 битов физического адреса начала сегмента. Недостающие младшие четыре
бита 20-разрядного адреса получаются сдвигом значения в сегментном регистре влево на
4 разряда. Эта операция сдвига выполняется аппаратно и для программного обеспечения
абсолютно прозрачна. Получившееся 20-разрядное значение и является настоящим
физическим адресом, соответствующим началу сегмента. Что касается второго
компонента (смещения), то он представляет собой 16-разрядное значение.
В процессоре эти две составляющие складываются на аппаратном уровне, в результате
получается физический адрес памяти размерностью 20 битов. Данный механизм
образования физического адреса позволяет сделать программное обеспечение
перемещаемым, то есть не зависящим от конкретных адресов загрузки его в оперативной
памяти.
Целевой физический адрес: сегментная часть извлекается из одного из сегментных
регистров, сдвигается на четыре разряда влево и суммируется со смещением. В свою
очередь, видно, что значение смещения можно получить минимум из одного и максимум
из трех источников: из значения смещения в самой машинной команде и/или из содержимого одного базового и/или одного индексного регистра.
3. Программная модель процессора: регистры процессора.
Микропроцессор имеет 14 16-разрядных программно-доступных регистров.
Восемь регистров считаются регистрами общего назначения, поскольку во время выполнения программы в
них могут храниться адреса и данные. Однако эти регистры имеют и закрепленные функции, что делает их
неодинаковыми с точки зрения использования. Четыре регистра общего назначения AX, BX, CX, DX
являются регистрами данных, т.к. их основное назначение – хранение операндов и результатов операций.
Система команд допускает использование этих регистров целиком и в виде старшей и младшей половин.
При выполнении команд за этими регистрами по умолчанию закреплены различные функции.
Регистр
Назначение
Закрепленные функции
AX
Аккумулятор
Ввод-вывод, умножение и деление слова
AL
Ввод-вывод, умножение и деление
Аккумулятор
байтов, десятичная арифметика,
(мл. байт)
преобразование кодов
AH
Аккумулятор
Умножение и деление байтов
(ст. байт)
BX
Базовый
Базовый регистр, преобразование адресов
регистр
Счетчик
Обработка строк. Подсчет циклов
Счетчик
Динамические и циклические сдвиги
(мл. байт)
DX
Регистр данных Умножение и деление слов;
и адреса вводаКосвенная адресация регистров
вывода
Ввода-вывода
Следующие четыре общих регистра SP, BP, SI, DI применяются в основном для хранения 16разрядных адресов, поэтому их можно отнести к адресным регистрам. И операнды, и адреса, хранимые в
этих регистрах, могут быть только 16-разрядными.
Регистр SP является системным указателем стека, используемым при прерываниях и обращении к
подпрограммам. В этом регистре хранится и формируется текущий адрес внутри сегмента стека.
Регистр BP является базовым регистром, используется при формировании адресов операндов (так
же как BX).
Регистры SI и DI являются индексными регистрами, используются при формировании адресов
операндов и выполнении строковых операций.
Регистр IP – указатель команд, фактически является регистром адреса команд или программным
счетчиком. В этом регистре формируется адрес команды внутри сегмента памяти.
Адреса, хранящиеся или формируемые с помощью этих регистров, не являются
окончательными адресами памяти. Это адреса внутри сегмента или так называемые смещения.
CX
CL
Окончательный адрес или физический адрес памяти определяется содержимым
соответствующего сегментного регистра – CS, DS, SS, ES.
CS – сегментный регистр команд, используется при чтении команд.
SS – сегментный регистр стека, используется при работе со стеком.
DS – сегментный регистр данных, используется при обращении к операндами.
ES – дополнительный сегментный регистр, используется при работе с операндами.
Регистр состояния процессора имеет название регистра флагов и считается 16-разрядным, хотя используется
в этом регистре всего 9 разрядов.
Содержимое отдельных разрядов называется флагом или флажком условий или управления.
Флаги состояния:
SF – знак результата, установлен, если результат <0.
ZF – нуль результата, устаговлен, если результат =0.
FF – паритет, установлен если младший байт результата содержит четное число единиц.
CF – перенос, устанавливается если результат выходит за разрядную сетку.
AF– вспомогательный перенос, признак десятичной коррекции при обработке двоично-десятичных чисел
OF – переполнение, устанавливается при переполнении числовых разрядов разрядной сетки
Флаги управления:
DF – направление. Применяется в командах обработки строк. Если этот флажок сброшен, цепочка
обрабатывается с первого элемента, имеющего наименьший адрес. В противном случае цепочка
обрабатывается от наибольшего адреса к наименьшему.
IF – разрешение прерываний. Если флажок сброшен, то прерывания запрешены, установлен- разрешены.
TF – трассировка. Если этот разряд установлен, то после выполнения каждой команды генерируется
внутреннее прерывание.
4. Программная модель процессора: методы адресации.
Прямая адресация — это простейший вид адресации операнда в памяти, так как
эффективный адрес содержится в самой команде.
Относительная прямая адресация используется в командах условных переходов для указания относительного адреса перехода. Относительность такого пе-рехода
заключается в том, что в поле смещения машинной команды содержится 8-, 16- или 32-разрядное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд IP/EIP. В результате такого сложения получается адрес, по которому и осуществляется переход.
Абсолютная прямая адресация — в этом случае эффективный адрес является
частью машинной команды, но формируется этот адрес только из значения поля
смещения в команде. Для формирования физического адреса операнда в памяти процессор складывает это поле со сдвинутым на четыре бита значением сегментного регистра. В команде ассемблера можно использовать несколько форм
такой адресации. К примеру,
mov ax,word ptr [0000] ;записать слово по адресу ds:0000 в регистр ах
Однако такая адресация применяется редко — обычно ячейкам в программе
присваиваются символические имена.
При косвенной базовой (регистровой) адресации эффективный адрес операнда
может находиться в любом из регистров общего назначения, кроме SP/ESP и ВР/ЕВР
(это специальные регистры для работы с сегментом стека).
Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки. К примеру, команда mov ax,[ecx] помещает в регистр АХ содержимое слова по адресу сегмента данных со смещением, хранящимся
в регистре ЕСХ.
Косвенная базовая (регистровая) адресация со смещением предназначена для доступа к
данным с известным смещением относительно некоторого базового адреса. К примеру,
команда mov ax,[edx+3h] пересылает в регистр АХ слово из области
памяти по адресу, определяемому содержимым EDX + 3h. Команда mov ax,mas[dx]
пересылает в регистр АХ слово по адресу, определяемому содержимым DX плюс
значение идентификатора mas.
Косвенная индексная адресация со смещением. Возможностью масштабирования
содержимого индексного регистра. В команде mov ax,mas[esi*2] значение эффективного адреса второго операнда определяется выражением mas+(esi)*2.
При косвенной базовой индексной адресации эффективный адрес формируется
как сумма содержимого двух регистров общего назначения: базового и индексного. В качестве этих регистров могут применяться любые регистры общего назначения, при этом часто содержимое индексного регистра масштабируется. Например:
mov е а х , [ e s i ] [ e d x ]
В данном примере эффективный адрес второго операнда формируется из двух
компонентов, (ESI) + (EDX)
Косвенная базовая индексная адресация со смещением аналогично.
5. Структура и форматы команд процессора.
Основные команды могут иметь длину от 1 до 6 байт. Код операции всегда содержится
в первом байте команды, а последующие байты, если они имеются, содержат адресную
информацию. Команды МП оперируют с операндами, хранящимися в памяти ЭВМ.
Способы определения операнда называются режимом или способом адресации. В
некоторых командах способ адресации операнда задается в первом байте команды, в
других – информация о способе адресации содержится во втором байте команды,
называемом постбайтом.
Постбайт может определять один или два операнда. Структура постбайта имеет вид:
7
КОП OP1, OP2
6
MOD
5
4
REG / OP
3
2
1
0
R / M
Поля MOD и R/M определяют первый операнд, поле REG/OP – второй. Обычно OP1
является приемником, а OP2 источником. В некоторых командах допускается изменение
направления передачи данных. В таких командах в первом байте вводится поле d,
определяющее направление передачи данных, если d=1 то в регистр, если d=0 то из
регистра.
Второй операнд, если он имеется, всегда находится в регистре, задаваемым полем
REG/OP. В командах с одним операндом поле REG/OP используется для расширения кода
операции, записанного в первом байте команды.
Регистр, используемый командой, задается в поле REG/OP номером и кодом операции
первого байта, что позволяет использовать один и тот же номер для обозначения разных
регистров.
Если команда оперирует с сегментными регистрами, то содержимое поля REG
расценивается как номер сегментного регистра, иначе как номер регистра общего
назначения. При этом, если команда может оперировать и байтом и словом, то в коде
операции есть бит W, который определяет длину операнда ( W=0 - байт, W=1 - слово).
Операнд, указываемый полями MOD и R/M, определяется в соответствии с имеющим
место режимом адресации. Все способы адресации операндов в памяти обеспечивают
формирование 16-разрядного адреса внутри сегмента или эффективного адреса, который
обозначают буквами ЕА.
При MOD=16 операнд находится в регистре, номер которого указан в поле R/M.
По умолчанию в режимах адресации с привлечением регистра BP при получении
физического адреса используется сегментный регистр SS, в остальных режимах адресации
используется сегментный регистр DS. Чтобы изменить используемый сегментный регистр
предусмотрена специальная однобайтовая команда – префикс замены сегмента.
Он имеет следующий формат:
7
6
5
0
0
1
4
3
R E G
2
1
0
1
1
0
где REG – короткий адрес сегментного регистра.
Если перед командой стоит префикс замены сегмента, то при формировании адреса
будет использоваться сегментный регистр, указанный в префиксе замены сегмента.
Нельзя изменить сегментный регистр при:
- чтении следующей команды (всегда CS);
- обращение к стеку с участием SP (всегда SS);
- цепочечных командах (сегментный регистр операнда-получателя всегда ЕS).
Длина команд в микропроцессоре варьируется от 1 до 6 байт, не считая префиксов. В
первых одном или двух байтах команды содержится код операции и указание способа
адресации. После них могут находиться:
- ни одного дополнительного байта;
- двухбайтовый эффективный адрес (ЕА);
- одно или двухбайтное смещение;
- одно или двухбайтный непосредственный операнд;
- одно или двухбайтное смещение и одно или двухбайтный непосредственный операнд;
- двухбайтное смещение и двухбайтный сегментный адрес(только для прямого
межсегментного перехода).
Команда записывается в памяти в подряд идущие байты в стороны увеличения адресов,
т.е. адрес первого байта команды будет младшим адресом байтов, занимаемых командой.
Если длина смещения или непосредственных данных составляет два байта, первым всегда
следует младший байт.
6. Система команд: команды пересылки данных, команды передачи управления.
Команды пересылки данных
IN Ввод байта или слова
Команда: IN accumulator, port.
Логика: accumulator = (port).
IN передает байт или слово из заданного порта port в
AL или AX. Адрес порта может определяться как
непосредственным байтовым значением (в диапазоне 0255), так и с использованием косвенной адресации по
регистру DX.
2. LAHF Загрузка AH из регистра флагов
Логика: биты регистра AH:
76420
биты регистра признаков FLAGS: S Z A P C.
1.
Команда LAHF копирует пять признаков процессора
8080/8086 (признаки знака, нулевого результата,
вспомогательного переноса, четности и переноса) в
биты регистра AH с номерами 7, 6, 4, 2, 0
соответственно. Сами признаки при выполнении этой
команды не меняются.
3. LDS Загрузка указателя с использованием DS
Команда: LDS destination, source.
Логика: DS = (source)
destination = (source + 2).
Команда LDS загружает в два регистра 32-битный
указатель, расположенный в памяти по адресу source.
При этом старшее слово заносится в сегментный
регистр DS, а младшее слово - в базовый регистр
destination. В качестве операнда destination может
выступать любой 16-битный регистр, кроме
сегментных.
Операнды
Пример
регистр16,память32 LDS DI,32_POINTER
4. LEA Загрузка исполнительного адреса
Команда: LEA destination, source.
Логика: destination = Addr(source).
Команда LEA присваивает значение смещения
(offset) операнда source (а не его значение !) операнду
destination. Операнд source должен быть ссылкой на
память, а в качестве операнда destination может
выступать любой 16-битный регистр, кроме
сегментных.
Операнды
Пример
регистр16,память32 LEA BX,MEM_ADDR
Эта команда имеет то преимущество по сравнению с
использованием оператора OFFSET в команде MOV,
что операнду source можно иметь индексы.
LES Загрузка указателя с использованием ES
Команда: LES destination, source.
Логика: ES = (source)
destination = (source + 2).
Команда LDS, загрузка указателя с использованием
DS, выполняет те же действия, что и LES, но
использует при этом вместо регистра ES регистр DS.
5. MOV Пересылка (байта или слова)
Команда: MOV destination, source.
Логика: destination = source.
MOV пересылает по адресу destination байт или
слово, находящееся по адресу source.
Операнды
Пример
регистр, регистр
MOV BX,SI
регистр, непоср.операнд MOV CX,128
аккумулятор, память
MOV
AL,MEM_SOURCE
регистр, память
MOV DI,[DX]
память, регистр
MOV BETA,DI
память, непоср.операнд MOV GAMMA,16h
память, аккумулятор
MOV MEM_DEST,AX
сегм.регистр, регистр16 MOV DS,BX
сегм.регистр, память16 MOV
DS,SEGMENT_VAL
регистр16, сегм.регистр MOV BP,SS
память, сегм.регистр
MOV
SEGMENT_VAL,DS
OUT загрузка в порт
Команда: OUT port, accumulator.
Логика: (port) = accumulator.
OUT передает байт или слово из AL или AX в
заданный порт. Адрес порта может определяться как
непосредственным байтовым значением (в диапазоне 0255), так и с использованием косвенной адресации по
регистру DX.
7. POP выборка слова из стека
Команда: POP destination.
6.
Логика: destination = (SP)
SP = SP + 2 .
Команда POP пересылает слово из верхушки стека по
адресу destination, затем увеличивает указатель стека
SP на 2, чтобы он указывал на новую верхушку стека.
8. POPF пересылка слова из стека в регистр FLAGS
Признаки: O D I T S Z A P C
Команда: POPF .
Логика: flag-register = (SP)
SP = SP + 2 .
Команда POPF пересылает слово из верхушки стека в
регистр FLAGS, изменяя значения всех признаков,
затем увеличивает указатель стека SP на 2, чтобы он
указывал на новую верхушку стека.
9. PUSH загрузка слова в стек
Команда: PUSH source.
Логика: SP = SP - 2
(SP) = source .
Команда PUSH уменьшает значение указателя стека
SP на 2, затем пересылает операнд в новую верхушку
стека. Операндом source не может быть 8-битный
регистр.
10. PUSHF загрузка содержимого регистра FLAGS в
стек
Команда PUSHF уменьшает значение указателя стека
SP на 2, затем пересылает слово из регистра FLAGS в
верхушку стека.
11. SAHF загрузка регистра AH в регистр флагов
Логика: биты регистра признаков FLAGS: S Z A P C
биты регистра AH:
7642
0.
12. XCHG обмен значениями
Команда: XCHG destination, source.
Логика: destination <--> source.
Команда XCHG обменивает значения своих
операндов, которые могут быть байтами или словами.
13. XLAT кодирование AL по таблице
Команда: XLAT translate-table.
Логика: AL = (BX + AL).
Команда XLAT переводит байт, согласно таблице
преобразований. Указатель 256-байтовой таблицы
преобразований находится в BX. Байт, который нужно
перевести, расположен в AL. После выполнения
команды XLAT байт в AL заменяется на байт,
смещенный на AL байтов от начала таблицы
преобразований.
Следующий пример иллюстрирует перевод
десятичного числа (от 0 до 15) в соответствующую
"цифру" шестнадцатеричной системы счисления:
LEA BX,HEX_TABLE
;указатель таблицы
засылаем в BX,
MOV AL,DECIMAL_DIGIT ;а переводимую цифру
- в AL
XLAT HEX_TABLE
;переводим
;теперь в AL
находится ASCII-код;соответствующей цифры
;шестнадцатеричной системы
HEX_TABLE DB
'0123456789ABCDEF'
Команды передачи управления
Команда условного переноса
Все команды условного перехода занимают 2 байта и имеют следующий машинный формат:
КОП
cмещение
8-байтовое смещение записывается в дополнительном коде, занимает второй байт команды и обеспечивает переход в
диапазоне от –128 до +127 внутри сегмента относительно текущего значения указателя команд ( (IP) = (IP) +
смещение).
Мнемоника
JE/JZ
JNE/JNZ
JS
JNS
JO
JNO
JP/JFE
JNP/JFO
JB/JNAE/JC
JNB/JAE/JNC
JBE/JNA
JNBE/JA
JL/JNGE
JNL/JGE
JLE/JNG
JNLE/JG
КОП
16-рич.
74
75
78
79
70
71
7A
7B
72
73
76
77
7C
7D
7E
7F
Условие
Перехода
ZF = 1
ZF = 0
GE = 1
SF = 0
GF = 1
GF = 0
PF = 1
PF = 0
CF = 1
CF = 0
(CF) OR (ZF) = 1
(CF) OR (ZF) = 0
(SF) XOR (OF) = 1
(SF) XOR (OF) = 0
((SF) XOR (OF)) OR (ZF) = 1
((SF) XOR (OF)) OR (ZF) = 0
Смысловое значение
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
Если
нуль или равно
не нуль или не равно
минус
плюс
переполнение
нет переполнения
четный паритет
нечетный паритет
перенос (не более или равно)
нет переноса
меньше или равно с учетом знака
больше с учетом знака
меньше
не меньше
меньше или равно
больше
Команда безусловного перехода
JMP – внутрисегментная команда с прямой адресацией относительно IP.
Смещение записывается в дополнительном коде и может иметь 8 или 16 разрядов. Если смещение 8-разрядное,
то переход называют коротким.
JMP
адрес перехода (метка) - в пределах сегмента.
JMP src
11111111
Mod 100 r/m
- Внутрисегментный с косвенной адресацией – адрес перехода в регистре или памяти
11101010
cмещ. мл. б.
Смещ. ст. б.
сегм. мл. б.
сегм. ст. б.
- Межсегментный с прямой адресацией – в команде указываются полный адрес перехода. В первом слове операнда
находится новое содержимое IP, во втором находится CS.
JMP src
11111111
Mod 100 r/m
JMP 200:300
EA 0003 0002
- Межсегментный с косвенной адресацией
11101000
Смещение мл. б.
Cмещение ст. б.
Полный адрес перехода занимает в памяти двойное слово. Слово, указанное постбайтом, является смещением, а
следующее – новым значением CS.
(IP) = (EA) ; (CS) = (EA + 2)
Вызов подпрограммы
Структура и формат команды аналогичны командам безусловной передачи управления.
Внутрисегментный переход с прямой адресацией
CALL метка (адрес)
(IP) = (IP) + смещение
CALL src
11111111
mod 100 r/m
Команда вызова подпрограммы CALL производит те же действия, что и команда JMP за исключением того,
что перед выполнением команды адрес возврата помещается в стек. Если переход внутрисегментный, то в стек
помещается лишь содержимое указателя команд IP. Если переход межсегментный, то в стек загружается сначала
содержимое CS, затем IP.
Возврат из подпрограммы RET
При выполнении команды возврата из стека извлекается адрес возврата. Так как адрес возврата может иметь
одно или два слова, для команды RET используют два кода.
- Внутрисегментный возврат
RET
11000011
- Межсегментный возврат
RET FAR
11001011
Возврат из подпрограммы с увеличением указателя стека (SP) = (SP) + data
- Внутрисегментный
RET data
11000010
данные мл. б.
данные ст. б.
11001010
данные мл. б.
данные ст. б.
- Межсегментный
RET data
7. Система команд: арифметические команды, логические операции, сдвиги.
Арифметические операции
Сложение ADD dst, src (dst = dst + src)
- Содержимого регистра или памяти с содержимым регистра
ADD dst,
000100 d mod reg
src
w
r/m
- Непосредственных данных с содержимым регистра или
панели
ADD dst, 100000 mod 000
Данные
данные
data
s w
r/m
(w = 1)
- Непосредственные данные с АХ
ADD A*,
data
0000010
w
данные
данные (w
= 1)
Сложение с учетом переноса
- Регистра или памяти с регистром
ADS dst, src
000100 d w
mod reg r/m
- Непосредственных данных с содержимым регистра или
памяти
ADC dst, 100000 mod reg данные Данные
data
s w
r/m
(w = 1)
- Непосредственных данных с аккумулятором
ADC A*,
0001010
data
w
Инкремент
- Регистра или памяти
INC dst
Данные
Беззнаковое деление содержимого DX, AX на операнд
src
данные (w
= 1)
DIV src
1111111 w
IDIV src
01000 reg
Коррекция
аккумулятора
AL
при
сложении
распакованных двоично-десятичных чисел (в коде ASCII)
AAA
mod 110 r/m
Деление содержимого DX, AX на src с учетом знака
(деление целых чисел )
mod 000 r/m
- Регистра
INC reg
1111011 w
001100111
1111011 m
mod 111 r/m
Десятичная коррекция AL при делении распакованных
чисел (код ASCII)
AAD src
11010101
00001010
Преобразование байта в слово
Коррекция аккумулятора AL при сложении упакованных
двоично-десятичных чисел
CBW
DAA
Преобразование слова в двойное слово
00100111
CWD
Вычитание SUB dst, src (dst = dst - src)
- Регистра или памяти из регистра
SUB dst, src
001010 d w
000110 d w
NOT dst
1111111 w
AND dst, src
mod reg r/m
TEST dst, src
mod 001 r/m
01001 reg
Десятичная
вычитания
DAS
mod 011 r/m
OR dst, src
00101111
коррекция
распакованных
чисел
для
00101111
Умножение без знака AL или AX на операнд src
MUL src
1111011 w
mod 100 r/m
Умножение с учетом знака AL или AX на операнд src (
умножение целых чисел)
IMUL src
1111011 w
mod 101 r/m
Десятичная коррекция AX при умножении распакованных
чисел (код ASCII)
AAM src
mod reg r/m
1000010 w
mod reg r/m
- Непосредственными данными и регистром или памятью
1111011 w
Сравнение CMP dst, src
( dst – src )
- Регистра или памяти и регистра
CMP dst, 100000 mod 111
данные
данные
data
s w
r/m
(w = 1)
- Непосредственных данных с регистром или памяти
CMP A*,
данные (w =
0011110 w
Данные
data
1)
- Непосредственных данных с аккумулятором
AAS
001000 d w
- Непосредственных данных и регистра или памяти
TEST
1111011 mod 000
данные
данные
dst,
w
r/m
(w = 1)
-data
Непосредственных данных и аккумулятора
Логическое «ИЛИ»
- Регистром или памятью и регистром
TEST A*,
данные (w =
1010100 w
данные
data
1)
Изменение знака
NEG dst
mod 010 r/m
- Непосредственных данных и регистра или памяти
AND dst, 100000 mod 100
данные
данные
data
0 w
r/m
(w = 1)
- Непосредственных данных и аккумулятора
AND A*,
0010010
данные (w
Данные
data
w
= 1)
Логическое сравнение (установление регистра флагов)
- Регистра или памяти и регистра
- Регистра
DEC reg
1111011 w
Логическое «И»
( dst = (dst) and (src) )
- Регистра или памяти и регистра
- Непосредственных данных из регистра или памяти
SBB dst, 100000 mod reg данные данные
data
s w
r/m
(w = 1)
- Непосредственных данных из аккумулятора
SBB A*,
0001110
данные (w
Данные
data
w
= 1)
Декремент
- Регистра или памяти
DEC dst
10011001
Логические операции
Инвертирование
mod reg r/m
- Непосредственных данных из регистра или памяти
SUB dst, 100000 mod reg
данные
данные
data
s w
r/m
(w = 1)
- Непосредственных данных из аккумулятора
SUB A*,
0010110
данные (w
данные
data
w
= 1)
Вычитание с учетом заема
- Регистра или памяти из регистра
SBB dst, src
10011001
11010100
000010 d w
mod reg r/m
- Непосредственными данными и аккумулятором
OR dst,
1000000 mod 001
данные
данные
data
w
r/m
(w = 1)
Команды сдвигов
Логический арифметический сдвиг dst на cnt разрядов
влево
XOR dst, src
001100 d w
mod reg r/m
Логический сдвиг вправо
XOR dst, 1000000 mod 110
данные (w
данные
data
w
r/m
= 1)
Циклический сдвиг влево
XOR A*,
0011010
данные (w
данные
data
w
= 1)
Циклический сдвиг вправо
SHL/SAL dst,
110100 v w mod 001 r/m
cnt
Циклический сдвиг влево через перенос
SHR dst, cnt
110100 v
w
mod 101 r/m
Циклический сдвиг вправо через перенос
SAR dst, cnt
110100 v
w
00001010
8. Система команд: команды передачи управления, обработки строк,
mod 111 r/m
управления МП.
Обработка строк
movs - пересылка строки;
cmps - сравнение двух строк;
seas - поиск в строке заданного элемента;
lods - загрузка аккумулятора (регистров AL или АХ) из строки;
stos - запись элемента строки из аккумулятора (регистров АХ или AL).
Хотя команды обработки строк, как правило, включаются в программу без явного
указания операндов, однако каждая команда, в действительности, использует два
операнда. Для команд seas и stos операндом-источником служит аккумулятор, а операндприемник находится в памяти. Для команды lods, наоборот, операнд-источник находится в
памяти, а приемником служит аккумулятор. Наконец, для команд movs и cmps оба
операнда, и источник, и приемник, находятся в памяти.
Операнды, находящиеся в памяти, всегда адресуются единообразно: операнд-источник
через регистры DS:SI, а операнд-приемник через регистры ES:DI. При однократном
выполнении команды обрабатывают только один элемент, а для обработки строки
команды должны предваряться одним из префиксов повторения. В процессе обработки
строки регистры SI и DI автоматически смещаются по строке вперед (если флаг DF = 0)
или назад (если флаг DF = 1), обеспечивая адресацию последующих элементов. Каждая
команда имеет модификации для работы с байтами или словами (например, movsb и
movsw).
Управление состоянием процессора
CLC Сброс признака переноса
Логика: CF = 0.
CLC сбрасывает признак переноса. Другие признаки не меняются.
CLD Сброс признака направления
Логика: DF = 0 (Разрешает инкремент в командах обработки строк).
Сброшенный признак направления влечет увеличение SI и DI на единицу в командах
обработки строк.
CLI Сброс признака разрешения прерывания
Логика: IF = 0.
Немаскированные прерывания распознаются процессором всегда, независимо от значения
признака IF.
CMC Инвертирование признака переноса
Команда: CMC.
Логика: CF = -CF.
ESC Выборка кода операции и операнда
Команда: ESC opcode,source.
Команда ESC используется для передачи управления от микропроцессора внешнему
процессору. В ответ на ESC микропроцессор выбирает код операции для внешнего
процессора (opcode) и код операнда source и помещает их в шину BUS. Внешний
процессор поджидает команду ESC и выполняет команду, размещенную в шине,
используя исполнительный адрес source.
HLT Остановка
Эта команда производит останов ЦП и переводит его в состояние ожидания сигнала
сброса или сигнала немаскированного прерывания.
LOCK Блокирование шины BUS
LOCK - это однобайтный префикс, который может предшествовать любой команде.
LOCK заставляет процессор выработать сигнал блокировки шины на время выполнения
последующей команды. Использование сигнала блокировки делает шину недоступной для
любого внешнего устройства или события, включая прерывания и передачу данных.
NOP Нет операции
Команда NOP является пустым оператором. Она часто используется в целях подгонки
времени, для выравнивания памяти и как "держатель места".
STC Установка признака переноса
Логика: CF = 1
STC устанавливает признак переноса CF в единицу. Другие признаки не меняются.
STD Установка признака направления
Логика: DF = 1 (декремент в командах обработки строк)
Установление DF в 1 влечет изменение SI и DI в сторону уменьшения в командах
обработки строк.
STI Установка признака разрешения прерывания
Логика: IF = 1.
WAIT Ожидание
Команда: WAIT.
Команда WAIT переводит процессор в состояние ожидания. Процессор будет оставаться в
неактивном состоянии, пока на входной линии TEST микропроцессора не появится
сигнал.
9. Система обработки прерываний. Команды программных прерываний.
Прерывание
Прерывание - асинхронная прозрачная процедура (функция), вызываемая по внешнему
событию.
Прерывание - это событие / сигнал, заставляющий ЦП изменить текущий порядок
исполнения команд процесса. Существуют аппаратные и программные прерывания.
Аппаратные прерывания инициируются аппаратурой (например, сигнал микросхемы
таймера), сигналом принтера, нажатием клавиш и т.д. Программные прерывания
инициируются процессом и ничего не прерывают. Это обычные процедуры, которые
используются программами для выполнения рутиной работы. Однако, эти программы
содержатся в ОС, и механизм прерываний дает возможность обратиться к ним из
программ пользователей. Программные прерывания могут быть вложенными. Так,
аппаратные прерывания могут возникнуть при выполнении программных. Когда
разрешенное прерывание вызывается, ЦП оставляет свою работу, выполняет прерывание,
затем возвращается в место прерывания.
Обработка прерываний состоит в следующем:
1. При возникновении прерывания, управление передается в ОС.
2. ОС запоминает состояние прерванного процесса в PCB процесса.
3. ОС анализирует тип прерывания и передает управление соответствующему
обработчику. После обработки прерывания ОС либо продолжает выполнять процесс, либо
запускает готовый процесс с наивысшим приоритетом.
Команды прерывания
1. INT Прерывание
Команда: INT interrupt-num.
Логика : PUSHF
;загрузка регистра FLAGS в стек
TF = 0
;сброс разряда трассировки
IF = 0
;запрещаем прерывания
CALL FAR (INT*4) ;вызываем обработчик прерываний
Команда INT загружает регистр FLAGS в стек, сбрасывает признаки трассировки и
разрешения прерывания, загружает CS и IP в стек, затем передает управление
обработчику прерываний, который определяется по значению операнда interrupt-num.
Если обработчик прерываний производит возврат по команде IRET, то исходное
значение регистра FLAGS восстанавливается.
2.
INTO Прерывание по переполнению
Команда: INTO.
Логика: if (OF = 1)
PUSHF
;загрузка регистра FLAGS в стек
TF = 0
;сброс разряда трассировки
IF = 0
;запрещаем прерывания
CALL FAR (10h) ;вектор прерывания INTO расположен по адресу 0000:0010h
Команда INTO активизирует прерывание типа 4, если признак переполнения OF равен 1;
если OF = 0, то эта команда не выполняет никаких действий. Если OF = 1, то прерывание
выполняется аналогично команде INT 4; в этом случае INTO загружает регистр FLAGS в
стек, сбрасывает признаки трассировки и разрешения прерывания, загружает CS и IP в
стек, затем передает управление обработчику прерываний, соответствующему типу 4 и на
который указывает вектор по адресу 10h. Если обработчик прерываний про изводит
возврат по команде IRET, то исходное значение регистра FLAGS восстанавливается.
3. IRET Возврат после обработки прерывания
Команда: IRET.
Логика: POP IP
POP CS
POPF ;пересылка слова из стека в регистр FLAGS
Команда IRET передает управление из подрограммы обработки прерываний в место
возникновения прерывания, восстанавливая из стека значения регистров IP, CS и FLAGS.
10. Структура выполнимой программы в MS-DOS, загрузка и инициализация
exe- и com-программ.
Программы с расширением .СОМ, которые имеют максимальный размер около 64 К, и
программы с расширением .ЕХЕ, которые могут иметь размер наибольшей доступной
памяти. Программы типа .СОМ соответствуют минимальной модели, в которой все
сегментные регистры содержат одну и ту же величину, т.е. программа и данные
объединены. В противоположность этому программы типа .ЕХЕ образуют малую,
среднюю или большую модели, в которых регистры сегмента содержат различные
величины, т.е. программа, данные и стек постоянно находятся в отдельных сегментах.
Программы типа .ЕХЕ могут иметь много сегментов программ и данных, адресация к
которым осуществляется при помощи длинных вызовов и манипуляций е регистром
сегмента данных DOS
Оба типа программ с расширением .СОМ и .ЕХЕ переносятся в память для выполнения с
помощью одного и того же механизма, а именно функции ЕХЕС, которая образует
загрузчик системы МS DOS. Функция ЕХЕС может вызываться с именем файла
программы, загружаемой СОММАND.СОМ (обычным интерпретатором командной
строки системы МS DOS) либо другой оболочкой, пользовательским интерфейсом или
другой программой, которая была загружена раньше с помощью ЕХЕС. Если в области
транзитных программ достаточно свободной памяти, то ЕХЕС выделяет блок памяти под
новую программу, строит префикс сегмента программы (РSР) по его базовому адресу, а
затем считывает программу в память непосредственно над РSР. В конце своей работы
ЕХЕС устанавливает регистры сегмента и стека и передает управление программе.
Программы с расширением .СОМ и .ЕХЕ часто называют транзитными программами.
Транзитная программа на время своего выполнения "владеет" блоком выделенной ей
памяти и имеет почти полный контроль над системными ресурсами. При завершении
работы такой программы выделенный ей блок памяти освобождается (отсюда термин
"транзитный").
Program Segment Prefix (рус. Префикс программного сегмента, PSP) — структура данных,
которая используется в операционных системах семейства DOS и CP/M для сохранения
состояния компьютерных программ.
В префиксе по относительному адресу 0000Н находится команда передачи управления
системному обработчику завершения процесса, который удаляет программу после ее
выполнения и осуществляет окончательный выход. По относительному адресу 0005Н
находится команда связи с диспетчером функций МS DOS, который осуществляет
дисковые операции, операции ввода-вывода через консоль и другое сервисное
обслуживание по запросу транзитной программы.
Программы типа .СОМ хранятся на диске в виде файлов, в которых содержится
абсолютный образ машинных команд, предназначенных для выполнения. Tак как
программы типа .СОМ загружаются непосредственно над префиксом сегмента программы
и, кроме того, не имеют заголовка, который может задавать другую точку входа, то их
начальный адрес всегда составляет 0100H, что определено размером префикса.
Программы типа .EXE могут быть практически неограниченного размера. Загрузчик
всегда вводит программу типа .ЕХЕ в память непосредственно над префиксом сегмента
программы, хотя порядок сегментов программы, данных и стека может меняться. Файл
типа .ЕХЕ содержит заголовок, или блок управляющей информации характерного
формата. Размер заголовка определяется числом команд программы, настраиваемых во
время загрузки, но всегда кратен 512 байт. До того как DOS передает управление
программе, вычисляются начальные значения регистра сегмента программы CS и
указателя команд IP, при этом используются информация о точке входа из заголовка
файла типа .ЕХЕ, а также адрес загрузки программы. Эта информация извлекается из
оператора ЕND исходного текста одного из модулей программы. Программа типа .ЕХЕ,
поступающая на вход компоновщика, может состоять из большого числа отдельных
объектных модулей. Допускается, чтобы каждый модуль использовал уникальное имя
сегмента программы, а процедуры имени атрибут либо NEAR, либо FAR в зависимости от
условий определения имени и размеров выполнимой программы. Программист должен
заботиться о том, чтобы компонуемые вместе модули содержали только один сегмент с
атрибутом SТАСК и только одну точку входа, определяемую директивой ассемблера
ЕND.
11.Этапы подготовки программы: трансляция. Управление трансляцией.
Трансляция программы — преобразование программы, представленной на одном из
языков программирования, в программу на другом языке, эквивалентную по результатам
выполнения первой.
Трансляция исходного текста программы состоит в преобразовании строк исходного
языка в коды машинных команд и выполняется с помощью транслятора с языка
ассемблера (т.е. с помощью программы ассемблера). В результате трансляции образуется
объектный файл с расширением .obj.
TASM предоставляет средства для вывода текстового сообщения во время трансляции
программы - директивы DISPLAY и %OUT. С их помощью можно, при необходимости,
следить за ходом трансляции.
К примеру: display недопустимые аргументы макрокоманды
...
%out недопустимое имя регистра
В результате обработки этих директив на экран будут выведены тексты сообщений. Если
эти директивы использовать совместно с директивами условной компиляции, то, к
примеру, можно отслеживать путь, по которому осуществляется трансляция исходного
текста программы.
/l — указывает на необходимость создания файла листинга, даже если он не
“заказывается” в командной строке;
/la — показать в листинге код, вставляемый транслятором для организации интерфейса с
языком высокого уровня по директиве MODEL
/zi — включить в объектный файл информацию для отладки;
/zd — поместить в объектный файл информацию о номерах строк, что необходимо для
работы отладчика на уровне исходного текста программы;
/zn — запретить помещение в объектный файл отладочной информации.
12.Этапы подготовки программы: компоновка и выполнение. Управление
компоновкой.
Компоновка объектного файла выполняется с помощью программы компоновщика
(редактора связей). Основное назначение — подсоединение к файлу с основной
программой файлов с подпрограммами и настройка связей между ними. Изменение
формата объектного файла и преобразование его в выполнимый файл, который может
быть загружен в оперативную память и выполнен. В результате компоновки образуется
загрузочный, или выполнимый файл с расширением *.exe.
Управление компоновкой:
Ассемблер должен получить от программиста информацию о подпрограммах,
относящихся к другому программному модулю. Это выполняется с помощью оператора
PUBLIC, извещающего ассемблер о том, что данное символическое имя доступно другим
программам. Кроме того, программист указывает ассмеблеру, какие из символических
имен является внешними для данного программного модуля. В языке ассемблера это
реализуется оператором EXTRN, который объявляет соответствующее имя внешним для
текущего ассемблирования, чтобы оно могло быть правильно обработано.
Оператор EXTRN выполняет две фуекции. Во-первых, он сообщает
ассемблеру, что указанное символическое имя является внешним для
текущего ассемблирования.
Вторая функция оператора EXTRN состоит в том, что он указывает ассемблеру тип
соответствующего символического имени. Это позволяет генерировать правильные
команды. От программиста требуется указать в операторе EXTRN тип символического
имени. Так как кроме того ассемблером осуществляется посегментная адресация
программы, то оператор EXTERN указывает на сегмент, в котором появляется данный
идентификатор. Это не входит в синтаксис оператора EXTRN, а определяется
местоположением этого оператора в программе. Ассемблер считает, что внешнее имя
относится к тому же сегменту, в котором появляется оператор EXTERN для этого
символического имени.
Опции компоновщика (редактора связей) TLINK
/m
Создать файл карты
/l
Создать раздел в файле карты с номерами строк
/v
Включить отладочную информацию в выполняемый файл
/d
Предупреждать о дублировании символов в компонуемых библиотеках
/t
Создать файл типа .com (по умолчанию .exe)
13.Элементы языка ассемблера: переменные, константы, метки, форматы
команд и директив.
Переменные
Удобно определять и применять символические имена, соответствующие адресам
указанных элементов. Переменная - это единица программных данных, имеющая
символическое имя.
Большинство ассемблерных программ начинается с определения данных, которыми они
будут оперировать. Распределение ячеек памяти и присвоение им идентификаторов
осуществляется с помощью директив DB (Define Byte - определить байт), DW (Define
Word - определить слово), DD (Define Doubleword - определить двойное слово), DQ
(Define Quadword - определить 4 слова) или DT (Define Tenbyte - определить 10 байтов).
Для задания начальных значений могут использоваться числовые константы и
символьные цепочки. Если не нужно задавать начальное значение переменной, то вместо
константы ставится вопросительный знак.
Чтобы точно определить тип переменной, на которую производится ссылка, ассемблер
использует операторы BYTE PTR, WORD PTR и DWORD PTR (указатель на байт, слово и
двойное слово соответственно).
Для инициализации массивов применяется конструкция DUP, которая в общем случае
имеет вид: n DUP (нач. значение, нач. значение, ...) где параметр n задает число
повторений элементов, находящихся в круглых скобках.
Метки
Метка представляет собой символическое имя для адреса ячейки памяти и предназначена
для использования в качестве операнда в командах управления.
Числовые константы
Константа - это численное значение, вычисляемое во время ассемблирования по
заданному выражению. Численные константы допускается представлять в системах
счисления с основаниями 2, 8, 10 и 16. За младшей цифрой должен находиться
однобуквенный дескриптор системы счисления: B - двоичная, O или Q - восьмеричная, D
(необязательно) - десятичная, H-шестнадцатиричная. Шестнадцатиричная константа
должна быть дополнена слева незначащим нулем.
Символьные константы
Символьная константа - это любой символ в коде ASCII. Символьная строка может
содержать до 255 символов и должна быть заключена в одиночные кавычки.
Команды языка ассемблера представляют взаимно однозначное соответствие с
машинными кодами. В простейшем варианте они состоят из мнемокода команды с
послеующими операндами. Все это непосредственно преобразуется в машинные коды.
Команды могут либо иметь, либо не иметь операндов, как показано на примере ниже.
CLC ; мнемокод
INC EAX ; мнемокод с одним операндом
MOV EAX,EBX ; мнемокод с двумя операндами
Ассемблер является языком низкого уровня, потому что его команды, по сути, машинные,
т.е. команды языка ассемблера имеют взаимно однозначное соответствие с машинными
кодами. Операнд может быть регистром, переменной, ячейкой памяти или
непосредственным Значением
10 (непосредственное значение)
count (переменная)
EAX (регистр)
[0200] (ячейка памяти)
Директивы языка – это ассемблерные команды, которые встречаются в исходном коде, но
не транслируются прямо в исполняемые коды. Они используются ассемблером при
трактовке мнемоники входного файла, размещении данных и формировании файла
листинга.
Существует четыре основных типа директив в MPASM:
директивы данных;
директивы листинга;
управляющие директивы;
макро-директивы.
14.Выражения ассемблера. Типы операндов. Примеры использования.
Выражения могут быть использованы в инструкциях или директивах и состоят из
операндов и операторов. Операнды представляют значения, регистры или адреса ячеек
памяти, используемых определенным образом по контексту программы. Операторы
выполняют арифметические, логические, побитовые и другие операции над операндами
выражений.
Постоянные или непосредственные операнды — число, строка, имя или выражение,
имеющие некоторое фиксированное значение.
Адресные операнды — задают физическое расположение операнда в памяти с помощью
указания двух составляющих адреса: сегмента и смещения.
Перемещаемые операнды — любые символьные имена, представляющие некоторые
адреса памяти. Сегментная составляющая адреса перемещаемого операнда неизвестна и
будет определена после загрузки программы в память для выполнения.
Счетчик адреса — специфический вид операнда. Он обозначается знаком $.
Когда транслятор ассемблера встречает в исходной программе этот символ, то он
подставляет вместо него текущее значение счетчика адреса.
Регистровый операнд — это просто имя регистра.
Базовый и индексный операнды. Этот тип операндов используется для реализации
косвенной базовой, косвенной индексной адресации или их комбинаций и расширений.
Структурные операнды используются для доступа к конкретному элементу сложного типа
данных, называемого структурой.
Записи (аналогично структурному типу) используются для доступа к битовому полю
некоторой записи.
Операнд команды может быть выражением, представляющим собой комбинацию
операндов и операторов ассемблера. Транслятор ассемблера рассматривает выражение как единое целое и преобразует его в числовую константу.
Арифметические операторы.
выражение_1 * выражение_2
выражение_1 / выражение_2
выражение_1 MOD выражение_2
выражение_1 + выражение_2
выражение_1 – выражение_2
+ выражение
– выражение
Эти операторы обеспечивают выполнение основных арифметических действий (здесь
MOD - остаток от деления выражения_1 на выражение_2, а знаком / обозначается деление
нацело). Результатом арифметического оператора является абсолютное значение.
Операторы сдвига.
Операторы SHR и SHL сдвигают значение выражения соответственно вправо и влево на
число разрядов, определяемое счетчиком. Биты, выдвигаемые за пределы выражения,
теряются. Замечание: не следует путать операторы SHR и SHL с одноименными
инструкциями процессора.
Операторы отношений.
выражение_1 EQ выражение_2
выражение_1 NE выражение_2
выражение_1 LT выражение_2
выражение_1 LE выражение_2
выражение_1 GT выражение_2
выражение_1 GE выражение_2
Мнемонические коды отношений расшифровываются следующим образом:
EQ – равно;NE – не равно;LT – меньше;LE – меньше или равно;GT – больше;GE – больше
или равно.
Операторы отношений обычно используются в директивах условного ассемблирования и
инструкциях условного перехода.
Операции с битами.
NOT – инверсия;AND – логическое И;OR – логическое ИЛИ;XOR – исключающее
логическое ИЛИ.Операции выполняются над каждыми соответствующими битами
выражений. Выражения должны иметь абсолютные значения.
Оператор индекса [] складывает указанные выражения подобно тому, как это делает
оператор +, с той разницей, что первое выражение необязательно, при его отсутствии
предполагается 0 (двойные квадратные скобки указывают на то, что операнд не
обязателен).
При помощи оператора PTR переменная или метка, задаваемая выражением, может
трактоваться как переменная или метка указанного типа.
Операторы HIGH и LOW вычисляют соответственно старшие и младшие 8 битов значения
выражения. Выражение может иметь любое значение.
SEG выражение вычисляет значение атрибута СЕГМЕНТ выражения. Выражение может
быть меткой, переменной, именем сегмента, именем группы или другим символом.
OFFSET выражение вычисляет значение атрибута СМЕЩЕНИЕ выражения.
15.Операторы ассемблера. Примеры использования.
Операторы машинных команд
Производит над выражением
представляют символическую форму
побитовую операцию отрицания
записи обычных команд ЕС ЭВМ. Набор
(инвертирования).
операторов этих команд определяется
2. AND Побитное логическое "И"
системой команд ЕС ЭВМ.
Производит по битам операцию
Операторы команд Ассемблера
логического умножения над операндами
определяют действия транслятора при
expression1 и expression2.
переводе исходной программы на
3. OR Побитовая логическая операция
машинный язык.
"ИЛИ"
Производит по битам операцию
Арифметические операторы
логического ИЛИ над операндами
1. + Сложение или унарный плюс
expression1 и expression2.
Бинарный "+" суммирует значения двух
4. XOR Побитовое логическое
выражений. Унарный "+" сохраняет знак
"исключающее ИЛИ"
и значение выражения.
Производит по битам операцию
2. - Вычитание или унарный минус
логического исключающего ИЛИ над
Бинарный "-" вычитает одно выражение
операндами expression1 и expression2.
из другого. Унарный "-" изменяет знак
выражения.
Операторы отношений
1. EQ Оператор отношения "равно"
3. * Умножение
Этот оператор трактует операнды, как
Перемножает значения двух
16-битные числа. Выражения, у которых
выражений.
16-ый бит равен 1, являются
4. / Деление
отрицательными. Так, -1 EQ 0FFFFh есть
Делит одно выражение на другое.
истина.
5. MOD Деление по модулю
2. NE Операция отношения "не равно"
Выдает остаток от деления.
3. LT Операция отношения "меньше чем"
Операторы сдвига
Этот оператор трактует операнды, как
1. SHL Сдвиг влево
17-битные числа. 17-й бит задает знак
Сдвигает выражение влево на count
операнда. Так что максимально
битов.
возможное значение операнда есть
2. SHR Сдвиг вправо
0FFFFh (65535).
выражение SHR count
4. GT Оператор отношения "больше"
Побитовые логические операции
5. LE Оператор отношения "меньше или
1. NOT Побитовое отрицание
равно"
GE Оператор отношения "больше или
равно"
[ ] Оператор индексации
expression1[expression2]
Прибавляет значение выражения
expression1 к значению выражения
expression2. Этот оператор такой же, как
и '+', за тем исключением, что здесь
выражение expression1 не является
обязательным.
Операторы, возвращающие значения
1. SEG Выдача значения сегмента
2. OFFSET Смещение выражения
Выдает число байт между выражением
и началом сегмента, в котором оно
определено.
3. TYPE Получение размера типа
Выдает число байт, необходимых для
хранения переменной того типа, каким
является выражение; для метки NEAR
выдает 0FFFFh, а для метки FAR 0FFFEh.
4. LENGTH Возврат длины переменной
Возвращает число единиц типа BYTE,
WORD, DWORD, QWORD или TBYTE,
занимаемых переменной. Только для
переменных, описанных с помощью
оператора DUP, будет возвращено
значение, отличное от 1. Строковые
константы также возвратят 1.
5. SIZE Выдача количества байт,
используемых под переменную
Выдает число байт, занимаемых
переменной.SIZE переменная=(LENGTH
переменная)*(TYPE переменная)
6.
THIS Создание операнда по текущей
позиции
THIS type
Создает операнд типа type, с адресом
(сегмент и смещение), равным текущему
указателю на размещение в памяти. Этот
оператор используется для создания
меток и переменных, использующих
операцию EQU или знак равенства '=',
также как и команда LABEL.
Пример.
byteLabel equ THIS BYTE
аналогично
byteLabel LABEL BYTE.
7. HIGH Возврат старших 8 бит
Этот оператор возвращает старшие 8
бит выражения expression.
8. LOW Получение восьми младших
битов
Этот оператор выдает младший байт (8
бит) выражения expression.
Операторы изменения атрибутов
выражения
1. PTR Изменение типа переменной
type PTR выражение
Временно изменяет тип выражения
(которое может быть меткой или
переменной) с его стандартного типа на
тип type. Оператор PTR обычно
используется для способа доступа к
переменной, отличного от указанного
при ее определении.
6.
16.Директивы ассемблера: определение переменных, констант, определение
типов данных.
Директивы определения данных
DB Описание байта
DD Описание двойного слова
DW Описание слова. Размещает и инициализирует одно или более слов (по 2 байта)
памяти.
STRUC Определение структурного типа
имя STRUC
field_Definitions
имя ENDS.
Начинает описание структурного типа. Структура может иметь любое число полей.
RECORD Описание типа записи
recordName RECORD fieldName:ширина [=выражение],,,
Определяет 8-битовый либо 16-битовый тип записи с одним и более битовыми полями
указанной ширины и (необязательно) с указанным начальным значением. Параметр
ширина указывает число битов от 1 до 16. Необязательный параметр "=выражение"
позволяет задавать начальное значение для поля.
Директивы присваивания
EQU Создание символа
Создает абсолютные символы (имена, которые представляют 16-битные значения),
= Создание абсолютного символа
Размещения абсолютного символа в памяти не происходит. Ассемблер заменяет каждый
вход абсолютного символа name на 16-тибитное числовое значение выражения.
Абсолютный символ МОЖЕТ быть переопределен в любое время.
17.Директивы сегментации. Сегментная структура программ в MS-DOS.
Директива SEGMENT позволяет унифицировать формат объетных модулей, что позволяет
объединять программы на разных языках. Операнды этой директивы определяют вариант
объединения.
Атрибут выравнивания сегмента (тип выравнивания) сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе.
BYTE — выравнивание не выполняется. Сегмент может начинаться с любого
адреса памяти;
WORD — сегмент начинается по адресу, кратному двум, то есть последний
(младший) значащий бит физического адреса равен 0 (выравнивание по границе слова);
DWORD — сегмент начинается по адресу, кратному четырем, то есть два последних (младших) значащих бита равны 0 (выравнивание по границе двойного слова);
PARA — сегмент начинается по адресу, кратному 16, то есть последняя шестнадцатеричная цифра адреса должна быть Oh (выравнивание по границе
параграфа);
PAGE — сегмент начинается по адресу, кратному 256, то есть две последние
шестнадцатеричные цифры должны быть OOh (выравнивание по границе
страницы размером 256 байт);
MEMPAGE — сегмент начинается по адресу, кратному 4 Кбайт, то есть три последние шестнадцатеричные цифры должны быть OOOh (адрес следующей
страницы памяти размером 4 Кбайт).
Атрибут комбинирования сегментов (комбинаторный тип) сообщает компоновщику, как
нужно комбинировать сегменты различных модулей, имеющие одно
и то же имя.
PRIVATE — сегмент не будет объединяться с другими сегментами с тем же
именем вне данного модуля;
PUBLIC — заставляет компоновщик объединить все сегменты с одинаковым
именем. Новый объединенный сегмент будет целым и непрерывным. Все
адреса (смещения) объектов, а это могут быть, в зависимости от типа сегмента, команды или данные, будут вычисляться относительно начала этого
нового сегмента;
COMMON — располагает все сегменты с одним и тем же именем по одному
адресу, то есть все сегменты с данным именем перекрываются. Размер полученного в результате сегмента будет равен размеру самого большого сегмента;
STACK — определение сегмента стека. Заставляет компоновщик объединить
все одноименные сегменты и вычислять адреса в этих сегментах относительно регистра SS.
Атрибут класса сегмента (тип класса) — это заключенная в кавычки строка,
помогающая компоновщику определить нужный порядок следования сегмен-
тов при сборке программы из сегментов нескольких модулей.
Директива ASSUME сообщает транслятору, какой сегмент к какому сегментному
регистру привязан. В свою очередь, это позволяет транслятору корректно связывать
символические имена, определенные в сегментах.
18.Упрощенные (точечные) директивы сегментации. Стандартные модели
памяти.
Директива указания модели памяти MODEL связывает сегменты, которые при
наличии упрощенных директив сегментации имеют предопределенные имена,
с сегментными регистрами. Обязательным параметром директивы MODEL является
модель_памяти.
19.Объявление и использование макрокоманд. Управление аргументами
макрокоманд.
Макроопределение - это способ дать имя фрагменту кода. После того как макрос
определен, программист может вместо фрагмента кода писать имя макроса. В сущности,
макрос - это просто имя фрагмента кода.
Хотя в разных языках ассемблера определение макроса выглядит немного по-разному, во
всех оно состоит из одних и тех же базовых частей:
+ заголовок макроса, в котором дается имя определяемого макроса;
+ текст, в котором приводится тело макроса;
+ директива, которая завершает определение (например, ENDM).
Когда ассемблер наталкивается на макроопределение в программе, он сохраняет его в
таблице макроопределений для последующего использования. Всякий раз, когда в
программе в качестве кода операции будет появляться макрос, ассемблер заменит его
телом макроса. Использование имени макроса в качестве кода операции называется
макровызовом, а его замена телом макроса - макрорасширением.
Макрорасширение происходит в ходе ассемблирования, а не во время выполнения
программы.
Макровызовы не следует путать с вызовами процедур. Основное отличие состоит в том,
что макровызов - это команда ассемблеру заменить имя макроса телом макроса. Вызов
процедуры - это машинная команда, которая, будучи вставлена в объектную программу,
позднее должна быть выполнена для вызова процедуры.
Управление параметрами:
& Оператор подстановки
&dummyparameter или dummyparameter&
Заставляет ассемблер заменить подставной параметр dummyparameter на значение
фактического параметра в тексте макроопределения.
< > Оператор буквального прочтения текста
<текст>
Трактует текст как единое целое, независимо от того, содержит ли он пробелы, запятые
или другие разделители. Этот оператор используется в макросах или в повторных блоках,
чтобы быть уверенным в том, что вызов макрокоманды будет трактоваться как единый
параметр.
! Оператор буквальной интерпретации символа
!символ
Заставляет ассемблер интерпретировать символ буквально. эквивалентно <символ>;
% Оператор преобразования в выражение
%текст
Интерпретирует текст как выражение. Макроассемблер вычислит значение этого
выражения в текущей системе счисления и заменит текст на это значение.
;; Макрокомментарий
;;текст_комментария
Позволяет включать комментарий в макроопределение таким образом, что он удаляется
при макрорасширении.
Директивы:
MACRO Начало описания макрокоманды
имя MACRO [dummyparameter,,,]
команды
ENDM
Начинает описание макрокоманды, состоящей из имени и внутренних команд. Имя
должно быть правильным и уникальным. Может быть объявлено любое число
формальных параметров (dummyparameter), но они должны все стоять в одной строке.
ENDM Конец макроопределения или повторного блока
1. имя MAKRO [формальный_параметр,,,]
2. REPT выражение
3. IRP формальное_имя,<параметр,,,>
4. IRPC формальное_имя,строка
LOCAL Объявление символа для использования в Макросе
LOCAL dummyname,,,
Создает уникальные символьные имена, используемые в макросах. Когда макрос
раскрывается, dummyname (формальное имя) заменяется символом следующим образом:
??number,
где number - шестнадцатеричное число в пределах от 0 до FFFFh.
EXITM Немедленный выход из макро
EXITM
Влечет немедленный выход из макро (MACRO) или повторного блока (REPT) и
возвращает управление оператору, следующему за оператором вызова макро или
повторного блока.
PURGE Удаление описания Макроса
PURGE macroname,,,
Удаляет одно и более макроопределений, освобождая память.
20.Макрокоманды повторения. Директивы условной трансляции.
Макрокоманды повторения.
Директивы повторения заставляют ассемблер повторить блок
операторов, завершаемых директивой ENDM. Эти директивы не
обязательно должны находится в макроопределении, но если они
там находятся,
то одна директива ENDM
требуется для
завершения повторяющегося блока,
а вторая ENDM - для
завершения макроопределения.
REPT: Повторение
Операция REPT приводит к повторению блока операторов до
директивы ENDM в соответствии с числом повторений, указанным
в выражении:
REPT выражение
IRP: Неопределенное повторение
Операция IRP приводит к повторению блока команд до
директивы ENDM. Основной формат:
IRP dummy,<arguments>
Аргументы, содержащиеся в угловых скобках, представляют
собой любое число правильных символов, строк, числовых или
арифметических констант. Ассемблер генерирует блок кода для
каждого аргумента.
IRPC: Неопределенное повторение символа
Операция IRPC приводит к повторению блока операторов до
директивы ENDM. Основной формат:
IRPC dummy,string
Ассемблер генерирует блок кода для каждого символа в строке
"string".
Директ.условной трансляции.
Данные директивы предназначены для организации выборочной трансляции фрагментов
программного кода.
Директивы IF и IFE — условная трансляция по результату вычисления логического
выражения.
Директивы IFDEF и IFNDEF — условная трансляция по факту определения
символического имени.
Директивы IFB и IFNB — условная трансляция по факту определения фактического
аргумента при вызове макрокоманды.
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI — условная трансляция по результату
сравнения строк символов.
21.Организация процедур. Способы передачи параметров.
Для организации процедур применяются директивы PROC и ENDP
для передачи управления процедуре используется команда CALL. При достижении
команды RET, находящейся в процедуре, управление передается команде,
непосредственно идущей за командой CALL.
Способы передачи параметров.
1). Передача параметров через регистры общего назначения.
Достоинства: быстрый и удобный;
Недостатки: ограничен в размерах (не более 5).
Применение: написание операционных систем (печать строки. и др.).
2). Передача через общую область памяти. (общие переменные)
Общие переменные описываются следующим образом,
в вызывающей:
PUBLIC список имен (имена переменных или меток).
В вызываемой процедуре:
EXTERN {имя параметра, тип}
3). Передача параметров через стек.
Такой метод применим не только между ассемблерными модулями, но и с разными
языками. STDCALL- стандартная взаимосвязь процедур по параметрам. Основным
средством доступа к параметрам является BP, для которого:
его значение при запуске процедуры сохраняется в стеке;
доступ к параметрам осуществляется с помощью базовой адресации
22.Взаимодействие процедур, созданных в разных программных модулях.
Библиотеки объектных модулей.
Для того чтобы объявить о подобного рода видимых извне объектах, программа должна
использовать две директивы TASM: extrn и public.
Директива extrn предназначена для объявления некоторого имени внешним по отношению
к данному модулю. Это имя в другом модуле должно быть объявлено в директиве public.
Директива public предназначена для объявления некоторого имени, определенного в этом
модуле, и видимом в других модулях. Синтаксис этих директив следующий:
extrn имя: тип,..., имя: тип
public имя,... ,имя
Здесь имя - идентификатор, определенный в другом модуле. В качестве идентификатора
могут выступать:
• имена переменных, определенных директивами типа db, dw и т. д.;
• имена процедур;
• имена констант, определенных операторами = и equ.
Тип определяет тип идентификатора. Указание типа необходимо, для того, чтобы
транслятор правильно сформировал соответствующую машинную команду.
Действительные адреса будут вычислены на этапе редактирования, когда будут
разрешаться внешние ссылки. Возможные значения типа определяются допустимыми
типами объектов для этих директив:
• если имя - это имя переменной, то тип может принимать значения byte, word, dword,
pword, fword, qword и tbyte;
• если имя - это имя процедуры, то тип может принимать значение near или far;
• если имя - это имя константы, то тип должен быть abs.
Библиотеки объектных модулей.
Для решения проблем, возникающих при поддержании порядкав наборах из большого
количества объектных модулей, еще на заревычислительной техники были придуманы
библиотеки объектных модулей.
Библиотека, как правило, представляет последовательный файл,состоящий из заголовка,
за которым последовательно уложены объектные модули.В заголовке содержится
следующая информация:
Список всех объектных модулей, со смещением каждого модуля отначала библиотеки.
Это нужно для того, чтобы можно было легко найтитребуемый модуль.
Список всех глобальных символов, определенных в каждом из модулей,с указанием, в
каком именно модуле он был определен.
Линкер обычно собирает в программу все объектные модули,которые были ему заданы в
командной строке, даже если на этот модульне было ни одной ссылки.С библиотечными
модулями он ведет себя несколько иначе.
lib.exe – для работ с библиотеками *.lib
LIB.EXE /LIST LIBC.LIB>1 -просмотр всех объектных модулей в библиотеке
LIB.EXE /EXTRACT:build\intel\st_obj\crt0init.obj LIBC.lib –извлечение
23.Организация ввода с клавиатуры, использование функций BIOS и DOS
для ввода с клавиатуры.
Ввод данных с клавиатуры реализован с использованием промежуточного буфера ввода "буфера клавиатуры" (специальной области памяти): все набираемые на клавиатуре
символы сначала попадают в этот буфер, и уже отсюда они затем будут считываться
программами DOS. Это означает, что можно досрочно ввести много данных и они не
пропадут. Например, если в программе осуществляется ввод по одному символу, то все
равно можно сразу набрать много символов - затем они будут считываться из буфера по
одному.
Различные служебные функции DOS для работы с буфером клавиатуры (функции 01h,
06h, 07h, 08h, 0Ah, 0Bh и 0Ch) классифицируются прежде всего по трем критериям:
ожидают ли они ввода или же, когда символ не получен, сообщают, что ввода нет; выдают
ли они на экран дисплея эхо (введенный символ); и реагирует ли функция на ввод
стандартного символа прерывания во время ее исполнения.
Все функции ввода с клавиатуры получают введенный символ из буфера клавиатуры,
размещенного в памяти компьютера, а не непосредственно из порта 60h интерфейса
клавиатуры (из порта 60h скан-коды считываются прерыванием 09h, переводятся в коды
символов и помещаются в буфер клавиатуры)
Прерывание 21h, номер функции в регистре ah
Функция 1: ввод символа с клавиатуры с эхом, ожиданием нажатия клавиши.
ASCII код символа возвращается в al. Для специальных клавиш al=0. Повторный вызов
функции возвращает скэн-код.
Функция 7: ввод с клавиатуры без эха с ожиданием.
ASCII код символа возвращается в al. Для специальных клавиш al=0. Повторный вызов
функции возвращает скэн-код.
Функция 0Аh: ввод строки с клавиатуры с ожиданием и эхом. Адрес буфера ввода - ds:dx,
первый байт буфера - его размер, второй – число реально введенный байтов. Окончание
ввода – Enter (0Dh)
Прерывание 16h, номер функции в регистре ah.
Функция 0: чтение символа с ожиданием
Если нажатой клавише соответствует ASCII –символ, то в al - код этого символа, в ah –
скан-код клавиши;
Если нажатой клавише соответствует расширенный ASCII-код, то в al – префикс сканкода или 0 , если префикса нет, в ah – расширенный ASCII –код.
Функция 1: проверка символа в буфере клавиатуры (без ожидания)
Выход:zf=1 буфер пуст
zf=0 в буфере присутствует символ,
в al - код этого символа, 0 или префикс скан-кода
в ah – скан-код клавиши или расширенный ASCII –код
Функция 2: считать состояние клавиатуры.
Выход: al – байт состояния клавиатуры (байт расположен в памяти по адресу 0:417h); бит
0: правая Shift нажата, бит 1: левая Shift нажата, бит 2: любая Ctrl нажата, бит 3: любая Alt
нажата, бит 4: ScrollLock включена, бит 5: NumLock включена, бит 6: CapsLock включена,
бит 7: Ins включена.
24.Организация вывода на экран в текстовом режиме, использование
функций BIOS и DOS для вывода на экран.
Коды символов, отображаемых в каждый момент на экране хранятся в видеопамяти.
Видеопамять в текстовом режиме с точки зрения программиста представляет собой часть
адресного пространства ЦВМ, начинающуюся с адреса B800:000 и кончающуюся
B800:7FFF. Так как на описание одного знакоместа требуется 2 байта (код символа и
атрибут) существует возможность хранить (и последовательно отображать на экране) до 8
страниц (отдельных изображений).
Как упоминалось выше содержимое каждого знакоместа описывается не только кодом
символа, но и атрибутом. Атрибут характеризует цвет, которым отображаются символ и
фон за ним. В видеопамяти коды символов располагаются по четным адресам, а атрибуты
- по нечетным.
Вывод символа на экран как следствие вышесказанного производится записью пары байт
в некоторое место видеопамяти, определяемое активной страницей и положением
знакоместа на ней. Делается это либо с помощью прямого обращения либо с
использованием функций BIOS или DOS.
Прерывание 21h, номер функции в регистре ah
Функция 2: вывод символа на экран. Символ в dl.
Функция 9: вывод строки на экран. Адрес строки в ds:dx, окончание строки $.
Прерывание 10h, номер функции в регистре ah.
Функция 0: установить режим выдачи изображения. Номер режима в al.
Функция 1: установить размер курсора.
Установить количество строк развертки, нумеруемых сверху от 0 до 1fh.
ch – начальная строка растра для курсора
cl – конечная строка растра для курсора
Если установлен 5 разряд регистра ch (20h) – удаление курсора.
Функция 2: установить позицию курсора.
Задать координаты строки и колонки экрана.
dh –строка
dl –столбец
bh – номер страницы
Отсчет номера строки и столбца ведется от верхнего левого угла экрана с (0,0).
Функция 3: считать положение и размер курсора.
bh – номер страницы
Положение и размер курсора возвращаются в dx, cx.
dh, dl – строка и столбец текущей позиции курсора
ch, cl – первая и последняя строки развертки курсора
Функция 5: установить активную страницу
al – номер страницы
В текстовом режиме 3 – номера страниц 0-3.
Функция 6: прокрутить окно вверх
Позволяет задать на экране прямоугольную область и прокрутить ее содержимое на 1 или
более строк
al – число строк прокрутки (если al=0 – очищается все окно («рисуем» окно))
ch, cl – строка и столбец верхнего левого угла
dh, dl – строка и столбец правого нижнего угла
bh – атрибут для выдачи пустых строк
Обычно прокрутка окна выполняется в 2 стадии: 1) с помощью функции 6 внизу окна
вводятся строки (при этом исчезают верхние); 2) в новую строку позиционируется курсор
и выводятся символы.
Функция 7: прокрутить окно вниз
Аналогично функции 6, но новые строки появляются в верхней части окна и исчезают в
нижней.
Функция 8: считать символ и атрибут символа в текущей позиции курсора
bh – номер страницы
Возвращаемые значения:
ah – атрибут символа
al – ASCII –код символа
Функция 9: вывести символ с заданным атрибутом на экран
bh – номер страницы
al – ASCII- код символа
bl – атрибут символа
cx – число повторений символа
Каждый символ на экране описывается 2 байтами - ASCII-кодом и атрибутом.
Байт атрибутов: биты 0-3 – символ, биты 4-7 – фон.
Функция 0Аh: вывести символ с текущим атрибутом на экран ( в качестве атрибута
символа используется атрибут, который имел символ, находившийся ранее в данной
позиции).
bh – номер страницы
al – ASCII-код символа
cx –число повторений символа
25.Ввод-вывод числовой информации в программах на ассемблере.
26.Арифметическая обработка числовой информации в программах на
ассемблере.
Сложение ADD dst, src (dst = dst + src)
Сложение с учетом переноса
ADS dst, src 000100 d w mod reg r/m
Инкремент
INC dst
1111111 w mod 000 r/m
Коррекция аккумулятора AL при сложении распакованных двоично-десятичных чисел (в
коде ASCII)
AAA 001100111
Коррекция аккумулятора AL при сложении упакованных двоично-десятичных чисел
DAA 00100111
Вычитание SUB dst, src (dst = dst - src)
Вычитание с учетом заема
SBB dst, src 000110 d w mod reg r/m
Декремент
DEC dst
1111111 w mod 001 r/m
Изменение знака
NEG dst
1111011 w mod 011 r/m
Сравнение CMP dst, src
( dst – src )
- Непосредственных данных с аккумулятором
AAS 00101111
Десятичная коррекция распакованных чисел для вычитания
DAS 00101111
Умножение без знака AL или AX на операнд src
MUL src
1111011 w mod 100 r/m
Умножение с учетом знака AL или AX на операнд src ( умножение целых чисел)
IMUL src
1111011 w mod 101 r/m
Десятичная коррекция AX при умножении распакованных чисел (код ASCII)
AAM src
11010100
00001010
Беззнаковое деление содержимого DX, AX на операнд src
DIV src
1111011 w mod 110 r/m
Деление содержимого DX, AX на src с учетом знака (деление целых чисел )
IDIV src
1111011 m mod 111 r/m
Десятичная коррекция AL при делении распакованных чисел (код ASCII)
AAD src
11010101
00001010
Преобразование байта в слово
CBW 10011001
Преобразование слова в двойное слово
CWD 10011001
Выполнение арифметическиx операций над двоичными числами
(byte, word, doubleword).
Над двоичными числами без знака можно выполнять операции сложения, вычитания,
умножения и деления.
Над двоичными числами со знаком могут быть выполнены операции умножения и
деления.