Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички по ассемблеру / Методичка_часть1 Архитектура Вычислительных Систем-Новиков.doc
Скачиваний:
88
Добавлен:
02.05.2014
Размер:
1.31 Mб
Скачать

2.4. Числа с плавающей запятой

В процессорах Intel все операции с плавающей запятой выполняет специальное устройство, FPU (Floating Point Unit), с собственными регистрами и собственным набором команд, поставлявшееся сначала в виде сопроцессора (8087, 80287, 80387, 80487), а начиная с 80486DX — встраивающееся в основной процессор. FPU полностью соответствует стандартам IEEE 754 и (начиная с 80486) IEEE 854.

2.5. Расширение iа ммх

Начиная с модификации процессора Pentium Р54С, все процессоры Intel содержат расширение ММХ, предназначенное для увеличения эффективности программ, работающих с большими потоками данных (обработка изображений, видео, синтез и обработка звука), то есть для всех тех случаев, когда нужно выполнить несложные операции над большими массивами однотипных чисел. ММХ предоставляет несколько новых типов данных, регистров и команд, позволяющих выполнять арифметические и логические операции над несколькими числами одновременно.

3.1 Программа debug

Данный раздел описывает программу DEBUG и способы ее применения.

Программа DEBUG применяется в качестве:

  • удобного средства для тестирования программ. Она DEBUG позволяет отслеживать выполнение пользовательской программы и, кроме того, вводить в эту программу изменения. Поскольку нет необходимости повторной трансляции модифицированной программы, правильность введенных изменений можно проверить, запустив сразу же эту программу.

  • средства, позволяющего загрузить, модифицировать или вывести на экран содержимое произвольного Файла.

  • загрузчика выполняемого файла. Выполняемый файл представляет собой программу записанную в машинном коде.

Запуск программы DEBUG

Программа DEBUG запускается следующей командой:

DEBUG [d:] [путь] [имя_файла[. тип)] [napl] [пар2]

Если команда DEBUG содержит имя_файла, то указанный файл загружается в память и все последующие действия модификации, вывода на экран или запуска будут выполняться именно для этого Файла.

Отсутствие имени файла в команде обозначает, что пользователь работает с Файлом находящимся в памяти, или файл будет загружен в дальнейшем с помощью команд Наше и Load. Затем можно использовать команды модификации, вывода на экран или запуска содержимого памяти-Параметры napl и пар2 представляют собой параметры для загружаемого файла. Например,

DEBUG DISKCOMP.СОM А: В:

В этой команде А: и В: это параметры, которые программа DEBUG передает программе DISKCOMP.

Программа DEBUG устанавливает содержимое регистров и указателей запускаемой программы следующим образом:

  • сегментные регистры (CS, DS,ES и SS) определяют начало свободной памяти в первом сегменте расположенном за программой DEBUG.

  • Указатель команд (IP) содержит 01ООН.

  • Указатель стека (SP) определяет конец сегмента памяти или начало области памяти занимаемой загрузочной программой в зависимости от того, которая из этих величин меньше. Величина сегмента, адрес которой определяется сдвигом 6, уменьшается на 100H, что позволяет создать стек такой же величины.

  • Остальные регистры (АХ, ВХ, СХ, DX, BP,SI, DI} обнулены. После запуска программы DEBUG с указанием файла регистр СХ содержит длину этого Файла (в байтах). В случае, когда длина Файла больше 64К, этот параметр находится в двух регистрах ВХ и СХ (старшие байты в регистре ВХ).

  • Начальное состояние флагов: NV UP El PL HZ NА РО NС

  • Текущий адрес передачи из диска равен 8ОН в кодовом сегменте (CS).

Вся доступная память распределена. Каждая попытка распределить память в загруженной программе завершается неудачей.

Замечания:

1. Если программа DEBUG загружает Файл типа, ЕХЕ, то она выполняет необходимое перемещение и устанавливает регистр сегмента, указатель стека и указатель команд равными величинам указанным в программе. Регистры DS и ES определяют префикс сегмента программы в самом младшем доступном адресном сегменте. Регистры ВХ и СХ содержат размер программы, который меньше размера Файла.

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

2. Если программа DEBUG загружает Файл типа .HEX, то этот Файл считается программой в машинном коде INTEL. Данная программа во время загрузки преобразуется к выполняемому виду.

Команды программы DEBUG

Данный раздел содержит описание всех команд программы DEBUG приведенных в алфавитном порядке. Описание каждой команды содержит формат этой команды и способы ее применения. Иногда приведен пример употребления команды.

Общие сведения о командах программы debug

Нижеприведенные примечания касаются всех команд программы DEBUG:

  • Команда вводится в виде одной буквы, за которой обычно следуют параметры (один или несколько). Команды и их параметры могут вводиться так заглавными, как и строчными буквами, или сочетанием заглавных и строчных букв.

  • Команды и параметры должны быть разделены. Но разделители необходимы лишь между двумя очередными шестнадцатеричными числами. Нижеприведенные команды тождественные:

dcs:100 110

d cs:100 110

d, cs: 100, 110

  • Нажатие клавиш [Ctrl]+[Break] прерывает программу DEBUG.

  • Выполнение команды программы DEBUG начинается после нажатия клавиши [Enter].

  • Нажатие клавиш [Ctrl]+[NumLocK] задерживает вывод данных на экран. Этими клавишами следует пользоваться в случае, когда данных много и они не помещаются на экране. Нажатие любой клавиши возобновляет вывод данных.

  • Программа DEBUG допускает использование управляющих клавиш и других клавиш ДОС описанных во втором разделе руководства программиста.

  • После обнаружения синтаксической ошибки, программа DEBUG выводит на экран ошибочную строку:

d cs:1OO CS:110

^error

В приведенном примере второй адрес в команде Dump должен быть шестнадцатеричным числом определяющим сдвиг. Буква S не является шестнадцатеричным числом и из-за этого возникла ошибка.

  • Подсказкой программы DEBUG является тире (—).

A(Assemble)

Команла трансляции

функция: Команда выполняет трансляцию операторов языка macroassembler(непосредственно в памяти).

формат: А[адрес}

Комментарии: Все числа в команде Assemble представлены в шестнадцатеричном виде. Результат трансляции записывается в очередных ячейках памяти, начиная с адреса указанного параметром адрес. Если параметр адрес в команде отсутствует, то оттранслированная программа загружается начиная с адреса CS:O1OO в случае, когда команда Assemble используется впервые, иди в область за последней командой, записанной командой Assemble. После ввода всех подлежащих трансляции строк, следует нажать клавишу [Enter], что позволит возвратиться к подсказке программы DEBUG.

Программа DEBUG сигнализирует возникновение ошибки путем вывода на экран сообщения ^error с текущим адресом трансляции. Синтаксис программы DEBUG соответствует стандартному синтаксису ассемблера 8086/8x86 и 8087, т. е. :

  • все числовые значения являются шестнатцатеричными; их длина с 1 до 4 символов,

  • префиксы должны находиться перед кодом операции, к которой относятся, или в отдельной строке,

  • допустимыми именами сегментов являются следующие имена: CS:, DS:, ES:, SS:,

  • имена операций с последовательностями должны соответствовать длине последовательности. К примеру, MOVSW может пересылать только последовательности слов, MOVSB – последовательности байтов

  • RETF является именем команды удаленного возврата,

  • ассемблер автоматически транслирует короткие, близкие и далекие переходы и вызовы в зависимости от сдвига адреса результата, который определяется префиксами NEAR и FAR.

