СП - ЛР 8 (1075968)
Текст из файла
Согласовано: Гапанюк Ю.Е. "__"_____________2010 г. | Утверждаю: Большаков С.А. "__"_____________2010 г. |
Лабораторная работа №8 по курсу
Системное программирование
"Вывод дампа памяти по введённому адресу"
8
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-41 | ________________ |
Сидякин А.А. | "05" апреля 2010 г. |
Москва - 2010
__________________________________________________________
Цель лабораторной работы:
Разработать и отладить программу на языке Ассемблер для вывода на экран дампа памяти по введённому адресу
Исходный текст программы:
; Лабораторная работа №8
;===============================================================================
prgr segment
assume CS:prgr,DS:data ; соответствие сегментных регистров
begin: mov AX,data
mov DS,AX
; очистка экрана
mov AX,02h
int 10h
; приветственное слово
mov AH,09h
mov DX,offset fengsh1
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fengsh0
int 21h
CALL CLRF
; вывод на экран регистра CS
mov AH,09h
mov DX,offset regCS
int 21h
mov AX,CS
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра DS
mov AH,09h
mov DX,offset regDS
int 21h
mov AX,DS
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра SS
mov AH,09h
mov DX,offset regSS
int 21h
mov AX,SS
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра ES
mov AH,09h
mov DX,offset regES
int 21h
mov AX,ES
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра SP
mov AH,09h
mov DX,offset regSP
int 21h
mov AX,SP
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра SI
mov AH,09h
mov DX,offset regSI
int 21h
mov AX,SI
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра DI
mov AH,09h
mov DX,offset regDI
int 21h
mov AX,DI
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
CALL CLRF
; вывод на экран регистра BP
mov AH,09h
mov DX,offset regBP
int 21h
mov AX,BP
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
; нажмите клавишу для продолжения
CALL CLRF
CALL CLRF
mov AH,09h
mov DX,offset msg2
int 21h
mov AH,08h
int 21h
xor AX,AX
; очистили экран, выдали инфу, вводим адрес
mov AX,02h
int 10h
mov AH,09h
mov DX,offset fengsh2
int 21h
xor BX,BX
mov SI,0
CALL inpthex ; процедура ввода адреса
cmp AL,27 ; если мы сюда попали после нажатия ESC
je close ; то завершить программу, пойдём в close
mov sg,BX ; схоронили в переменную сегмент
mov AH,02h
mov DL,58
int 21h
xor BX,BX
mov SI,0
CALL inpthex
cmp AL,27
je close
mov adr,BX ; схоронили в переменную смещение по сегменту
CALL CLRF
CALL CLRF
mov AX,sg ; чтобы указать ES на введённый сегмент
mov ES,AX
mov BX,adr ; возможно, кто-то из них лишний,
mov AX,adr ; но я уже не помню, мысль ушла
push AX
pop AX
sub AX,24 ; потому что потом в цикле будем прибавлять по 24,
; это для вывода в начале каждой строки её адреса
CALL dumping ; процедура вывода дампа по адресу
; тут обработчик нажатия клавиши ESC
close: CALL CLRF
mov AH,09h
mov DX,offset msg
int 21h
CALL GETCH
mov AX,02h
int 10h
; завершение программы с кодом ошибки 0
mov AX,4C00h
int 21h
; ------------------------------------------------------------------------------
hex2hex proc
; для получения кодов одного байта
mov CX,0
mov BX,16
xor DX,DX
cmp AL,10 ; если там не нули, то есть число больше 16
jae dvsn ; то всё нормально
mov el[1],48 ; иначе впишем ноль и потом всё нормально
div BX
mov CX,1
mov SI,1
jmp z
dvsn: div BX ; делим AX на BX, результат в AX, остаток в DX
push DX ; скинули остаток в стек
xor DX,DX ; обнулили DX, иначе повлияет на деление
inc CX ; увеличили счётчик количества цифр в числе
test AX,AX ; если пока ещё делится нацело,
jnz dvsn ; то делим ещё раз
mov SI,0
ot: pop DX ; подняли первую цифру десятичного числа
z: cmp DL,10
jae letter
add DX,48 ; получили её ASCII-код
jmp nx
letter: add DX,55 ; получили ASCII-код буквы
nx: mov el[SI],DL
inc SI
loop ot ; повторять CX раз (по количеству цифр)
RET
hex2hex endp
; ------------------------------------------------------------------------------
hex4hex proc
; для получения кодов слова
push CX
xor CX,CX
mov CL,12
mov SI,0
ipt: push AX
sar AX,CL
and AX,0Fh
cmp AL,0
jne no
mov hx[SI],48
no: cmp AL,10
jae lr
add AL,48
jmp n
lr: add AL,55
n: mov hx[SI],AL
inc SI
pop AX
sub CL,4
cmp SI,4
jb ipt
pop CX
RET
hex4hex endp
; ------------------------------------------------------------------------------
inpthex proc
; ввод адреса
inpt: mov AH,08h ; функция ввода символа без его показа
int 21h
cmp AL,13 ; если это ENTER,
je inpt ; то обломайтунг, введено не 4 символа, по новой
cmp AL,27 ; если вжали ESC,
je fin ; то на завершение
cmp AL,'0' ; если код введённого символа...
jb inpt ; меньше кода 0, то по новой
cmp AL,'9' ; если код введённого символа...
jbe ok ; меньше или равен коду 9, то ништяк
cmp AL,'F' ; если код введённого символа...
ja inpt ; больше кода F, то по новой
cmp AL,'A' ; если код введённого символа...
jb inpt ; меньше кода A, то по новой
ok: mov AH,02h
mov DL,AL ; засчитаем введённое и покажем
int 21h
cmp AL,'9' ; проверим, что это у нас
ja lttr ; если код больше кода 9, то буква
sub AL,'0' ; вычтем из кода 48, получим реально цифру
and AX,0Fh ; затрём остальные биты регистра
jmp addd
lttr: sub AL,55 ; а из буквы вычитаем 55
and AX,0Fh ; тоже потёрли все остальные биты
addd: mov CL,4 ; умножить на 16,
sal BX,CL ; сдвинуть на 4 бита влево,
or BX,AX ; добавить новую цифру
inc SI
cmp SI,4
jae fin ; если уже 4 введено, то всё,
jmp inpt ; а если нет, то до победного
fin: RET
inpthex endp
; ------------------------------------------------------------------------------
dumping proc
; получение кодов символов по адресу и вывод дампа на экран
mov CX,16
dump: add AX,24
push AX
push BX
push CX
CALL hex4hex
mov AH,40h
mov CX,4
mov BX,1
mov DX,offset hx
int 21h
mov AH,09h
mov DX,offset def
int 21h
pop CX
pop BX
push CX
mov CX,24
dmp: xor AX,AX
push BX
mov AL,ES:BX
push AX
push CX
CALL hex2hex
mov AH,40h
mov BX,1
mov CX,2
mov DX,offset el
int 21h
mov el[0],48 ; fust for на всякий...
mov el[1],48 ; ...занулим переменную
mov AH,02h
mov DL,32
int 21h
pop CX
pop AX
inc AX
pop BX
inc BX
loop dmp
push AX
CALL CLRF
pop AX
pop CX
pop AX
loop dump
dumping endp
; ------------------------------------------------------------------------------
CLRF proc ; процедура переноса строки и возврата каретки
mov AH,02h
mov DL,10
int 21h
mov DL,13 ; символ возврата каретки
int 21h
RET
CLRF endp
; ------------------------------------------------------------------------------
GETCH proc ; процедура ожидания ввода символа
mov AH,08h
int 21h
RET
GETCH endp
; ------------------------------------------------------------------------------
prgr ends ; конец сегмента команд
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
data segment ; начало сегмента данных
msg db 'Press any key to exit... $'
msg2 db 'press any key to continue...$'
el db 2 dup ('0')
hx db 4 dup (32)
sg dw 0
adr dw 0
def db ' - $'
fengsh0 db '-----------------------------------------------------------$'
fengsh1 db 'This program makes dump. It will show contents of registers$'
fengsh2 db 'Now, enter the adress (in HEX, type FAR): $'
fengsh3 db 'Dump of memory from $'
fengsh4 db ' till $'
regCS db 'CS: $'
regDS db 'DS: $'
regSS db 'SS: $'
regES db 'ES: $'
regSP db 'SP: $'
regSI db 'SI: $'
regDI db 'DI: $'
regBP db 'BP: $'
data ends ; конец сегмента данных
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
stk segment stack ; начало сегмента стека
db 256 dup (0) ; резервирование 256 байт для стека
stk ends ; конец сегмента стека
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
end begin ; конец текста программы, установка точки входа
;===============================================================================
Листинг программы:
Листинга получилось настолько много и он так сильно съехал по строкам из-за комментариев и табуляций редактора, что приводить его здесь представляется нецелесообразным. Он будет приложен к исполняемому модулю и предъявлен при защите по требованию преподавателя
Результат работы программы:
This program makes dump of RAM. Now, it will show contents of registers
-----------------------------------------------------------------------
CS: 0703
DS: 072D
SS: 0703
ES: 06F3
SP: 0000
SI: 0004
DI: 0000
BP: 091E
press any key to continue...
Now, enter the adress (in HEX, type FAR): 072D:0000
0000 - 50 72 65 73 73 20 61 6E 79 20 6B 65 79 20 74 6F 20 65 78 69 74 2E 2E 2E
0018 - 20 24 70 72 65 73 73 20 61 6E 79 20 6B 65 79 20 74 6F 20 63 6F 6E 74 69
0030 - 6E 75 65 2E 2E 2E 24 30 30 30 30 33 30 2D 07 00 00 20 2D 20 24 2D 2D 2D
0048 - 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D
0060 - 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D
0078 - 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 24 54 68 69
0090 - 73 20 70 72 6F 67 72 61 6D 20 6D 61 6B 65 73 20 64 75 6D 70 20 6F 66 20
00A8 - 52 41 4D 2E 20 4E 6F 77 2C 20 69 74 20 77 69 6C 6C 20 73 68 6F 77 20 63
00C0 - 6F 6E 74 65 6E 74 73 20 6F 66 20 72 65 67 69 73 74 65 72 73 24 4E 6F 77
00D8 - 2C 20 65 6E 74 65 72 20 74 68 65 20 61 64 72 65 73 73 20 28 69 6E 20 48
00F0 - 45 58 2C 20 74 79 70 65 20 46 41 52 29 3A 20 24 44 75 6D 70 20 6F 66 20
0108 - 6D 65 6D 6F 72 79 20 66 72 6F 6D 20 24 20 74 69 6C 6C 20 24 43 53 3A 20
0120 - 24 44 53 3A 20 24 53 53 3A 20 24 45 53 3A 20 24 53 50 3A 20 24 53 49 3A
0138 - 20 24 44 49 3A 20 24 42 50 3A 20 24 00 00 00 00 00 00 00 00 00 00 00 00
0150 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0168 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Press any key to exit...
Блок-схема программы:
Блок-схема и вовсе грозит растянуться на три с лишним листа – неблагодарный труд и не несущее смысла занятие, я прекрасно ориентируюсь в своих программах и не нуждаюсь в визуальных моделях составленных мною же алгоритмов. К тому же, данная лабораторная работа основана на предыдущей, седьмой, чуть менее, чем полностью, и потому по ключевым моментам программы подходит блок-схема из седьмой лабораторной работы. Экономим бумагу – спасаем деревья; экономим время – больше остаётся на полезные дела (и последующие задания в том числе)
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.