Получение текущих значений даты и времени



Инструкция для получения текущих значений даты и времени – 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!