Пример:

0100:0500 JHP 502 ; 2-х байтовый короткий переход

0100:0502 JMP NEAR 505 ; 3-х байтовый близкий переход

0100:0505 JMP FAR 50A ; 5-ти байтовый далекий переход

Префикс NEAR может быть сокращен до NE. Префикс FAR не сокращается.

• Программа DEBUG не в состоянии отличить, относятся ли аргументы операций к словам или к байтам. В таком случае тип данных должен быть определен префиксами "WORD PTR" или "BYTE PRT", которые могут быть сокращены к "WO" и "BY". Примеры:

NEG BYTE PTR[126]

DEC WO [SI]

• DEBUG не различает, является ли аргумент операции адресом памяти или непосредственньм аргументом. Поэтому принимается, что операнд в квадратных скобках является адресом. Например:

MOV АХ, 21 ; запись значения 21Н в АХ

MOV АХ, [21] ;запись в АХ содержимого ячейки памяти с адресом 21Н

• в программу DEBUG включены еще два псевдооператора. Оператор DB транслирует непосредственно в памяти значение байта. Оператор DW транслирует непосредственно в памяти значение слова.

Примеры:

DB 1,2, 3, 4, "ЭТО ПРИМЕР”

DВ 'ЭТО КАВЫЧКИ: "'

DB "ЭТО АПОСТРОф: '"

DW 1000, 2000, 3000: ", BACH: "

• допускаются все виды косвенной адресации с помощью регистров.

Примеры:

ADD BX, 34[BP+2][S1-1]

POP [BP+DI] PUSH [SI]

• поддерживаются все синонимы кодов операции. Например:

LOOPZ 100

LOOPE 100

JA 200

JNBE 200

Для кодов операции WAIT и FWAIT ассемблера 8087 префиксы должны быть явно указаны. Например:

FWAIT FADD ST,ST(3) ; Эта строка ассемблирует префикс

FWAIT FLD ТВУТЕ PTR [BX] ; Эта строка не ассемблирует

Пример:

С>debug

-а200

08В4:0200 хог ах, ах

08В4:0202 mov [bx],ax

08В4:0204 ret

08В4:0205

С(Compare)

Команда сравнения

функция: Команда сравнивает содержимое двух блоков памяти, формат:

С диапазон адрес

Комментарий: Команда сравнивает содержимое двух блоков памяти; пределы сравнения определяет параметр диапазон. Если команда обнаружит два неравные друг другу байта, то на экран выводится сообщение:

адрес 1 байт1 6айт2 адрес2

где первая часть (адрес1, байт1) определяет место и содержимое рассогласованной ячейки (в области памяти определенной параметром диапазон), вторая часть (байт2, адрес2) относится к байту указанному параметром адрес.

Если начальный адрес параметра диапазон содержит только сдвиг, то команда С принимает по умолчанию сегмент содержащийся в регистре DS. Конечный адрес диапазона следует вводить только вместе со значением сдвига.

Пример: С 100 L20 200

32 байта памяти, начиная с адреса DS:100 сравниваются с 32-мя байтами, заданными по адресу DS:200. L20 это диапазон.

D(Dump)

Команда вывода на экран содержимого памяти

функция: Команда выводит на экран содержимое определенной областипамяти.

формат: D[адрес]

или

D [диапазон]

Примечания: Картина содержимого памяти состоит из двух частей:

  1. Шестнадцатеричная часть. Каждый байт выводится в виде шестнадцатеричного числа.

  2. Часть ASCII. Байты выводятся в виде символов ASCII. Невыводимые символы (ASCII 0 до 31 и 127 до 255) принимают вид точки '. '.

Для экрана шириной 40 символов в строке, каждая выводимая строка представляет собой восемь байтов памяти записанных по адресу, который является кратностью 8.

Если ширина экрана равна 80 символам в строке, то каждая строка экрана содержит адрес (являющийся кратностью 16), за которым следует 16 байтов с данными. Между 8-мым и 9-тым байтами находится дефис.

Замечание: Если начальный адрес выводимой памяти не является кратностью 8 (или 16), то в первой строке будет меньше чем 8 (16) байтов. В этом случае следующая строка будет начинаться с адреса кратного 8 (16).

Команда Dump существует в двух вариантах:

Вариант 1

Этот вариант следует применять для вывода 40Н байтов памяти (40 символов в строке) или 80Н байтов памяти (80 символов в строке),

D адрес

или

D

Начиная с указанного адреса, содержимое памяти выводится на экран. Если параметр адрес в команде отсутствует, то принимается, что начальным адресом является адрес ячейки следующей за последней ячейкой выведенной последней командой D. Т. о. возможен последовательный вывод на экран областей памяти по 40 или 80 байт путем многократного ввода команды D без параметров.

Если команда D используется впервые, то начальным адресом является относительный адрес 100Н в сегменте указанном программой DEBUG в. регистре сегмента.

Замечание: Если параметр команды D содержит только относительный адрес начала в сегменте, то команда использует сегмент определенный регистром DS.

Вариант 2

Команда выводит на экран содержимое памяти из указанного диапазона. Пример:

D диапазон

Замечание: Если команда D содержит только относительный адрес начала в сегменте, то она использует сегмент определенный регистром DS. Конечный адрес следует вводить только как относительный.

Пример: после команды

D cs:100 10C

на экране шириной 40 символов в строке появляются результаты:

04ВА:0100 42 45 52 54 41 20 54 00 BERTA Т.

04ВА:0108 80 42 4F 52 47 BORG

E(Enter)

Команда ввода

функция: Команда Enter работает в двух режимах:

  • Начиная с указанного адреса записывает в память приведенные в списке значения (см. вариант 1).

  • Выводит на экран указанные байты и предоставляет возможность их модификации в последовательном режиме (см.. вариант 2).

формат: Е адрес[список]

Комментарий: Если параметр адрес является относительным адресом в сегменте, то команда будет работать с сегментом указанным в регистре DS.

Существуют два варианта команды Е:

Вариант 1

Е адрес список

Начиная с указанного адреса команда загружает в память указанный список

Пример: команда

Е ds:100 F3 "xyz"8D

загружает в область памяти, ограниченную адресами PS:100 - DS:104, 5 элементов указанного списка.

Вариант 2

Е адрес

Команда выводит на экран адрес и содержимое очередной ячейки памяти, и ждет ввода.

Новое содержание байта данных вводится в виде одной или двух шестнадцатеричных цифр. Затем можно выполнить следующие действия:

1. Нажать клавишу пробел — переход к следующей ячейке памяти и вывод ее содержимого на экран. Теперь можно ввести новое содержание этой ячейки.

Переход к следующей ячейке памяти (текущая остается без изменений) — снова нажать пробел.

