- •Программное управление — основа автоматизации вычислительного процесса
- •2 Состав машинных команд
- •3 Режимы работы компьютеров
- •3.1 Однопрограммные и многопрограммные режимы
- •I.Система прерываний программ в пк
- •3.2 Адресация регистров и ячеек памяти в пк
- •3.3 Относительная адресация
- •II.Стековая адресация
- •3.4 Элементы программирования на языке ассемблер
- •4 Основные компоненты языка ассемблер
- •4.1Алфавит языка
- •4.2 Константы (числа и строки)
- •4.3 Директивы (псевдооператоры)
- •4.4 Модификаторы
- •4.5 Адресация регистров и ячеек памяти в ассемблере
- •4.6 Непосредственная адресация
- •4.7 Прямая адресация регистров мпп
- •4.8 Адресация ячеек оп
- •Основные команды языка ассемблер
- •A.Команды пересылки данных
- •I.Команды сложения, вычитания и сравнения
- •1.Команды приращения
- •A.Команды умножения
- •I.Команды безусловной передачи данных
- •4.9 Команды перехода к подпрограмме и выхода из подпрограммы
- •4.10 Команда перехода к подпрограмме: call opr
- •4.11 Команда выхода из подпрограммы
- •4.12 Команды условной передачи управления
- •4.13 Команды условной передачи управления для беззнаковых данных
- •4.14 Команды условной передачи управления для знаковых данных
- •4.15 Команды условной передачи управления для прочих проверок
- •4.16 Команды управления циклами
- •4.17 Команды прерывания
- •4.18Основные директивы ассемблера
- •4.19 Директивы определения идентификаторов
- •4.20 Директивы определения данных
- •Директивы определения сегментов и процедур
- •4.21 Директивы управления трансляцией
- •5 Краткие сведения о программировании процедур работы с устройствами ввода-вывода
- •5.1 Программирование работы с дисплеем
- •5.2 Видеооперации с прерыванием 10н bios
- •5.3 Видеооперации с прерыванием 21н dos
- •5.4 Программирование работы с клавиатурой
- •5.5 Программирование работы с принтерами
- •5.6 Печатающие устройства параллельного типа
- •5.7 Печатающее устройство последовательного типа
- •5.8 Программирование работы с файлами
- •5.9 Прерывания, используемые при работе с файлами на дисках
- •5.10 Некоторые аспекты создания исполняемых программ
- •5.11 Процедуры формирования программы
- •5.12 Структура исходной программы на языке ассемблера для получения исполняемой программы .Ехе
- •5.13 Основные сведения о листинге и его структуре
- •5.14 Особенности структуры машинных команд
- •5.14 Последовательность работы пк при выполнении программы
- •6 Краткие сведения об отладчике программ debug
- •6.1 Основные команды отладчика debug
6 Краткие сведения об отладчике программ debug
DEBUG обеспечивает интерактивную отладку программ в формате .ЕХЕ- и .СОМ-файлов. Обычно он используется для отладки исполняемых программ, полученных с языка уровня ассемблера. Он позволяет ассемблировать и исполняемые файлы .ЕХЕ и .СОМ, скомпилированные с языков более высокого уровня.
DEBUG позволяет:
прослеживать выполнение и управлять выполнением программ;
вносить изменения в отлаживаемую программу;
вводить небольшие программы на языке ассемблера, выполнять ассемблирование этих программ и создавать исполняемые программы с расширением .СОМ;
выполнять преобразование машинных шестнадцатеричных кодов команд в формат языка ассемблера (деассемблирование);
отображать текстовые файлы в ASCII и шестнадцатеричном форматах;
просматривать и изменять содержимое регистров памяти МП и ячеек основной памяти;
загружать информацию с дисковых накопителей в основную память, и наоборот (считывать информацию с дисков и записывать на них);
осуществлять поиск конкретных данных в текстах сообщений и программ (с выдачей адреса их хранения);
просматривать регистр флагов с отображением мнемокодов значений этих флагов (табл. 9.2).
Для вызова отладчика DEBUG следует набрать debug и, если необходимо, имена файлов, с которыми мы будем работать, например debug prog.exe. Приглашение к вводу команд – -. После завершения работы с DEBUG для выхода из него следует набрать q. После набора каждой команды следует нажимать Enter.
Таблица 9.2. Используемые отладчиком DEBUG мнемокоды значений флагов
Флаг |
Имя флага |
Установлен |
Сброшен |
OF |
Переполнение (да/нет) |
OV |
NV |
DF |
Направление (уменьш./увелич.) |
DN |
UP |
IF |
Прерывания (вкл./откл.) |
EI |
DI |
SF |
Знак (отриц./полож.) |
NG |
PL |
ZF |
Нуль (да/нет) |
ZR |
NZ |
AF |
Вспомогательный перенос (да/нет) |
АС |
NA |
PF |
Четность (четн./нечетн.) |
РЕ |
PO |
CF |
Перенос (да/нет) |
SY |
NC |
6.1 Основные команды отладчика debug
Отладчик DEBUG выполняет команды:
N (name) — объявление имени файла.
R m (register) — отображение на экране дисплея содержимого регистра памяти МП с именем т. Если т не указано, отображается содержимое всех регистров памяти МП, вектор-адрес следующей команды (CS: IP), машинный и мнемокоды этой команды; например:
-R
АХ=0005 ВХ=0005 СХ-0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC 1A8E:010A B81500 MOV AX,0015 ;
Если выводится содержимое одного регистра, то команда R позволяет изменить его содержимое:
-R ах АХ 0005 :45 -R ах АХ 0045
A n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — начальный вектор-адрес машинных команд.
Пример ввода программы:
-А 100
1А8Е:0100 mov ax,15
1А8Е:0103 mov bx,5
1А8Е.-0106 add ax.bx
1A8E:0108 div bx
1A8E:010A
U nl. n2 Ll (unassemble:*) — преобразование машинных кодов команд в команды на языке ассемблера и отображение их на экране дисплея, nl — вектор-адрес 1-й, а п2 — смещение последней из машинных команд, подлежащих деассемблиро-ванию, 1 — длина программы (может указываться либо п2, либо L1). Пример деассемблирования программы:
-U100 1а
1А8Е:0100 В81500 MOV АХ.0015
1А8Е:0103 ВВ0500 MOV BX.0005 1А8Е:0106 01D8 ADD AX.BX 1А8Е:0108 F7F3 DIV ВХ
Т k (trassing) — выполнение очередных k команд программы. Если k не указано, то выполняется одна команда (пошаговое выполнение программы). Команды обращения к процедурам и внутренние прерывания командой Т не выполняются, так как по Т будут последовательно выполняться команды процедуры и команды обработки прерывания соответственно. В этих случаях следует использовать команду процедурной трассировки Р (procedure), почти аналогичную команде Т, но позволяющую автоматически полностью выполнять встречающиеся при трассировке процедуры, или команду G п. После выполнения команд (команды) на дисплей выводится:
содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL выводятся в мнемокоде (см. табл. 9.2);
вектор-адрес (CS: IP);
машинный и мнемокоды текущей команды. Пример трассировки программы:
R
АХ=0000 ВХ-0000 СХ=0000 DX=0000 SP=FFEE ВР=0000 51=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP-0100 NV UP El PL NZ NA PO NC
1A8E:0100 B81500 MOV AX,0015
-t
AX=0015 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 51=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0103 NV UP El PL NZ NA PO NC
1A8E:0103 BB0500 MOV BX.0005
-t
AX=0015 BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0106 NV UP El PL NZ NA PO NC
1A8E:0106 01D8 ADD AX.BX
-t
AX=001A BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 51=0000 01=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0108 NV UP El PL NZ NA PO NC
1A8E:0108 F7F3 DIV BX
-t
AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 51=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP El PL NZ NA PO NC
1A8E:010A 48 DEC AX
G n (go) — выполнение .EXE- или .СОМ-программы до команды с вектор-адресом n, при отсутствии n программа выполняется до конца.
После выполнения команд (команды) на дисплей выводится:
содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);
флаги регистра FL в мнемокоде (см. табл. 9.2);
вектор-адрес (CS: IP), машинный и мнемокоды текущей команды. После выполнения программы получим:
-g 10а
АХ=0005 ВХ=0005 СХ=0000 DX=0001 SP-FFEE ВР=0000 51=0000 01=0000 DS=1A8E ES=1A8E SS=1A8E CS-1A8E IP=010A NV UP El PL NZ NA PO NC 1A8E:010A 48 DEC AX
- D n,s LI (dump) — отобразить на экране дисплея содержимое ячеек памяти, начиная с ячейки по вектор-адресу n (по умолчанию n — текущий вектор-адрес + 1 и 1 = 128), то есть, нажав клавиши D и Enter, можно посмотреть следующие 128 ячеек:
-D
1D20:OCOO F7 07 01 007512 2Е С7-06 СВ 98 02 00 ЕВ 09 Е8 ……….и………
1020:0010 96 00 F8 ЕВODF9 ЕВ ОА-50 ВО 03 В4 FF E8 03 0…………..Р……
1D20:OC20 58 F8 СЗ57268В 7F 04-2Е 89 ЗЕ CF 98 26 88 05 X…W&…>….&..
1020:0030 26 88 65 01 502Е Al DE-98 26 89 45 02 58 30 01 &.е.Р.…..&…Е..Х<.
1020:0040 75 ОА26895504 26 89-40 06 ЕВ 5А 30 02 75 06 u..&.U..&..M...Z.<..u.
1020:0050 26 89 55 04 ЕВ50 30 07-74 Е8 30 08 74 Е4 30 06 &..U...P.<..t..<..t..<..
1020:0060 75 06 26 88 5504 ЕВ ЗЕ-ЗС 04 75 OF 2Е Al 08 98 u..&..U……....x...u.
1020:0070 40 26 89 45 0426 80 50-06 ЕВ 2В 26 89 75 04 26 @&..Е..&..]...+&.и.&
Частные случаи:
если L и 1 не указаны, то осуществляется вывод до ячейки, имеющей в том же сегменте смещение S;
если S не указано, то осуществляется вывод 1 ячеек памяти (в частности, D n L1 — одной ячейки памяти с вектор-адресом п);
Примеры:
-О ЗЬ43 13 1А8Е:ЗВ40 60 60 65 -О ЗЬ43 11 1А8Е:ЗВ40 60
• если S и L1 не указаны (есть только D n), то осуществляется вывод 128 ячеек памяти, например:
-О 405
1А8Е:0400 69 60 65-66 69 60 65 66 69 60 65 ilefilefile 1А8Е:0410 66 69 60 65 66 69 60 65-66 69 60 65 66 69 60 65 flieflieflieflie 1A8E:0420 00 44 CD 21 F6 02 80 74-05 F6 02 10 75 05 E8 52 .0.!..,t....u..R
1A8E:0430 FD 80 OB 53 81 03 20 00-03 DA 80 CD 8B 02 80 E4 ...S..-
1A8E:0440 OF Bl 04 8B F2 03 E6 8B-CE Dl E9 4E 4E 8B FE 2B NN..+
1A8E:0450 E8 2B 08 8E C5 8E DB F3-A5 FC 8E DD 07 06 BF 00 . +
1A8E:0460 01 33 F6 AD 95 BA 10 00-EB 2B AD 95 B2 10 EB 35 .3 + 5
1A8E:0470 AD 95 B2 10 EB 36 AD 95-32 10 EB 3B AD 95 B2 10 6 ;....
1A8E:0480 EB 50 AD 95 B2 .]...
Содержимое выводится в шестнадцатеричном коде и в соответствующих символах ASCII (символы расширенного стандарта ASCII выводятся в виде точки (,)).
- Е п ' текст!', ' текст2'... (enter) — изменение содержимого ячеек памяти, начиная с вектор-адреса n; количество ячеек определяется размером указанных в команде текстов, например, по результатам команды -е 200 'pole1, 'файл1, 1 f i I e' выводится информация:
-d 200 1с
1А8Е:0200 70 6F 60 65 Е4 АО А9 АВ-66 69 6С 65 pole...file:
При вводе числовой информации (машинных кодов команд) следует набрать Е n, нажать клавишу Enter и после отображенного байта информации и точки ввести новую информацию (1 байт), например:
-е 300 1А8Е:0300 73.20
Для ввода последующих байтов следует нажать клавишу Space и выполнить ввод очередного байта.
F n L1 ' текст!' (fill) — заполнение блока памяти длиной 1 байт, начиная с вектор-адреса п, однобайтовыми фрагментами текст!: -f 400 120 ' f 11 е',
Результат выполнения команды:
-d 400 130
S n LI "текст" (search) — поиск фрагмента «текст» в поле памяти длиной 1 ячеек с выдачей вектор-адреса ячейки, хранящей искомый текст: -s 200 110 ' f 1'.
Результат команды: 1А8Е: 0208.
W (write) — запись программы на диск; в регистр СХ должна быть предварительно записана длина программы в байтах, в регистр ВХ — нуль, а командой N задано имя файла (N — имя_файла);
L (load) — загрузка файла с диска в ОП, предварительно следует в регистр ВХ записать нуль, в регистр СХ записать длину файла в байтах и объявить его имя командой N; для стандартно оформленных .СОМ- и .ЕХЕ-программ это же можно выполнить, набрав debug имя_файла.
Заметим, что:
