ЛАБОРАТОРНАЯ РАБОТА N 1 Работа с машинными командами и командами ассемблера с помощью отладчика DEBUG
Автор: student | Категория: Технические науки / Информатика и программирование | Просмотров: 5524 | Комментирии: 0 | 15-03-2016 20:45
Скачать: 1.rar [13,21 Kb] (cкачиваний: 70)
 
 
Краткие теоретические сведения

DEBUG.EXE - специальная программа, входящая в состав утилит  MS-DOS, для ввода и пошагового выполнения программ, написанных  на машинном языке или с помощью команд ассемблера. Почему программа называется DEBUG? "Bugs" (дословно "насекомые") в переводе со слэнга программистов означает "ошибки  в программе". В соответствии с компьютерным фольклором термин  "debugging" (дословно "обезжучивание", "обезнасекомливание")  появился в то время, когда перестал работать компьютер Гарвардского университета "Марк I". После долгих поисков техники обнаружили источник своих бед - небольшую моль, попавшую между контактами реле. Они удалили моль и внесли запись в сменный журнал о процессе под названием "debugging", произведенным над "Марком I" 
 Программа DEBUG позволяет: 

1) производить пошаговую отладку программы с просмотром регистров и содержимого оперативной памяти; 
2) производить арифметические действия над шестнадцатиричными числами; 
3) вводить данные в регистры и в ячейки оперативной памяти; 
4) вводить программу в виде машинных кодов, а также в  ассемблерном виде в ячейки оперативной памяти и выполнять ее; 
5) записать введенную программу из оперативной памяти на диск,  т.е. получить исполнимый файл (.COM-файл). 

Запуск программы DEBUG под WinXP:
Пуск-Выполнить-cmd.exe- … в командной строке набрать debug  и нажать ENTER.

Отладчик DEBUG имеет командный интерфейс. Это значит, что при запуске и после выполнения очередной инструкции появляется символ "-", означающий, что программа ждет ввода очередной инструкции. После ввода инструкции нужно нажать символ Enter.  Рассмотрим далее некоторые наиболее часто используемые инструкции DEBUG и их упрощенные форматы: 

1. Q - выход из программы. 
2. ? - получение справки. 
3. H (Hexarithmetic) - шестнадцатиричная арифметика. Если после символа H набрать 2 числа  (размером не более 4 цифр каждое) через пробел, то получим сумму  и разность набранных чисел. 
 4. R [<имя регистра>] - работа с регистрами. Инструкция "R" без параметра позволяет просмотреть содержимое всех регистров, а  также значение флагов и команду, расположенную по смещению 100  в  сегменте кода. Обычно по смещению 0100 находится первая  команда программы.  С помощью инструкции "R <имя регистра>" можно ввести новое значение в один регистр. 
 5. U [<сегментный регистр>:]<смещение> - просмотр ячеек оперативной памяти, начиная с указанного смещения в сегменте, заданном сегментным регистром. 
 6. E [<сегментный регистр>:]<смещение> - запись информации в ячейки оперативной памяти. 
DEBUG может быть использован как интерпретатор, чтобы работать непосредственно с микропроцессором. Можно задавать машинные команды, записывать их в определенное место оперативной памяти, обычно, начиная с 0100 смещения относительно начала кодового сегмента. Затем выполнять пошагово (т.е. по одной команде) либо сразу всю программу.  Так как микропроцессор понимает только двоичные числа (сокращенно можно их записать шестнадцатиричными), то и коды машинных команд записываются в виде шестнадцатиричных чисел, причем команды бывают однобайтовые, двубайтовые, трехбайтовые  и т.д. Например, команда для сложения значений из регистров AX и BX  двубайтовая и имеет машинный код 01D8. А машинная команда записи слова из регистра AX в стек - однобайтовая и имеет код 50.  Инструкция "E <смещение>" при работе распечатывает в  следующей  после ее ввода строке адрес, состоящий из двух чисел, и старое значение байта по этому адресу: 

 <содержимое CS>:<смещение> <значение байта>, 

далее компьютер ожидает ввода нового значения байта.  Для ввода, например двубайтовой машинной команды 01D8 нужно записать 01 в сегмент кода по смещению 100, и D8 - по смещению 101. 

 7. T - запуск программы, находящейся в оперативной памяти по адресу 0100, в пошаговом режиме. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100. 
 8. А <смещение> - ввод машинных команд в ассемблерном виде в сегмент кода. Первую команду программы следует начинать вводить со смещения 0100. Далее система ждет поочередного ввода команд Ассемблера. Для окончания ввода нужно нажать Enter после пустой строки. 
 9. G - запуск программы, находящейся в оперативной памяти по  адресу 0100.  Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100. 
 10. N <имя .сom-файла> - задает имя программы для последующей записи ее на диск либо считывания с диска.  Перед записью предварительно нужно записать 0 в регистр BX, а размер программы (в байтах) - в регистр CX. 
 11. W - запись программы на диск.  После выполнения инструкции "W" на диске в текущей директории  появится файл с расширением .COM - точная копия введенной Вами  в оперативную память программы. Эту программу можно запустить непосредственно из DOS. 
 12. L - загрузка программы с диска в оперативную память. Предварительно имя программы задается с помощью инструкции "N". Для выполнения этой лабораторной работы понадобится несколько команд ассемблера: 