2. Нажать тире '-' - возврат к предыдущей ячейке. В новой строке на экран выводится адрес этой ячейки и ее содержимое. Теперь можно ввести новое содержание этой ячейки.

Возврат к предыдущей ячейке памяти без изменения содержания текущей ячейки - нажать клавишу тире.

3. Клавиша Enter завершает работу команды Е.

Замечание: В зависимости от ширины экрана (40 или 80 символов в строке) на экран в одной строке выводится содержимое 4-ех или 8-ми байтов памяти.

Пример: Команда

E cs:100

выведет на экран следующую строку:

04ВА:0100 ЕВ._

Теперь изменим содержимое ячейки памяти 04ВА:100 с ЕВН на 41Н набрав на клавиатуре 41:

04ВА:0100 ЕВ. 41_

Нажав трижды пробел выведем на экран содержимое трех очередных ячеек памяти:

04ВА.0100 EВ. 41 10. 00. ВС. _

Следующая команда изменяет содержимое текущей ячейки памяти с ВСН на 42Н:

04ВА:0100 КВ.41 10. 00. ВС. 42_

Допустим теперь, что необходимо возвратиться и изменить 10H на 6FH. После двухкратного нажатия тире и выполнения замены экран будет выглядеть следующим образом:

04ВА:0100 ЕВ. 41 10. 00. ВС. 42-04ВА:0102 00.-

04ВА:0101 10. 6F_

Нажав клавишу Enter завершаем работу команды Е. На экране появляется подсказка программы DEBUG.

F (FILL)

Команда заполнения памяти

функция; Команда заполняет область памяти определенную параметром диапазон значениями приведенными в параметре список.

формат: F диапазон список

Комментарий: Если параметр список содержит меньше элементов, чем это указано параметром диапазон, то команда F будет выполняться многократно, пока не заполнится указанная область памяти. Если параметр список содержит больше элементов, чем помещается в указанной области памяти, то все лишние элементы игнорируются.

Замечание: параметр диапазон может содержать только начальный адрес. В таком случае команда F выберет сегмент указанный регистром DS.

Пример: F 4ВА:100 L 5 F3 "XYZ" 8D

Заполняется память с адреса 04ВА:100 по адрес 04ВА:104 указанными пятью байтами, следует помнить о том, что в память записываются коды символов ASCII, т.е. ячейки 100-104 Содержат F3 58 59 5А 8D.

G(Go)

Команда выполнения программы

функция: Команда выполняет загруженную программу.

Выполнение программы прекращается после обнаружения команды, адрес которой указан в команде Go (точка останова). На экран выводятся: содержимое регистров, Флагов и очередная команда.

формат: G[=адрес] [адрес 1 [адрес n. . . ) ]

Комментарий: Ecли команда Go не содержит параметра [:адрес] (символ равенства '=' обязателен), то программа начинает выполняться с адреса указанного в регистрах CS и IP. в противном случае программа будет выполняться с адреса CS:=адрес.

Команда Go работает в двух вариантах:

Вариант 1

Этот вариант применяется для выполнения программ, не содержащих точек останова, формат команды:

G [:адрес]

Такой вид команды Go удобно применять для многократного выполнения программы с различным набором входных параметров. (См. описание команды Name). Применяя команду G без параметра адрес следует убедиться в том, что регистры CS и IP содержат правильные адреса.

Вариант 2

В этом варианте, кроме Функций выполняемых вариантом 1 команды G, можно дополнительно указать адреса точек останова в программе, к примеру:

G [;адрес] адрес [адрес ... ]

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

Команда G допускает определение до 1.0 точек останова в программе, приведенных в произвольном порядке. Применение команды Go это очень удобное средство тестирования программ, особенно в случае сложных, разветвляющихся программ.

В точках останова программа DEBUG заменяет коды операция кодом прерывания (СС Hex), следовательно, если программа дойдет до такой точки, то она будет прервана, на экран выводится содержимое регистров и Флагов. Затем восстанавливается правильное содержимое ячеек содержащих коды прерываний, т. е. в эти ячейки загружаются коды операций. Если операция в точке останова не выполнилась, то правильный код операции не восстанавливается.

Замечания:

  1. Появление на экране сообщения "Program terminated normal1у" говорит о том, что программа выполнилась до конца. В таком случае для повторного выполнения этой программы следует ее еще раз загрузить.

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

  3. Указатель стека должен быть доступным и содержать по крайней мере б свободных байтов, необходимых для выполнения команды Go. В противном случае действия системы нельзя предсказать.

  4. Если точка останова будет определена только относительным адресом в сегменте, то команда G использует сегмент указанный регистром cs.

  5. Нельзя указать точки останова в программах записанных в постоянном запоминающем устройстве (ROM BIOS ИЛИ ROM BASIC).

Пример:

Команда G 102 IEF 208

запускает программу с текущей операции, адрес которой находится в CS:IF. Параметр =адрес вообще не используется.

В программе определены три точки останова. Допустим, что программа останавливается во второй, перед выполнением команды находящейся в ячейке CS:1EF. Восстанавливаются правильные коды операций и точки останова удаляются. На экран выводится соответствующее сообщение и команда Go завершает работу.

H(Hexarithmetic)

Команда шестнадцатиричной арифметики

Функция: Команда складывает два шестнадцатеричные числа и затем вычитает второе число из первого.

Полученные результаты: сумма и разность выводятся на экран в одной строке.

формат: Н Число1 число2

Пример: Н 0F 08

  1. 07

Команда выполняет сложение и вычитание чисел 000F и 0008 их сумма равна 0017, разность 0007.

I(Input)

Команда ввода

функция: Команда считывает один байт из указанного порта и выводит его на экран (в шестнадцатеричном виде).

формат: Iадрес_порта

Пример: I 2F8

Из порта с адресом 02F8 считывается один байт (6ВН). Затем прочитанный байт выводиться на экран.

L(Load)

Команда загрузки

Функция: Команда загружает в память указанный файл или сектор;

формат: L [адрес [накопитель сектор1 сектор2]]

Комментарий: Одна команда Load может загрузить до 80 секторов (шестнадцатерично)

Замечание: Если во время чтения с диска появилась ошибка, то программа DEBUG выводит на экран соответствующее сообщение. После нажатия Функциональной клавиши F3 на экране снова появится строка команды LOAD; затем нужно нажать клавишу Enter.

Существуют два варианта команды LOAD:

Вариант 1

Данные прочитанные с диска установленного в указанном накопителе загружаются, начиная с указанного адреса. Пример:

L адрес накопитель сектор1 сектор2

Параметр сектор1 определяет начальный адрес чтения; параметр сектор2 - число считываемых секторов.

Замечание: Если в качестве начального адреса выступает относительный адрес в сегменте, то команда L использует сегмент, указанный регистром CS.

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

L 4BA:100 1 0F 6D

С дискеты установленной в накопителе В данные загружаются в память, начиная с адреса 4ВА:100. Данная команда перепишет 6DH (109) очередных секторов начиная с сектора 0FH (15), т.е. с 16-того сектора на дискете.

Замечание: Этого варианта команды Load нельзя применять в случае, когда указанный накопитель подключен к сети.

M(Move)

Команда передачи содержимого памяти

