Получение текущих значений даты и времени
Инструкция для получения текущих значений даты и времени – INT 21H, с кодом функции 2АН. Снова введите в DEBUG команду А 100, а затем - следующие инструкции:
M0V АН,2А <Enter>
INT 21 <Enter>
JMP 100 <Enter>, <Enter>
Введите R для просмотра регистров и Т для выполнения инструкции MOV. После этого введите Р для выполнения подпрограммы обработчика прерываний; выполнение остановится на инструкции JMP. Регистры будут содержать в шестнадцатеричной форме следующую информацию:
AL: день недели, где 0 = воскресенье
СХ: год (например, 07D7H = 2007)
DH: месяц (от 01Н до 0СН)
DL: день месяца (от 01H до 1FH)
Операция для получения текущего времени – INT 21H с кодом функции 2СН. Сначала используйте команду R IP для установки IP в 0100Н, а затем введите следующие команды:
А 100 <Enter>
MOV АН,2С <Enter>
INT 21 <Enter>
JMP 100 <Enter>
Выполните программу так же, как и предыдущую. Операция помещает число часов в СН (в 24-часовом формате, где 00 – полночь), минуты – в CL, секунды – в DH и сотые доли секунды – в DL.
Определение установленного оборудования
В одном из упражнений в начале работы просматривалось содержимое байтов с адресами 410Н и 411H, для определения оборудования, присутствующего в системе. BIOS содержит прерывание, INT 11H, помещающего соответствующую информацию в АХ. Введите команду А 100 в DEBUG и следующие инструкции:
INT 11 <Enter>
JMP 100 <Enter>, <Enter>
Введите R для просмотра регистров и первой инструкции. Эта инструкция, INT 11H, передает управление подпрограмме BIOS, помещающей данные об установленном оборудовании в АХ. Используйте команды Т для наблюдения за последовательным выполнением инструкций BIOS.
|
|
Инструкции, содержащиеся в BIOS вашего компьютера, могут отличаться от приведенных ниже – в зависимости от установленной марки и версии BIOS.
JMP EE53
PUSH DS ; Сохранить адрес из DS в стеке
M0V АХ,0040 ; Получить адрес сегмента,
MOV DS,АХ ; поместить его в DS
MOV АХ,[0010] ; Поместить данные из 40:10 в АХ
POP DS ; Восстановить адрес в DS из стека
IRET ; Вернуться в исходную программу
Последняя команда Т производит выход из BIOS и возвращает управление DEBUG. Если все выполнено правильно, АХ теперь содержит данные об установленном оборудовании. Введите Q для выхода или переходите к следующему примеру (установив IР в 0100Н).
Использование INT для вывода на дисплей
Этот пример, выводящий данные на экран, вводит в употребление несколько новых возможностей. Введите в DEBUG команду А 100, а затем – следующие инструкции:
100 MOV АН,09 <Enter>
102 MOV DX,109 <Enter>
105 INT 21 <Enter>
107 JMP 100 <Enter>
109 DB ‘your name’, ‘$’ <Enter> <Enter>
Две инструкции MOV указывают INT 21H организовать вывод на экран (АН = 09Н) и с какого начального адреса (DX = 109). По смещению 109Н начинается строка, где DB означает "define byte" – "определить байт". Символы, подлежащие выводу, заключены в апострофы ('). За строкой, которую необходимо вывести, следует знак доллара ($), также заключенный в апострофы, указывающий INT на конец вывода.
|
|
Введите R для выполнения просмотра регистров и первой инструкции, две команды Т – для выполнения двух инструкций MOV, и Р – для выполнения INT 21Н, и на экране увидите строку, заключенную в апострофы. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).
Использование INT для ввода с клавиатуры
Этот пример, воспринимающий символы с клавиатуры, также демонстрирует новые возможности. Введите команду DEBUG A 100 и следующие инструкции на Ассемблере:
100 MOV АН,10 <Enter>
102 INT 16 <Enter>
104 JMP 100 <Enter>, <Enter>
Первая инструкция, MOV, указывает код функции, 10Н, задающий использование INT 16H для ввода с клавиатуры. При выполнении инструкций обработчиком с клавиатуры считывается символ и помещается в регистр AL. Введите для просмотра регистров и следующей инструкции, и Т – для выполнения инструкции MOV. Затем введите Р для выполнения INT 16H, после чего система будет ожидать нажатия клавиши. Если вы нажмете клавишу 1, вы увидите, что в AL помещено число З1H(это ASCII-код цифры 1). Введите Т для выполнения инструкции JMP 100, затем еще раз Т – для выполнения MOV АН,10. Когда вы введете Р для выполнения INT 16H, система вновь будет ожидать нажатия клавиши. Если вы нажмете 2, то увидите, что в AL занесено значение 32Н. Можно продолжать ввод до бесконечности, следуя только что описанной процедуре. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).
|
|
Использование оператора PTR
В предыдущих примерах, помещавших данные в регистр, DEBUG мог определить, исходя из типа регистра (AL или АХ, например), сколько байтов необходимо переместить. Приведенная ниже программа помещает непосредственные данные в память. Поскольку инструкция вроде MOV [120],25 не указывает количества байт, для этой цели можно использовать оператор PTR. Вот инструкции программы:
100 MOV AX,[11A]
103 ADD AX,[11C].
107 ADD AX,25
10А MOV [11Е],АХ
10D MOV WORD PTR [120],25
113 MOV BYTE PTR [122],30
118 JMP 100
11A DB 14 23
11C DB 05 00
11E DB 00 00
120 DB 00 00 00
Ниже приведено описание инструкций.
100: Поместить содержимое ячеек памяти 11АН и 11ВН в АХ. Квадратные скобки указывают на то, что операнд - адрес в памяти, а не непосредственное значение.
103: Добавить содержимое ячеек памяти 11СН и 11ВН к АХ.
|
|
107:Добавить непосредственное значение 25Н к АХ.
10А: Поместить содержимое регистра АХ в ячейки памяти с адресами 11EH и11FH.
10D: Поместить непосредственное значение 25Н в ячейки памяти 120Н и 121Н. Оператор WORD PTR, указывает DEBUG, что значение 25Н должно быть помещено в слово в памяти. Если записать данную инструкцию в виде MOV [120],25, DEBUG не смогла бы определить, какая длина выделенного участка памяти подразумевалась, и вывела бы сообщение об ошибке.
113: Поместить непосредственное значение 30Н в ячейку памяти по адресу 122Н. На этот раз используется оператор BYTE PTR для указания длины в 1 байт.
11А: Определить значения байт 14Н и 23Н. DB определяет байты для элементов данных, на которые инструкции (например, первая) ссылаются.
11С, 11Е, и 120: Определить другие значения, используемые в программе.
Для ввода этой программы сначала введите команду DEBUG A 100, а затем последовательно введите все инструкции (но не адреса, с которых начинаются строки). В конце еще раз нажмите клавишу <Enter> для завершения ввода. Для выполнения программы сначала воспользуйтесь командой R для просмотра состояния регистров и первой инструкции, а затем используйте последовательность команд Т. Остановите выполнение, когда дойдете до команды JMP 100 по адресу 118Н. Командой D просмотрите содержимое области памяти программы и убедитесь, что изменилось содержимое АХ (23ЗН) и ячеек памяти с адресами 11EH-11FH (ЗЕ23), 120Н-121Н (2500) и 122Н (30). Введите Т для повторения программы или Q – для выхода.
Порядок выполнения работы
1. Область видеопамяти (Video Display Area) для цветного монитора в текстовом режиме начинается с адреса В800[0]. (а) Используйте команду DEBUG D для просмотра этой области памяти. Заметьте, что за каждым символом в этой области следует байт атрибутов (07Н для черно-белого режима). Используйте дополнительные команды D для просмотра всей области видеопамяти. (б) Используйте команду DEBUG F (Fill – заполнить) для вывода на экран 50 звездочек (символов * – код 2АН). Например, следующая команда заполняет всю видеопамять 4000 (FA0H) сердечками (03) и атрибутами (где 16H соответствует коричневым символам на синем фоне):
F B800:0 LFA0 03 16.
2. Рассмотрим следующие инструкции машинного языка:
В0 1С D0 E0 ВЗ 12 F6 ЕЗ ЕВ F6
Эти инструкции выполняют следующие действия.
(а) помещают 1СН в регистр AL,
(б) смещают регистр AL на один бит влево (эквивалент умножения на 2),
(в) помещают 12Н в регистр BL,
(г) умножают AL на BL.
Используйте команду DEBUG E для ввода этой программы, начиная с адреса CS:100. Затем введите D CS:100 для просмотра введенного кода. После этого введите R и последовательными командами Т выполните программу до достижения инструкции JMP. Каков конечный результат в регистре АХ?
3. Используйте DEBUG для ввода следующей программы в машинных кодах:
Код (с адреса 100Н): А0 00 02 D0 E0 F6 26 01 02 A3 02 02 90
Данные (с адреса 200Н): 1E 16 00 00
Эта программа выполняет следующие действия: (а) помещает значение байта DS:0200H (1E) в регистр AL; (б) сдвигает содержимое AL на один бит влево; (в) умножает AL на байт, содержащийся в ячейке с адресом DS:0201H (16), (г) помещает произведение из АХ в слово, начинающееся с адреса DS:0202H.
Введите команды D для просмотра введенных кода и данных. После этого введите команду R и последовательными командами Т выполните программу до достижения инструкции JMP. Каков конечный результат в регистре АХ? Введите еще одну команду D DS:0200 и посмотрите, в каком виде произведение хранится в памяти.
4. Для пункта 2, введите команды, записывающие программу на диск под именем HEXMULT.COM (см. приложение 1).
5. Используйте команду DEBUG А для ввода следующих инструкций:
MOV DX,2E
ADD DX,IF
SHL DX,01
SUB DX,BA
JMP 100.
Дизассемблируйте эти инструкции и проследите их выполнение вплоть до JMP, и просмотрите значение в регистре DX после выполнения программы.
6. Используйте DEBUG для создания и выполнения программы, выводящей на экран фразу "Coffee Break". Начните с А 100 для ввода инструкций и с А 120 для ввода фразы (не забудьте про ограничитель $).
7. Используйте DEBUG для создания и запуска программы, запоминающей три введенных с клавиатуры символа и выводящей их на экран.
(а) Начните с А 100.
(б) Используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [200].
(в) Опять используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [201].
(г) В третий раз используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [202].
(д) Используйте команду Е 123 '$' для установки ограничителя $ после трех введенных символов.
(е) Наконец, используйте INT 21 для вывода символов.
Требования к отчету
Отчет по лабораторной работе должен содержать:
а) титульный лист;
б) условие задания;
в) текст программ на языке Ассемблера;
г) ответы на контрольные вопросы.
Контрольные вопросы
1. Объясните назначение следующих команд DEBUG: (а) А, (б) U, (в) Р, (г) Т, (д) Q, (e) D, (ж) R, (з) Е.
2. Укажите команды DEBUG, с помощью которых можно сделать следующее.
(а) Просмотреть содержимое всех регистров.
(б) Просмотреть содержимое регистра IP и установить его в 0100Н.
(в) Просмотреть данные, хранящиеся в памяти, начиная со смещения 2ВСН в сегменте данных.
(г) Просмотреть данные, находящиеся в памяти, начиная с ячейки с адресом 3AFH. (Замечание: разделите этот адрес на части, соответствующие сегменту и смещению.)
(д) Дизассемблировать символьный код по адресам от 100Н до 12ВН.
(е) Ввести 24А63ВН в сегмент данных, начиная с адреса 18АН.
3. Укажите машинный код, выполняющий следующие действия: (а) прибавление непосредственного значения 03А8Н к АХ, (б) помещение значения 2СА4Н в регистр АХ.
4. Предположим, введена такая команда DEBUG:
Е CS:100 B8 45 01 05 25 00
Значение 45 на самом деле должно было быть 54. Укажите команду, изменяющую только этот байт, которая исправляет сделанную ошибку.
5. Предположим, что в DEBUG введена следующая команда:
Е CS:100 B8 05 1В 05 00 2С ЕВ F8
(а) Какие три символьных инструкции здесь закодированы? (Первая программа в работе содержит подсказку.)
(б) При исполнении этой программы вы обнаруживаете, что в регистр АХ помещается значение 4705 вместо ожидаемого 0547. В чем состоит ошибка и как ее исправить?
(в) Исправив ошибку, нужно повторно выполнить программу, начиная с первой инструкции. Какие команды DEBUG необходимо использовать?
6. Каково назначение инструкции INT?
ЛАБОРАТОРНАЯ РАБОТА № 2
Дата добавления: 2018-04-04; просмотров: 1027; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!