MOV AH,<шестнадцатиричное число> - запись в регистр AH числа  02 для указания системной функции - вывод символа на экран; 

MOV DL,<шестнадцатиричное число> - запись в регистр DL кода  символа; 

INT 21 - основное прерывание DOS (процедура), реализующее много различных функций; номер функции записывается предварительно в регистр AH; для распечатки символа на экране - в регистре AH функция 02, при этом в DL записывают предварительно код символа.

INT 20 - прерывание DOS, осуществляющее выход из программы
(из .COM-программы). 

 Пример. 
 Вывести символ "*" на экран. 

 mov AH, 02 ; системная функция 02 - вывод символа на экран 
 mov DL, 2A ; ASCII-код звездочки 
 int 21h ; прерывание для вывода "*" 
 int 20h ; выход из программы 

 Замечание. 

 Обратите внимание, что при вводе ассемблерных программ в DEBUG числа воспринимаются как шестнадцатиричные (команда 2 в примере). В  дальнейшем при работе в Turbo Assembler для указания, что число шестнадцатиричное, после него записывается буква "h". 

Задание к лабораторной работе.
   
Посмотрите и запишите в протокол содержимое оперативной памяти по абсолютному (физическому) адресу:
·413 (запишите значение слова по этому адресу и соответствующее ему значение размера основной (стандартной) памяти). Объясните результат.
Пример:
-d 0:413 
280 (16)
280 (16) -> 1010000000 (2) 

1010000000 (2) -> 640 (10)

1* 2^9 +0* 2^8 +1* 2^7 +0* 2^6 + 0* 2^5 + 0* 2^4 + 0* 2^3 + 0* 2^2 + 0* 2^1 + 0* 2^0=
=128 + 512 = 640
·FE000h (серийный номер компьютера и информацию о BIOS).
Пример:

Fe000 
-d F000: E000
-d FDFF0:00010
-d Fd00:1000
·FFFF5h (дата BIOS вашего компьютера)
Пример:

-d ffff:5
-d fff0:f5
Найдите сумму и разность 2-х чисел: 1-е число - номер в группе  (переведенное в шестнадцатиричную форму), 2-е - число,  противоположное номеру первой буквы фамилии в алфавите (отрицательное число в дополнительном коде). Сумму и разность переведите вручную в десятичную форму. 
Первое число - (9)
Втрое число - (Буква Д = 1000 0100 (2), отрицательно 0111 1011+1=0111 1100 (2)) в 16-ричной будет (7с)
Пример:

Сумма 9+7с         ==== 0085 ======== 1* 2^7 + 1* 2^2 + 1* 2^0=133
Разность 9-7с         ==== ff8d ======== 65421

  Запишите в регистр AX первое число (из задания 2), а в регистр  BX - второе (из задания 2). Введите в оперативную память в сегмент  кода (смещение 100) машинную команду 01d8. Посмотрите на экране и запишите в протокол ее  ассемблерную форму. Выполните  эту команду, результат переведите в десятичную форму. 
Пример:

предварительно проверили, чтобы в регистре IP (счетчик команд) было число 0100, 
r ax
r bx
e 100
e 101
AX=0085, следовательно машинный код 01d8 означает сложения значений из регистров AX и BX. AX в десят. виде = 128.

 Введите в оперативную память в сегмент кода (смещение 100)  набор команд ассемблера для распечатки символа на экране - первой буквы вашей фамилии. Проверьте программу в  DEBUG. Затем запишите  ее на диск в виде .COM-файла. Чему равен размер программы? Запустите ее на выполнение из DOS. 

Пример:

Вводим a 100, затем 
 mov AH, 02 ; системная функция 02 - вывод символа на экран 
 mov DL, 84 ; ASCII-код буквы "Д" 
 int 21h ; прерывание для вывода "Д" 
 int 20h ;выход из программы.
Вводим g предварительно проверив, чтобы в регистре IP (счетчик команд) было число 0100.
И на экран выводится буква "Д"!
Для последующей записи программы на диск, необходимо задать имя программы
n first.com,
затем предварительно нужно записать 0 в регистр BX, а размер программы (в байтах) - в регистр CX.
r bx 'Enter' 0
r cx 'Enter' 8
W - запись программы на диск. После выполнения инструкции "W" на диске в директории C:\Documents and Settings\Хозяин появился файл с расширением .COM - точная копия введенной  в оперативную память программы. Эту программу можно запустить непосредственно из DOS.
 Просмотрите содержимое регистров микропроцессора до начала выполнения задания 4 и после его завершения и выпишите их в протокол. Какую функцию выполняет  каждый из регистров? 

Пример:

вводим  r. На экран выводится содержимое всех регистров. Разница до выполнения первого упражнения и после - изменяется значение в последней строчке:
до - 1553:0100  add  [bx+si], al
после - 1553:0100  B402                     MOV              AH,02

Десятичная системаДвоичная системаШестнадцатеричная система
000
111
2102
3113
41004
51015
61106
71117
810008
910019
101010А
111011B
121100C
131101D 
141110E
151111F