функция: Команда передает содержимое памяти из области определенной параметром диапазон в область, начало которой определяется параметром адрес

формат: М диапазон адрес

Комментарий: Передача, в которой область считываемых данных частично совпадает с областью записи данных, выполняется правильно. Исходные данные не теряются и не изменяются во время передачи. Замечания :

  1. Если в параметре диапазон в качестве начального адреса выступает относительный адрес в сегменте, то команда М относится к сегменту указанному регистром DS. конечный адрес также должен представлять собой относительный адрес в этом сегменте.

  2. Если параметр адрес является относительным адресом начала, то команда М относится к сегменту указанному регистром DS.

Пример: Команда

М CS:100 110 500

переписывает 17 байтов из области CS:100 - CS:110 в область начинающуюся с адреса DS:500.

N(Name)

Команда наименования файла

функция: Команда Name выполняет две функции:

• Для двух первых файлов образует два контрольных блока файлов (FCB), адреса которых CS:5C и CS:6C. Запуск программы DEBUG с указанием имени Файла образует лишь один контрольный блок файла FCB (адрес блока CS:5C).

Контрольные блоки файлов используются командами Load и Write и, кроме того, передают имена Файлов тестирующим программам.

• Все введенные имена файлов и все параметры запоминаются начиная с адреса CS:8l, в таком же виде, в каком они были введены (вместе с разделителями). Адрес CS:80 содержит число введенных символов. Регистр АХ указывает правильность определений накопителей, находящихся в двух первых описаниях Файлов.

формат: N [d:] [дорожка] имя_файла. [тип]

Примечание: Если программа DEBUG была загружена без указания имени файла, то перед загрузкой Файла командой L необходимо употребить команду Name.

Пример:

DEBUG

-N prog

-L

-

В следующем примере определяются файлы и другие параметры, применяемые в загруженной программе:

DEBUG prog

-N file1 file2

Программа DEBUG загружает программу prog с адреса CS:100 и записывает контрольный блок файла в ячейку с адресом CS:5C. затем команда Name образует контрольные блоки файлов filel и file2, адреса которых соответственно CS:5C и CS:6C. Контрольный блок файла prog записывается заново. Область хранения параметров (с адреса CS:8l) содержит все символы находящиеся за кодом команды N, включая разделители; в ячейке CS:80 записано число этих символов (0С Hex).

0(Output)

Команда вывода

функция: Команда передает байт в указанный выходной порт,

формат: О адрес_порта байт

Пример: Нижеприведенная команда передает значение 4F в выходной порт F8H:

О 2F8 4F

P(Proceed)

Команда возобновления

Функция: применение команды Р во время выполнения подпрограммы, оператора цикла, прерывания и оператора повторения строки прерывает их выполнение при следующей инструкции.

Формат: P[=адрес][значение]

Комментарий: Если во время выполнения подпрограммы, оператора цикла, прерывания и оператора повторения строки, запрашивается команда Proceed, то завершается выполнение текущего оператора и управление передается следующей инструкции, синтаксис команды Proceed такой же, как команды Trace. P0 определяется точно так же, как и ТО.

Пример: Если выполняется следующая программа:

0100 CALL 1000

0103 JC 2000

.

.

.

1000 XOR АХ, АХ

.

.

.

1ХХХ RET

и CS: IP содержит адрес оператора CALL 1000, то нажатие Р вызывает выполнение подпрограммы и передает управление программе DEBUG при инструкции JC

Q (Quit)

Завершение программы DEBUG

функция: Команда завершает программу DEBUG.

формат: Q

Комментарий: Поскольку после выполнения команды Quit рабочий файл не сохраняется в памяти, необходимо командой Write записать этот файл на диск.

Команда Q передает управление командному процессору, который выводит на экран обычную системную подсказку.

Пример:

-Q

А>

R(Register)

Команда операции с регистрами

функция: Команда Register выполняет три функции:

  • Выводит на экран содержимое указанного регистра (в шестнадцатеричном виде) и предоставляет возможность его модификации.

  • Выводит на экран содержимое всех регистров (в шестнадцатерычном виде), содержимое флагов и очередную команду.

  • Выводит на экран и предоставляет возможность изменить содержимое восьми флагов. Содержимое флагов представляется в виде буквенных кодов (две буквы).

формат: R[имя_регистра)

Комментарий: Начиная работу программа DEBUG записывает во все регистры и флаги программы некоторые определенные значения. См. раздел "Запуск программы DEBUG".

Вывод на экран одного регистра

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

АХ ВР SS

ВХ SI CS

СХ DI IP

DX DS PC

SP ES F

Имена IP и PC относятся к указателю команд.

Вывод на экран содержимого одного регистра выполняется следующим образом:

R АХ

Система отвечает:

АХ F1E4

Теперь можете выполнить одно из следующих действий:

  • нажать клавишу Enter оставляя тем самым содержимое регистра,

  • изменить содержимое регистра АХ путем ввода шестнадцатеричного числа, например FFF.

АХ F1E4

:FFF_

После нажатия клавиши Enter в регистр АХ записывается число 0FFF.

Вывод на экран всех регистров и указателей

Команда: R

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

АХ=0Е00 BX=00FF CX=0007 DX=01FF SP=039D ВР=0000 SI=005C DI=0000 DS=04BA ES=04BA SS=04BA CS=04BA IP=011A NV UP DI NG NZ AC РЕ NC 04BA:011A CD21 INT 21

Первые четыре строки указывают содержимое регистров и состояние восьми Флагов (в шестнадцатеричном виде). Последняя строка указывает очередную выполняемую команду в двух видах: шестнадцатеричном и исходном. Эту команду указывает адрес CS:IP.

Замечание: Если ширина экрана 80 символов/строку, то информация выводится следующим образом:

Строка 1 - 8 регистров

Строка 2 - 5 регистров и 8 флагов

Строка 3 — информация о следующей команде

Если монитор работает в режиме 40 символов в строке, экран будет выглядеть следующим образом:

Строка 1-4 регистра

Строка 2-4 регистра

Строка 3-4 регистра

Строка 4-1 регистр и 8 флагов

Строка 5 — информация о следующей команде

Вывод на экран всех флагов

Двухбуквенные коды определяют состояние всех восьми флагов (включено(1) или выключено (О)). флаги выводятся на экран в порядке указанном в нижеприведенной таблице:

Имя флага 1 О

Переполнение (да/нет) OV NV

Направление (возрастание/уменьшение) DN UP

Прерывание (допускается/запрещено) El DI

Знак (отрицательный/положительный) NG PL

Нуль (да/нет) ZS HZ

Дополнительный перенос (да/нет) АС NА

Четность (четность/нечетность) РЕ РО

Перенос (да/нет) CY NС

Команда: R F

выводит на экран состояние всех флагов. Если все флаги находятся в состоянии включено согласно столбцу (1) таблицы, то ответ будет выглядеть следующим образом:

OV VN EI NG ZR АС РЕ CY -_

Сейчас можете выполнить следующие действия:

  • Оставить все флаги без изменений — нажать клавишу Enter.

  • Изменить состояние флагов (одного или нескольких). Изменение флага производится путем ввода соответствующего ему противоположного кода. Эти коды могут быть введены в произвольном порядке с пробелами или без пробелов.

