Отладчик
Отладчик Periscopе является удобным средством отладки программно-
го кода. Он полностью написан на языке ассемблера поэтому обладает
большим быстродействием. В нем имеется возможность использования при отладке символических
имен (имен из программы ) вместо адресов. Для некоторых компиляторов
выводятся также номера строк исходного кода и сам исходный код. Для обеспечения надежной работы при отладке программ Periscope
обладает средствами защиты от сбоев: - На входе сохраняются вектора BIOS, используемые Periscope. С целью обеспечить надежность Periscope затем изменяет эти прерывания, устанавливая значения, записанные в ПЗУ. На выходе из Periscope программные вектора восста- навливаются. - Periscope использует прерывания BIOS для всех функций, кроме функций, связанных с файлами, поэтому Periscope не мо- жет вызвать DOS, если DOS уже активна. Использование BIOS позволяет вам трассировать DOS. - Переключатель прерывания действует даже в том случае, когда прерывания заблокированы. Активные прерывания от тайме- ра и клавиатуры обнаруживаются и обрабатываются Peris- cope. При необходимости клавиатура также сбрасывается. - Если это возможно, Periscope восстанавливает состояние сис- темы так, чтобы это не повлияло на прерванную програм- му. Исходный буфер клавиатуры и управляющие буфера CRT сохраняются на входе в Periscope и восстанавливаются на выходе.
При работе с Periscope предоставляются следующие возможности: - Определять окна для информации о Данных, Регистрах, Стеке и(или) результате Дисассемблирования. Вы в любой момент можете выбрать размер окон и содержание отображаемой информации. Можно определить до 4 окон Данных! - Отобразить память в форматах ASCII, байта, целого, целого со знаком, слова, двойного слова, короткого вещественного, длинного вещественного и ASCIIZ. - Отобразить блок памяти по отдельным полям записи. Например, можно отобразить Префикс Программного Сегмента так, что каждое поле будет помечено и будет расположено на от- дельной строке. Вы можете определить записи так, как это Вам нужно. - Просмотреть текстовый файл из Periscope. - В интерактивном режиме добавлять и изменять определения имен.
В лабораторной работе были использованы следующие команды Periscope: \D Синтаксис: D [] Использование: Отображает блок памяти в текущем формате вывода. Пример: 'D 100' отображает память, начиная со смещения 100H. \DA Синтаксис: DA [] Использование: Отображает блок памяти в ASCII. Пример: 'DA FILE' отображает имя FILE в ASCII. \J Синтаксис: J Использование: Выполняет до следующей команды на том же уровне. Пример: 'J' выполняет текущую команду и возвращает управление следующей команде. \JN Синтаксис: JN Использование: Переход к следующей команде без замены изобра- жения на экране. Пример: 'JN' выполняет текущую команду без замены изображения на экране. \T Синтаксис: T [] Использование: Трассирует выполнение текущей программы по одной команде. Пример: 'T 5' трассирует 5 команд. МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РФ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ ( технический университет ) к а ф е д р а ЭВА О Т Ч Е Т по лабораторной работе " Отладчик Periscope " дисциплина: Cистемное ПО ПЭВМ Выполнили студенты группы С-45 Преподаватель: Зарудный Д. И. Москва 1998 г.
Программа ERROR.ASM
Сначала вводится десятичное число, затем
программа
его должна вывести на экран.
Работает только для однозначных чисел.
=========================================
MODEL
TINY
.CODE
org
100h
print
macro str
mov ah,9
lea dx,str
int 21h
endm
start:
push cs
pop ds
print mes1
call inint
call outint
konets:
mov ax,4c00h
int 21h
outint
proc near
push cx
push dx
push ax
push bx
xor cx,cx
mov bx,10
xor dx,dx
del: div bx
inc cx
push dx
cmp ax,0
jne del
mov ah,2
vvv: pop dx
add dl,30h
int 21h
loop vvv
pop bx
pop ax
pop dx
pop cx
ret
outint
endp
inint proc near
push bx
push dx
xor dx,dx
xor ax,ax
fgh: push ax
mov ah,1
int 21h
cmp al,13
je jkl
sub al,30h
mov dl,al
mov bx,10
pop ax
push dx
mul bx
cmp dx,0
jne error
pop dx
add ax,dx
jmp fgh
jkl: print nline
pop ax
pop dx
pop bx
ret
error:
print errs
mov ax,4c01h
int 21h
inint
endp
mes1 db
'Введите число: $'
nline
db 13,10,'$'
errs db
'error?$'
END
start
=========================================
Исправленный вариант программы. Выводит
числа правильно.
=========================================
model
tiny
.code
org 100h
begin:
push cs
pop ds
print
macro str
mov ah,9
lea dx,str
int 21h
endm
print mes1
call inint
call outint
konets:
mov ax,4c00h
int 21h
outint
proc near
push cx
push dx
push ax
push bx
xor cx,cx
mov bx,10
del: ;<<<<--- Обнуляем DX
перед делением AX на BX
xor dx,dx ;<<<<---
Иначе будет делиться DX:AX на BX
div
bx
inc cx
push dx
cmp ax,0
jne del
mov ah,2
vvv: pop dx
add dl,30h
int 21h
loop vvv
pop bx
pop ax
pop dx
pop cx
ret
outint
endp
inint proc near
push bx
push dx
xor dx,dx
xor ax,ax
fgh: push ax
mov ah,1
int 21h
cmp al,13
je jkl
sub al,30h
mov dL,aL
mov bx,10
pop ax
push dx
mul bx
cmp dx,0
jne error
pop dx
add ax,dx
jmp fgh
jkl: print nline
pop ax
pop dx
pop bx
ret
error:
print errs
mov ax,4c01h
int 21h
inint
endp
mes1 db
'Введите число: $'
nline
db 13,10,'$'
errs db
'error?$'
end
begin
==========================================
Программа
OUTSTR.ASM Должна выводить
строку, ограниченную нулём. На практике
зацикливается. Конец строки не определяется.
======================================= assume cs:cod,ds:cod
cod segment org 100h
start: cld mov ah,0eh mov si,offset string
m1: lodsb
je m2 int 10h jmp m1
m2: mov ah,4ch int 21h
string db 'It`s ASCIIZ-string',0
cod ends
m3: end start
======================================== Исправленный
вариант. Команда lodsb не
изменяет флаги, поэтому необходимо ввести проверку
на нулевой символ. Изменения
выделены знаком <<<<
======================================== assume cs:cod,ds:cod
cod segment org 100h
start: cld mov ah,0eh mov si,offset string
m1: lodsb cmp al,0 ; <<<<-- Проверка
на конец строки
jz m2 int 10h jmp m1
m2: mov ah,4ch int 21h
string db 'It`s ASCIIZ-string',0
cod ends
m3: end start
=========================================
Исходная
программа PASSWORD.ASM Спрашивает
пароль, кодирует его командой XOR и затем сравнивает с
зашифрованным паролем в самой программе. Если не
совпадают, то выдаёт строку:"Неверный пароль", если совпадают,
то "Its ASCIIZ-string".
======================================= model
tiny codeseg org
100h
start: jmp
passw
m3: cld mov
si,offset string
m1: lodsb or
al,al jz
m2 int
10h jmp
m1
m2: mov
ah,4Ch int
21h
string
db 13,10,'Its ASCIIZ-string',0 even
passw: lea
dx,p1 mov
ah,9h
m5: int
21h mov
ah,0ah lea
dx,Sizest int
21h mov
cx,6 lea
si,p2
cicl: xor byte
ptr[si],-1 inc
si loop
cicl mov
cx,7 lea
si,realsize lea
di,p3 repe cmpsb jne
m4 mov
ah,0eh jmp
m3
m4: lea
dx,mes mov
ah,9 int
21h mov
ax,4c01h jmp
m5
p1 db 'Введите пароль: $'
sizest db 20
realsize db 0
p2 db '********************'
p3 db 6,'ОИЪНЛЖ'
mes db 13,10,'Неверный пароль$' end
start
======================================= Изменённые
варианты программы. Все изменения
выделены знаком <<<<
Вариант
1:
======================================= model
tiny codeseg org
100h
start: jmp
passw
m3: cld mov
si,offset string
m1: lodsb or
al,al jz
m2 int
10h jmp
m1
m2: mov
ah,4Ch int
21h
string
db 13,10,'Its ASCIIZ-string',0 even
passw: lea
dx,p1 mov
ah,9h
m5: int
21h mov
ah,0ah lea
dx,Sizest int
21h mov
cx,6 lea
si,p2
cicl: xor byte ptr[si],-1 inc
si loop
cicl mov
cx,7 lea
si,realsize lea
di,p3 repe cmpsb
; jne
m4 ;<<<<
Под отладчиком команда jne была nop ;<<<<
заменена на две команды nop nop ;<<<<
Таким образом при любом пароле mov
ah,0eh ; строка выводится jmp
m3
m4: lea
dx,mes mov
ah,9 int
21h mov
ax,4c01h jmp
m5
p1 db 'Введите пароль: $'
sizest db 20
realsize db 0
p2 db '********************'
p3 db 6,'ОИЪНЛЖ'
mes db 13,10,'Неверный пароль$' end
start
=======================================
Вариант
2:
======================================= model
tiny codeseg org
100h
start: jmp
passw
m3: cld mov
si,offset string
m1: lodsb or
al,al jz
m2 int
10h jmp
m1
m2: mov
ah,4Ch int
21h
string
db 13,10,'Its ASCIIZ-string',0 even
passw: lea
dx,p1 mov
ah,9h
m5: int
21h mov
ah,0ah lea
dx,Sizest int
21h mov
cx,6 lea
si,p2
cicl: xor byte
ptr[si],-1 inc
si loop
cicl mov
cx,7 lea
si,p3 ;<<< Изменен
адрес начала введённой строки lea
di,p3 ; Пароль сравнивается сам с
собой repe cmpsb jne
m4 mov
ah,0eh jmp
m3
m4: lea
dx,mes mov
ah,9 int
21h mov
ax,4c01h jmp
m5
p1 db 'Введите пароль: $'
sizest db 20
realsize db 0
p2 db '********************'
p3 db 6,'ОИЪНЛЖ'
mes db 13,10,'Неверный пароль$' end
start
=======================================
Вариант
3:
======================================= model
tiny codeseg org
100h
start: jmp
passw
m3: cld mov
si,offset string
m1: lodsb or
al,al jz
m2 int
10h jmp
m1
m2: mov
ah,4Ch int
21h
string
db 13,10,'Its ASCIIZ-string',0 even
passw: lea
dx,p1 mov
ah,9h
m5: int
21h
; mov
ah,0ah <<<<
; lea
dx,Sizest <<<<
Отключён ввод пароля
; int
21h <<<<
(всё равно не нужен) mov
cx,6 lea
si,p3 ;<<<<
cicl: xor byte
ptr[si],-1 inc
si ;
Расшифровывается пароль из loop
cicl ; программы и
сравнивается сам с собой mov
cx,6 lea
si,p3 ;<<<< lea
di,p3 repe cmpsb jne
m4 mov
ah,0eh jmp
m3
m4: lea
dx,mes mov
ah,9 int
21h mov
ax,4c01h jmp
m5
p1 db 'Пароля не будет!$' ;<<<<
sizest db 20
realsize db 0
p2 db '********************'
p3 db 6,'ОИЪНЛЖ'
mes db 13,10,'Неверный пароль$' end
start
=======================================
Вариант
4:
======================================= model
tiny codeseg org
100h
start: jmp
passw
m3: cld mov
si,offset string
m1: lodsb or
al,al jz
m2 int
10h jmp
m1
m2: mov
ah,4Ch int
21h
string
db 13,10,'Its ASCIIZ-string',0 even
passw: mov
ah,0eh ;<<<< Пароль не
спрашивается jmp
m3 ;<<<<
Сразу выводится строка
m5: int
21h mov
ah,0ah lea
dx,Sizest int
21h mov
cx,6 lea
si,p2
cicl: xor byte
ptr[si],-1 inc
si loop
cicl mov
cx,7 lea
si,realsize lea
di,p3 repe cmpsb jne
m4 mov
ah,0eh jmp
m3
m4: lea
dx,mes mov
ah,9 int
21h mov
ax,4c01h jmp
m5
p1 db 'Введите пароль: $'
sizest db 20
realsize db 0
p2 db '********************'
p3 db 6,'ОИЪНЛЖ'
mes db 13,10,'Неверный пароль$' end
start
=======================================
|