Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sys_Programming / LAB_5

.DOC
Скачиваний:
14
Добавлен:
20.02.2016
Размер:
46.08 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №5

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

Методические указания

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

Вариант №1.

у=(а+в)*с

Проверка:

а

в

с

Ответ

Десятиричн.

Шестнадцатиричн

Число

y_l

(DW)

y_h

(DW)

4

3

2

14

E

000E

0000

250

50

100

30000

7530

7530

0000

250

250

250

125000

1Е848

Е848

0001

Для решения поставленной задачи нам, в первую очередь, необходимо составить таблицу перекодировки (tab1 в листинге 4.1).

Листинг 4.1.

  1. PAGE 60,132

  2. TITLE Лабораторная работа №4

  3. ;Программа преобразования двузначного шестнадцатеричного числа

  4. ;в десятичное представление с использованием команды XLAT

  5. ;Вход: исходное шестнадцатеричное число; вводится с клавиатуры

  6. ;Выход: результат преобразования в регистре AL

  7. ;-------Сегмент данных---------------------

  8. DATASG SEGMENT PARA 'Data'

  9. message DB "Введите две шестнадцатиричные цифры,$"

  10. tab1 DB 30h dup (0),0,1,2,3,4,5,6,7,8,9, 7h dup (0)

  11. DB 0ah,0bh,0ch,0dh,0eh,0fh, 1ah dup (0)

  12. DB 0ah,0bh,0ch,0dh,0eh,0fh, 99h dup (0)

  13. DATASG ENDS ;Конец сегмента данных

  14. ;------------------------Сегмент стека---------------------

  15. STK SEGMENT STACK

  16. DB 256 DUP ('?') ;сегмент стека

  17. STK ENDS ;Конец сегмента стека

  18. ;------------------------Сегмент кода---------------------

  19. CODE SEGMENT PARA PUBLIC 'CODE'

  20. MAIN PROC FAR ;начало процедуры MAIN

  21. ASSUME CS:CODE, DS:DATASG, SS:STK

  22. MOV AX,DATASG ;адрес сегмента данных в регистр АХ

  23. MOV DS,AX ;AX в DS

  24. LEA BX,tab1 ;загрузка адреса строки байт в регистр ВХ

  25. MOV AH,9 ;функция DOS 09h - вывод строки на дисплей

  26. MOV DX,offset message ;адрес выводимой строки

  27. int 21h ;вызов DOS

  28. SUB AX,AX ;очистить регистр АХ

  29. MOV AH,1h ;функция DOS 01h - ввод символа с клавиатуры

  30. int 21h ;вызов DOS: вводим первую цифру в AL

  31. XLAT ;перекодировка первого введенного символа в AL

  32. MOV DL,AL

  33. SHL DL,4 ;сдвиг DL влево для освобождения места для

  34. ;младшей цифры

  35. int 21h ;вызов DOS: ввод второго символа в AL

  36. XLAT ;перекодировка второго введенного символа в AL

  37. ADD AL,DL ;складываем для получения результата

  38. MOV AX,4C00h ;завершение работы программы

  39. int 21h ;вызов DOS

  40. MAIN ENDP ;конец процедуры MAIN

  41. CODE ENDS ;конец сегмента кода

END MAIN ;конец программы с точкой входа MAIN

Обсудим этот момент подробнее. Прежде всего нужно определится со значениями тех байтов, которые вы будете изменять. В нашем случае это символы шестнадцатиричных цифр. Поэтому мы конструируем в сегменте данных таблицу, в которой на места байтов, соответствующих символам шестнадцатиричных цифр, помещаем их новые значения, то есть двоичные эквиваленты шестнадцатиричных цифр. Например: для ASCII-кода шестнадцатиричной цифры ‘В’ его значение должно стоять на 66(42h) месте в таблице tab1.

Строки 10-12 листинга 4.1 демонстрируют, как это сделать. Байты этой таблицы, смещения которых не совпадают со значениями кодов шестнадцатиричных цифр, нулевые. Действительно, до 30h (48) ASCII-кодов нет (см. табл.4.1) и у нас стоят нули (30h dup (0)). Следует учесть, что до 30h (48) номера таблицы именно 48 нолей, так как нумерация начинается с 0. Дальше от 30h до 39h идут шестнадцатиричные цифры 0 .. 9. Затем до 41h символов нет. Это составляет: 41h - 39h = 7h=7D нулей. Далее от 41h до 46h идут большие буквы от ‘А’ до ‘F’. Далее 61h - 41h = 1Ah=26 нулей и от 61h до 66h малые буквы от ‘a’ до ‘f’. И большие и маленькие буквы имеют одно и то же двоичное значение (например, ‘A’ и ‘a’ имеют одно и то же значение 0ah = 0000 1010). Желательно определить все 256 байт таблицы. Дело в том, что если мы ошибочно поместим в AL код символа, отличный от символа шестнадцатиричной цифры, то после выполнения команды XLAT получим непредсказуемый результат. В случае листинга 4.1 это будет ноль, что не совсем корректно, так как непонятно, что же в действительности было в AL: код символа «0» или что-то другое. Поэтому, наверное, есть смысл здесь поставить «защиту от дурака», поместив в неиспользуемые байты таблицы какой-нибудь определенный символ (например ?). После каждого выполнения XLAT нужно просто будет контролировать значение в AL на предмет совпадения с этим символом, и если оно произошло, выдавать сообщение об ошибке.

После того как таблица составлена, с ней можно работать. В сегменте команд, после обычной процедуры загрузки адреса сегмента данных в регистр DS (строки 22-23), командой LEA загружаем адрес таблицы в регистр ВХ (<24>). Просмотрите это в отладчике с помощью окна Watches и дампа распределения памяти Dump. Далее, в строках 25-27 выводим на экран приглашение к вводу шестнадцатеричных цифр. Для этого в регистр AH помещаем номер функции DOS 9 (09h-вывод строки символов на дисплей), в регистр DX адрес строки message и вызываем прерывание 21h. Очищаем регистр АХ и помещаем в АН номер функции 01h (ввод символа с клавиаторы) и прерывание 21h. После выполнения функции 01h в регистре AL будет введеный символ (проверьте это с помощью отладчика). Команда XLAT по номеру ВХ+AL определит в таблице двоичное значение первого введенного символа. Он будет иметь вид 0nh (или 0000 nnnn в двоичном виде, т.е. старший полубайт будет равен нулю). Младший полубайт необходимо где-то запомнить. Для этого мы пересылаем его в регистр DL (<32>) и сдвигаем на 4 разряда влево (<33>), подготавливая место для следующей цифры. В DL будет (nnnn 0000). Далее вызываем 21h (<35>) для ввода второго символа в AL (в АН по-прежнему находится 1h). После XLAT (<36>) в AL будет (0000 mmmm). Складывая AL и DL, получим в AL окончательный результат (nnnn mmmm). Его можно посмотреть при помощи отладчика.

Для закрепления знаний и исследования трудных моментов выполните программу из листинга 4.1 под управлением отладчика.

Соседние файлы в папке Sys_Programming