К примеру, нижеприведенная команда изменяет первый, третий, пятый и седьмой флаги:

OV DN EI NG ZR АС РЕ СY – PONZDINV

Следует заметить, что флаги записаны в обратном порядке. После нажатия клавиши Enter все флаги будут изменены. На экране появится подсказка программы DEBUG и система готова к принятию следующей команды. К примеру, пользователь может проверить введены ли правильно новые коды:

R F

В ответе он увидит:

NV DM DI NG NZ AC PO CY -_

Как видно изменились только, коды 1, 3, 5 и 7 флагов; Флаги 2, 4, б и 8 остались без изменений.

Замечание: Команда R F может изменять один флаг только раз.

S(Search)

Команда поиска.

функция: В указанной области памяти команда ищет

последовательность знаков определенную параметром список.

формат: S диапазон список

Комментарий: На экран выводятся адреса всех мест, в которых была обнаружена данная последовательность-Появление подсказки '-' без адреса говорит о том, что указанная последовательность не была обнаружена.

Замечание: Если в качестве начального адреса диапазона выступает только относительный адрес в сегменте, то команда S использует сегмент указанный в регистре DS.

Пример: Допустим, что необходимо найти 41Н в диапазоне CS:100 -CS:110:

S CS:100 110 41

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

О4ВА:0104 04ВА:010D

Следующая команда ищет в таком же диапазоне, как в предыдующем примере последовательность 4-ех байтов:

S CS:100 L 11 41 "АВ" Е

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

Т(Тгасе)

Команда отслеживания

функция: Команда выполняет одну или больше команд, начиная с адреса CS:IP или =адрес, если этот параметр указан (символ равенства ' =' является обязательным). Параметр значение определяет число выполняемых команд; по умолчанию этот параметр принимается равным 1. После выполнения каждой команды, на экран выводится содержимое всех регистров и Флагов в виде, приведенном в описании команды Register

формат: Т[=адрес] [значение]

Комментарий: Если команда Т содержит параметр значение, то выполнение команды сопровождается выдачей на экран содержимого регистров до момента, когда число выполненных команд превысит значение указанное в команде, нажатие клавиш [Ctrl]+[NumLocK] останавливает вывод данных на экран при отслеживании выполнения команд. Возобновление передвижения данных на экране наступит после нажатия любой клавиши.

Замечания:

  1. Команда Trace блокирует аппаратные прерывания до выполнения команды пользователя, затем они разрешаются после завершения прерывания отслеживания, которое выполняется после команды отслеживаемой программы.

  2. Команду TRACE нельзя применять, если отслеживаемый Фрагмент программы меняет содержание маски прерываний в 8259 (порт 20 и 21).

  3. Если отслеживается команда INT3, то точка останова устанавливается по адресу команды INT3.

Пример: После ввода команды Т без параметров выполняется одна (следующая) команда, затем на экран будут выведены состояния регистров и процессора:

Т

Допустим, что регистр IP содержит 011А и по этому адресу записано В40Е (MOV АН,ОЕН). В таком случае экран будет выглядеть следующим образом:

АХ=0Е00 BX=00FF CX=0007 DX=01FF

SP=039D BP=0000 SI=005C DI=0000

DS=04BA ES=04BA SS=04BA CS=04BA

IP=011C NV UP DI NG NZ AC PE NC

04ВА:011С CD21 INT 21

Т. е. , на экране находятся результаты выполнения команды, записанной по адресу О11А и следующая выполняемая команда (команда INT 21 в ячейке 04ВА:011С).

Т 10

Данная команда вызывает выполнение 16 команд, начиная с адреса CS:IP. После выполнения каждой команды, на экран выводится содержимое всех регистров и Флагов. Вывод данных на экран завершается после 1б-той команды. Поскольку данные занимают более чем один экран, следует применять клавиши [Ctrl]+[NumLocK] для останова передвижения данных на экране.

U(Unassemble)

Команда дизассембляции

Функция: Команда выполняет дизассембляцию программы (преобразует содержимое памяти в ассемблерные выражения) и выводит ее на экран в шестнадцатеричном виде. Ниже приведен примерный результат дизассембляции:

04ba:0100 206472 AND [SI*72)N,AH 04bA:0100 FC CLD

04BA:0104 7665 JBE 016B

формат: U[адрес] или U [диапазон)

Комментарий: Число дизассемблируемых байтов зависит от режима работы монитора (40 или 80 символов в строке) и от применяемого варианта команды Unassemble.

Замечания:

  1. Часто оказывается, что число дизассемблируемых (и, следовательно, выводимых на экран) байтов больше заданного числа. Это является результатом того, что операторы имеют различную длину и последний оператор может оказаться длинее чем мы считали.

  2. Перед запуском команды следует убедиться в том, что адреса параметров содержат коды операций допустимы для ассемблера 8x86. Если в команде указан адрес, первый байт которого не содержит первого байта допустимой операции, то на экране появляются неверные результаты.

  3. Если в команде U в качестве начального адреса будет указан только относительный адрес в сегменте, то команда использует сегмент определенный регистром CS.

Существуют два варианта команды Unassemble: Вариант 1

Данный вариант применяется для дизассембляции программ, начальный адрес которых указан или принят по умолчанию. Команда:

U

или

U адрес

дизассемблирует и выводит на экран 16 байтов памяти в случае экрана шириной 40 символов/строку, или 32 байта для экрана шириной 80 символов/строку. Операторы дизассемблируются начиная с указанного адреса. Если параметр адрес в команде отсутствует, то дизассембляция начинается с ячейки находящейся за последней ячейкой употребляемой последней командой U. Таким образом, многократное применение команды U позволяет провести дизассембляцию непрерывной области памяти.

Ecли команда U применяется впервые, то относительным адресом в сегменте является адрес 100Н. Адрес сегмента указан в регистрах сегментов загружаемых программой DEBUG.

Вариант 2

Команда U дизассемблирует программу в указанном диапазоне адресов. Правильный вид команды:

U диапазон

Дизассемблируются все операторы находящиеся в указанном диапазоне, независимо от ширины экрана.

Замечание: В качестве конечного адреса может выступать только относительный адрес в сегменте.

Пример: после команды:

U 04ВА:0100 108

на экране может появиться ответ:

04ВA:0100 206472 AND (SI+72], АН

04ВA:0103 FC CLD

04ВА:0104 7665 JBE 016B

04BA:0106 207370 AND [BP+DJ+70], DH

Такой же ответ появляется после следующих команд:

U 04BA:100 L T

или

U 04BA:100 L 8

или

U 04BA:100 L 9

W(Write)

Команда записи

функция: Переписывает данные из памяти на диск

формат: W [адрес[накопитель сектор счетчик)}

Комментарий: Одной командой Write можно записать до 80н секторов

Программа DEBUG сигнализирует соответствующим сообщением возникновение ошибки во время записи на диск. В таком случае, после нажатия функциональной клавиши F3 на экране появляется строка команды Write Затем клавишей Enter можно повторно запустить команду Write.

Существуют два варианта команды Write: Вариант 1

Этот вариант переписывает на диск данные, начиная с указанного адреса:

W адрес накопитель сектор счетчик где:

адрес определяет начало области переписываемых

данных,

накопитель определяет накопитель, в котором должна быть установлена дискета,

сектор указывает сектор, с которого будут

записываться данные,

счетчик определяет число переписываемых

секторов.

Замечания:

1.Следует обратить особое внимание на правильное определение секторов для записи данных, ошибка в определении секторов вызывает уничтожение их прежнего содержимого.

2.Если начальным адресом диапазона является относительный адрес в сегменте, то команда W использует сегмент указанный регистром CS.

3.Параметры сектор и счетчик вводятся всегда в шестнадцатеричном виде.

4.Вариант 1 неприменим, если выбранный накопитель подключен к сети.

W<Write)

Команда записи

Если необходимо модифицировать файлы типа . ЕХЕ или . HEX, то при условии, что известны адреса изменяемых ячеек можно поступить следующим образом:

1.Системной командой RENAME изменить тип файла.

2.Запуская программу DEBUG или применяя команду L загрузить файл.

3.Ввести все необходимые изменения. Нельзя запускать загруженный файл командой во или командой Trace. Результаты такого запуска невозможно предсказать.

4.Командой Write записать файл обратно на диск.

5.Применяя команду RENAME возвратиться к прежнему имени файла.

Список команд программы DEBUG

Приведенная ниже таблица может использоваться для быстрого просмотра команд программы DEBUG.

Команда

функция

формат

Assemble

Транслирует выражение

А [адрес]

Compare

Сравнивает память

С диапазон адрес

Dump

Выводит на экран содержимое памяти

D [адрес) или

D [диапазон)

Enter

Модифицирует память

E адрес (список)

Fill

Меняет блоки памяти

F диапазон список

Go

Выполняет программу и допускает ее задержку

G [=адрес] [адрес 1

{адрес n... ])

Hexarithmetiс

Шеснадцатеричное сложение и вычитание

Н число 1 число 2

Input

Считывает байт и выводит его на экран

I адрес_порта

Load

Загружает файл иди сектор

L{адрес{накопитель

сектор счeтчик))

Move

Передает блок памяти

M диапазон адрес

Name

Определяет файлы и параметры

N [d:] [дорожка) имя_файла[. тип)

Output

Передает выходной байт

О адрес_порта байт

Proceed

Переход к следующему оператору

P[:адрес][значение]

Quit

Завершает программу DEBUG

Q

Register

выводит на экран имя регистра и флаги

R [имя регистра]

Search

Ищет символы

S диапазон список

Trace

Отслеживание

программы

Т [=адрес]

Unassemble

Дизассембляция программы

U [адрес] или U [диапазон]

Write

Записывает файл или сектор на диск

W [адрес { накопитель, сектор, счетчик}]

Лабораторная работа №1

«Ознакомление с программой разработки и отладки программ на языке

Ассемблера - DEBUG»

Цель работы: изучить команды программы DEBUG при разработке и отладки программ на языке Ассемблера.

Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.

Программное обеспечение: Программа DEBUG.

Краткие теоретические сведения.

  1. Средства разработки программ на языке Ассемблера

  2. Этапы разработки программы на языке Ассемблера

  3. Применение команд программы DEBUG для создания и отладки прикладного программного обеспечения на языке Ассемблера.

Вопросы к защите лабораторной работы.

  1. Ввод программы.

  2. Отладка программы

  3. выполнение программы

  4. Ввод программы.

  5. Вывод программы

  6. Перемещение данных

  7. Сравнение данных

  8. Модификация памяти

  9. Работа с регистрами микропроцессора

Лабораторная работа №2

«Изучение команд пересылки данных»

Цель работы: изучить способы адресации данных микропроцессором i8x86 и применение этих методов при пересылке данных.

Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.

Программное обеспечение: Программа DEBUG

Краткие теоретические сведения.

  1. Методы адресации данных

  2. Команды пересылки данных

Режимы адресации данных

Микропроцессор 8x86 предоставляет Вам множество способов доступа к операндам, с которыми должна работать Ваша программа. Операнды могут содержаться в регистрах, в самих командах, в памяти или в портах ввода-вывода. В рекламных проспектах производителей оборудования утверждается, что микро­процессор 8x86 имеет 24 режима адресации операндов. Пожалуй, так оно и есть, если рассматривать все возможные комбинации. Здесь мы разделяем режимы адресации на семь групп:

1. Регистровая адресация.

2. Непосредственная адресация.

3. Прямая адресация.

4. Косвенная регистровая адресация.

5. Адресация по базе.

6. Прямая адресация с индексированием.

7. Адресация по базе с индексированием.

Микропроцессор выбирает один из семи режимов адресации по значению поля режима команды. Ассемблер присваивает то или иное значение полю режима в зависимости от того, какой вид имеют операнды в исходной программе. Напри­мер, если вы написали

MOV АХ,ВХ

то Ассемблер закодирует оба операнда (АХ и ВХ) для регистровой адресации. Однако если Вы заключили операнд-источник в квадратные скобки:

MOV AХ,[ВХ]

то Ассемблер закодирует операнд-источник для косвенной регистровой адреса­ции.

В табл. 1 приведены форматы операндов языка ассемблера для всех семи режимов адресации, реализуемых микропроцессором 8x86, и для каждого форма­та указано, какой из регистров сегмента используется для вычисления физическо­го адреса. Обратите внимание, что во всех режимах предполагается доступ к сегменту данных (т. е. регистром сегмента служит регистр DS), и только в тех случаях, когда используется регистр ВР, предполагается доступ к сегменту стека (т. е. регистром сегмента служит регистр SS).

Важное замечание: при исполнении команд микропроцессора 8x86, манипулирующих строками, предполагается, что регистр DI указывает на ячейку дополнительного сегмента, а не сегмента данных. Таким образом, в качестве регистра сегмента эти команды используют регистр ES. Все другие команды исполняются по правилам, описанным в табл.1.

Таблица 1. Режимы адресации микропро цессора 8x86

Режим адресации

Формат операнда

Регистр сегмента

Регистровый

регистр

Не используется

Непосредственный

данное

Не используется

Прямой

сдвиг

метка

DS

DS

Косвенный регистровый

[ВХ]

[ВР]

[DI]

[SI]

DS

SS

DS

DS

По базе

[ВХ] + сдвиг

[ВР] + сдвиг

DS

CS

Прямой с индексированием

[DI] + сдвиг

[SS] + сдвиг

DS

DS

По базе с индексированием

[BX][SI] + сдвиг

[ВХ] [DI] + сдвиг

[ВР] |S1] + сдвиг

[ВР] [DI] + сдвиг

DS

DS

SS

SS

Примечания к таблице:

1. Компонент сдвиг при адресации по базе с индексированием необязателен.

2. Операнд регистр может быть любым 8-ми 16-и битовым регистром, кроме регистра IP.

3. Операнд данное может быть 8- или 16-битовым значением константы.

4. Компонент сдвиг может быть 8- или 16-битовым значением смещения со знаком.

Из семи режимов адресации самыми быстрыми являются регистровая и непос­редственная адресации операндов, поскольку в этом случае операционный блок микропроцессора 8x86 извлекает их либо из регистров (при регистровой адреса­ции), либо из конвейера команд (при непосредственной адресации). В других режимах адресация выполняется дольше, потому что интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.

Каждое описание режима адресации, приведенное в данном разделе, сопровож­дается примерами его применения. В большинстве случаев для этого использует­ся команда MOV микропроцессора 8x86.

Регистровая и непосредственная адресация

При регистровой адресации микропроцессор 8x86 извлекает операнд из регистра (или загружает его в регистр). Например, команда

MOV AХ,СХ

копирует 16-битовое содержимое регистра счетчика СХ в аккумулятор АХ. Содер­жимое регистра СХ не изменяется. В данном примере микропроцессор 8x86 ис­пользует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.

Непосредственная адресация позволяет Вам указывать 8- или 16-битовое значение константы в качестве операнда-источника. Эта константа содержится в команде (куда она помещается Ассемблером), а не в регистре или в ячейке памя­ти. Например, команда

MOV СХ,500

загружает значение 500 в регистр СХ, а команда

MOV CL,-30

загружает значение - 30 в регистр CL.

Чтобы избежать трудностей, помните, что допустимые значения для 8-битовых чисел со знаком ограничены диапазоном от -128 (80Н) до 127 (7FH), а допустимые значения 16-битовых чисел со знаком — диапазоном от —32768 (8000Н) до 32767 (7FFFH). Максимальные значения 8-битовых чисел без знака равны соответствен­но 255 (OFFH) и 65535 (OFFFFH).

Расширение знакового бита непосредственных значений

Ассемблер всегда расширяет знак при пересылке непосредственных значений в операнд-приемник. Это означает, что он дублирует старший значащий бит значения источника до тех пор, пока не будут заполнены все 8 или 16 битов операнда-приемника.

Например, операнд-источник нашего первого примера, десятичное число 500, может быть записано в виде 10-битового двоичного значения 0 111 110 100. Когда Ассемблер устанавливает, что Вы требуете загрузить это значение в 16-битовый регистр СХ, то он расширяет его до 16-битового, записав перед ним шесть копий "знакового" бита (со значением 0). Поэтому в регистр СХ попадает двоичное значение 0 000 000 111 110 100. Во втором примере микропроцессор 8x86 загружает в регистр CL 8-битовое двоичное представление 11 100 010 десятичного числа –30.

Режимы адресации памяти

Доступ к ячейкам памяти обеспечивает­ся взаимодействием операционного блока и интерфейса шины микропроцессора 8x86. Когда операционному блоку требуется прочитать или записать значение операнда, находящегося в памяти, он передает значение смещения адреса интер­фейсу шины. Последний добавляет это смещение к содержимому регистра сегмен­та (предварительно дополненному четырьмя нулями) и тем самым получает 20-битовый физический адрес, который и используется для доступа к операнду.

Исполнительный адрес

Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операн­да. Исполнительный адрес показывает, на каком расстоянии (в байтах) располага­ется операнд от начала сегмента, в котором он находится. Будучи 16-битовым числом без знака, исполнительный адрес позволяет получить доступ к операндам, находящимся выше начала сегмента на расстоянии до 65535 (или 64К) байтов.

Время, затрачиваемое операционным блоком на вычисление исполнительного адреса, является одним из основных компонентов общего времени исполнения команды. В зависимости от используемого режима адресации получение исполни­тельного адреса может заключаться всего лишь в извлечении его как составной части команды, но иногда могут потребоваться довольно долгие манипуляции, например сложение извлеченной из команды составляющей с регистром базы и с индексным регистром. Даже если время исполнения не является критичным для Вашей программы, стоит оценивать эти временные факторы в процессе чтения следующих ниже описаний режимов адресации.

Прямая адресация

При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при непосредственной адресации). Микро­процессор 8x86 добавляет этот исполнительный адрес к сдвинутому содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда.

Обычно прямая адресация применяется, если операндом служит метка. Напри­мер, команда

MOV AX,TABLE

загружает содержимое ячейки памяти TABLE в регистр АХ. На рис. 1 показана схема исполнения этой команды. Обратите внимание на то, что против ожидания микропроцессор 8x86 заполняет данные в памяти в обратном порядке. Старший байт слова следует за младшим байтом, а не предшествует ему. Чтобы усвоить это, запомните, что старшая часть (старшие биты) данных располагается в ячейках памяти со старшими адресами.

Рис. 1. Прямая адресация Рис. 2. Косвенная регистровая адресация

Косвенная регистровая адресация

При косвенной регистровой адресации исполнительный адрес операн­да содержится в базовом регистре ВХ, регистре указателя базы ВР или индексном регистре (SI или DI). Косвенные регистровые операнды надо заключать в квадрат­ные скобки, чтобы отличить их от регистровых операндов. Например, команда

MOV AХ,[ВХ]

загружает в регистр АХ содержимое ячейки памяти, адресуемой значением регистра ВХ (рис. 2).

Как поместить смещение адреса в регистр ВХ? Один из методов состоит в применении команды LEA (Загрузить исполнительный адрес). Например, для загрузки слова из ячейки TABLE в регистр АХ можно воспользоваться последова­тельностью команд

LEA BX, TABLE

MOV AХ,[ВХ]

Эти две команды выполняют те же действия, что и одна команда

MOV AX,TABLE

с той лишь разницей, что в первом случае предыдущее содержимое регистра ВХ уничтожается. Если Вам нужен доступ лишь к одной ячейке памяти (в данном случае TABLE), то разумнее воспользоваться одной командой. Однако для досту­па к нескольким ячейкам, начиная с данного базового адреса, гораздо лучше иметь исполнительный адрес в регистре. Почему? Потому что содержимым регист­ра можно манипулировать, не извлекая каждый раз новый адрес.

Адресация по базе

При адресации по базе Ассемблер вычисляет исполнительный адрес с помощью сложения значения сдвига с содержимым регистров ВХ или ВР.

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

Предположим, например, что требуется прочитать с диска учетные записи для ряда работников. При этом каждая запись содержит табельный номер работника, номер отдела, номер группы, возраст, тарифную ставку и т.д. Если номер отдела хранится в пятом и шестом бантах записи, а начальный адрес записи содержится в регистре ВХ, то команда

MOV AХ,[ВХ]+4

загрузит в регистр АХ номер отдела, в котором служит данный работник (рис. 3). (Сдвиг равен 4, а не 5, потому что первый байт записи имеет номер 0.)

Ассемблер позволяет указывать адресуемые по базе операнды тремя разными способами. Следующие команды эквивалентны:

MOV AХ,[ВР]+4 ;3то стандартная форма записи,

MOV AХ,4[ВР] ; но сдвиг можно указать на первом месте

MOV AХ,[ВР+4] ; или внутри скобок

Рис. 3. Адресация по базе Рис. 4. Прямая адресация с индексированием

Прямая адресация с индексированием

При прямой адресации с индексированием исполнительный адрес вычисляется как сумма значений сдвига и индексного регистра (DI или SI). Этот тип адресации удобен для доступа к элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный регистр – на ее элемент.

Например, если B_TABLE — таблица байтов, то последовательность команд

MOV DI,2

MOV AL,В_TABLE[DI]

загрузит третий элемент таблицы в регистр AL.

В таблице слов соседние элементы отстоят друг от друга на два байта, поэтому при работе с ней надо удваивать номер элемента при вычислении значения индек­са. Если TABLE — таблица слов, то для загрузки в регистр АХ ее третьего элемента надо использовать последовательность команд

MOV DI,4

MOV AХ,TABLE[DI]

(рис. 4).

Адресация по базе с индексированием

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

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

Предположим, например, что Ваша ЭВМ следит за шестью предохранительными клапанами на химическом предприятии. Она считывает их состояния каждые полчаса и запоминает в ячейках памяти. За неделю эти считывания образуют массив, состоящий из 336 блоков (48 считываний в течение семи дней) по шесть элементов в каждом, а всего — 2016 значений.

Если начальный адрес массива загружен в регистр ВХ, сдвиг блока (номер считывания, умноженный на 12) - в регистре DI, а номер клапана задан в перемен­ной VALVE, то команда

MOV AX ,VALVE[BX][DI ]

загрузит требуемое считывание состояния клапана в регистр АХ. На рис. 5 изображен процесс извлечения результата третьего считывания (с номером 2) для клапана 4 из массива, у которого смещение в сегменте данных равно 100Н.

Приведем несколько допустимых форматов операндов, адресуемых по базе с индексированием:

MOVE AX,[BX+2+DI]

MOVE AX,[DI+BX+2]

MOVE AX,[BX+2][DI]

MOVE AX,[BX][DI+2]

КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ

Команды пересылки данных осуществляют обмен данными и адреса­ми между регистрами и ячейками памяти или портами ввода-вывода. Эти команды разделены на четыре подгруппы: команды общего назначения, команды ввода-вывода, команды пересылки адреса и команды пересылки флагов.

Команды общего назначения

Основная команда общего назначения MOV (move - переслать) может пересылать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также пересылать непосредственно адресуемое значение в регистр или в ячейку памяти.

Команда MOV имеет следующий формат:

MOV приемник, источник

В ней допустимо большинство из возможных сочетаний операндов.

Приведем несколько примеров:

MOV AX,TABLE ; Пересылка иэ памяти в регистр

MOV TABLE,AX ; и наоборот

MOV ES:[BX],АХ ; Можно заменить используемый регистр сегмента

MOV DS,AХ ; Пересылка между 16-битовыми регистрами

MOV BL.AL ; Пересылка между 8-битовыми регистрами

MOV CL,-30 ; Пересылка константы в регистр

MOV DE5T,25H ; или в память

В команде MOV исключаются следующие сочетания операндов:

1. Вы не можете осуществить непосредственную пересылку данных из одной ячейки памяти в другую. Чтобы выполнить такую пересылку, данные источника надо загрузить в регистр общего назначения, а затем запомнить содержимое этого регистра в приемнике. Например, если POUNDS и WEIGHT - переменные, находя­щиеся в памяти, то для пересылки значения из одной переменной в другую можно воспользоваться командами

MOV AX,POUNDS

MOV WEIGHT,AX

2. Вы не можете загрузить непосредственно адресуемый операнд в регистр сегмента. Как и в случае 1, сначала надо загрузить его в регистр общего назначе­ния. Например, следующие команды загружают номер блока сегмента данных (DATA_SEG) в регистр DS:

MOV HX,DATA_SEG

MOV DS,AX

Подобные команды обычно сопутствуют оператору ASSUME в сегменте команд. Они указывают Ассемблеру, где размещен сегмент данных.

3. Вы не можете непосредственно переслать значение одного регистра сегмента в другой. Делайте подобные пересылки через регистр общего назначения. Напри­мер, чтобы регистр DS указывал на тот же сегмент, что и регистр ES, воспользуй­тесь командами

MOV AX,ES

MOV DS,AX

(Для выполнения этой операции можно воспользоваться командами PUSH и POP, которые будут описаны в следующем разделе.)

4. Вы не можете использовать регистр CS в качестве приемника в команде пересылки.

Команда обмена XCHG

Команда обмена XCHG (exchange - обменять) меняет между собой значения двух регистров или регистра и ячейки памяти. Однако она не может выполнить обмен значений регистров сегмента.

Приведем несколько примеров команд XCHG:

XCHG AX,BX ;Обменять значения двух регистров (слова

XCHG AL,BH ; или байты

XCHG WRD_LOC,DX ;Обменять значения ячейки памяти

ХСНG DL,BYTE_LOC ; и регистра

Команды ввода-вывода

Команды ввода-вывода используются для взаимодействия с перифе­рийными устройствами системы. Они имеют формат

IN аккумулятор, порт

OUT порт, аккумулятор

где аккумулятор – регистр AL при обмене байтами или регистр АХ при обмене словами. Операндом порт может быть десятичное значение от 0 до 255, что позво­ляет адресоваться к 256 устройствам.

В качестве операнда порт можно использовать регистр DX, что позволяет легко изменять номер порта, например при необходимости пересылать одни и те же данные в несколько различных портов.

Приведем несколько примеров команд IN и OUT:

IN AL,200 ;Ввести байт из порта 200

IN AL,PORT_VAL ; или из порта, указанного константой

OUT ЗОН,AХ ; Вывести слово в порт ЗОН

OUT DX,AX ; или в порт, указанный в ОХ

Команды пересылки адреса

Команды пересылки адреса передают не содержимое перемен­ных, а их адреса.

Команда загрузки исполнительного адреса

Команда LEA (load effective address — загрузить исполнительный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначе­ния, регистр указателя или индексный регистр. Она имеет формат

LEA регистр16,память16

где операнд память16 должен иметь атрибут типа WORD.

Операнд память16 в команде LEA может быть индексирован, что дает возможность осуществить гибкую адреса­цию. Например, если регистр DI содержит 5, то команда

LEA BX,TABLE[DI]

загрузит смещение адреса TABLE+5 в регистр ВХ.

Команда загрузки указателя и регистра сегмента данных LDS

Команда LDS (load pointer using DS — загрузить указатель с использо­ванием регистра DS) считывает из памяти 32-битовое двойное слово и. загружает первые 16 битов в заданный регистр, а следующие 16 битов - в регистр сегмента данных DS. Она имеет формат

LDS регистр16,память32

где регистр 16 - любой 16-битовый регистр общего назначения, а память32 — ячейка памяти с атрибутом типа DOUBLEWORD.

Команда загрузки указателя и регистра дополнительного сегмента LES

Команда LES (load pointer using ES - загрузить указатель с использова­нием регистра ES) идентична команде LDS, но загружает номер блока в регистр ES, а не в DS.

Команды помещения флагов в стек PUSHF и извлечения флагов из стека POPF

Эти команды пересылают содержимое регистра флагов в стек и обрат­но. Они в сущности идентичны командам PUSH и POP, но в них не требуется указывать операнд, так как под ним подразумевается регистр флагов.

Как и в случае команд PUSH и POP, команды PUSHF и POPF всегда используют­ся парами. Другими словами, каждой команде PUSHF должна соответствовать исполняемая позже команда POP.