СП - ЛР 7 (1075965)
Текст из файла
Согласовано: Гапанюк Ю.Е. "__"_____________2010 г. | Утверждаю: Большаков С.А. "__"_____________2010 г. |
Лабораторная работа №7 по курсу
Системное программирование
"Ввод адреса – числа в шестнадцатеричном виде"
6
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-41 | ________________ |
Сидякин А.А. | "03" апреля 2010 г. |
Москва - 2010
__________________________________________________________
Цель лабораторной работы:
Разработать и отладить программу на языке Ассемблер для ввода с клавиатуры четырёхразрядного числа и представления его в шестнадцатеричном и десятичном виде
Исходный текст программы:
; Лабораторная работа №7
;===============================================================================
prgr segment
assume CS:prgr,DS:data ; соответствие сегментных регистров
begin: mov AX,data ; сначала ES будет
mov DS,AX ; соответствовать сегменту data
mov AX,02h
int 10h
; элементы фен-шуя, всякие гритсы и инструкции
mov AH,09h
mov DX,offset fngsh8
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh1
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh2
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh6
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh3
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh7
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh6
int 21h
CALL CLRF
CALL CLRF
mov SI,0 ; это будет следить за максимум 4 символа на ввод
mov BX,0 ; я уже не помню, зачем его обнулять, пусть будет
inpr: CALL inpthex ; процедура ввода чисел построчно и посимвольно
write: cmp AL,27 ; если мы сюда попали после нажатия ESC
je close ; то завершить программу, пойдём в close
mov buf,BX ; скинем полученное число из регистра в слово
push BX
mov AH,40h
mov BX,1
mov CL,4
mov DX,offset inp ; это мы вывели что ввели, в 16-м виде
int 21h
mov AH,02h
mov DL,' ' ; пробел, для фен-шуя
int 21h
push AX ; схоронили всё, что можно
push BX ; можно было бы и через pusha,
push CX ; но компейлятор сказал, что мой...
push DX ; ...процессор такую команду не поддерживает
CALL hex2dec ; процiдурка получения 10-го числа
pop DX ; всё подняли, потому что popa и так далее
pop CX
pop BX
pop AX
push SI
mov SI,0
clr: mov inp[SI],32 ; потрём на нули, на всякий, в этой редакции...
inc SI ; уже неактуально, но в предыдущих надо было
loop clr
pop SI
pop BX
mov tmpbuf,BX ; во темповскую строку, но тоже уже неактуально...
CALL CLRF ; ...как в анекдоте про джедая, падавана и солнце
mov SI,0
jmp inpr
close: CALL CLRF
CALL CLRF
mov AH,09h
mov DX,offset msg
int 21h
CALL GETCH
mov AX,02h
int 10h
mov AH,09h
mov DX,offset fngsh4
int 21h
CALL CLRF
mov AH,09h
mov DX,offset fngsh5
int 21h
CALL CLRF
CALL CLRF
CALL GETCH
mov AX,02h
int 10h
mov AX,4C00h
int 21h
er: mov AH,02h
mov DL,' '
int 21h
mov AH,09h
mov DX,offset erro
int 21h
CALL CLRF
mov SI,0
jmp inpr
; ------------------------------------------------------------------------------
CLRF proc ; процедура переноса строки и возврата каретки
mov AH,02h
mov DL,10
int 21h
mov DL,13 ; символ возврата каретки
int 21h
RET
CLRF endp
; ------------------------------------------------------------------------------
GETCH proc ; процедура ввода символа
mov AH,01h
int 21h
RET
GETCH endp
; ------------------------------------------------------------------------------
hex2dec proc
; делим шестнадцатеричного на 10 до упора
mov CX,0 ; количество цифр в десятичном числе
xor AX,AX ; на всякий...
xor BX,BX ; ...случай обнуляем...
xor DX,DX ; ...содержимое регистров
mov AX,buf ; в AX исходное шестнадцатеричное слово
mov BX,10 ; основание системы счисления
dvsn: div BX ; делим AX на BX, результат в AX, остаток в DX
push DX ; скинули остаток в стек
xor DX,DX ; обнулили DX, иначе повлияет на деление
inc CX ; увеличили счётчик количества цифр в числе
test AX,AX ; если пока ещё делится нацело,
jnz dvsn ; то делим ещё раз
; вывод десятичного числа поциферно
mov AH,02h
ot: pop DX ; подняли первую цифру десятичного числа
add DX,'0' ; получили её ASCII-код
int 21h ; вывели на экран
loop ot ; повторять CX раз (по количеству цифр)
RET
hex2dec endp
; ------------------------------------------------------------------------------
inpthex proc
inpt: mov AH,08h ; функция ввода символа без его показа
int 21h
cmp AL,13 ; если это ENTER,
je er1 ; то обломайтунг, введено не 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
mov inp[SI],AL ; а также запишем в массив
inc SI
cmp AL,'9' ; проверим, что это у нас
ja letter ; если код больше кода 9, то буква
sub AL,'0' ; вычтем из кода 48, получим реально цифру
and AX,0Fh ; затрём остальные биты регистра
jmp addd
letter: sub AL,55 ; а из буквы вычитаем 55
and AX,0Fh ; тоже потёрли все остальные биты
addd: mov CL,4 ; умножить на 16,
sal BX,CL ; сдвинуть на 4 бита влево,
or BX,AX ; добавить новую цифру
cmp SI,4
jae done ; если уже 4 введено, то всё,
jmp inpt ; а если нет, то до победного
er1: jmp er ; а это прыжок на обработчик ENTER'а
done: mov AH,09h
mov DX,offset equa ; феншуйная строка
int 21h
fin: RET
inpthex endp
; ------------------------------------------------------------------------------
prgr ends ; конец сегмента команд
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
data segment ; начало сегмента данных
msg db 'Press any key to exit... $'
def db ' - $'
equa db ' = $'
inp db 4 dup (32)
buf dw 0
tmpbuf dw 0
decstr db 4 dup (32)
fname db 'nums.dat',0
handle dw 0
erro db 'be much more attentive, man. You must enter four digits$'
fngsh8 db '__________________________________________$'
fngsh1 db '| This program converts HEX number to DEC |$'
fngsh2 db '| Input HEX number by entering four chars |$'
fngsh3 db 'NOTICE: program takes only HEX-chars$'
fngsh7 db 'if you want to exit, just press ESC$'
fngsh4 db 'Program has finished correctly. There are no other ways$'
fngsh5 db '...because it is made by me, Ivanov Ivan, student of IU5-41$'
fngsh6 db '------------------------------------------------------------$'
data ends ; конец сегмента данных
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
stk segment stack ; начало сегмента стека
db 256 dup (0) ; резервирование 256 байт для стека
stk ends ; конец сегмента стека
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
end begin ; конец текста программы, установка точки входа
;===============================================================================
Листинг программы:
Листинга получилось настолько много и он так сильно съехал по строкам из-за комментариев и табуляций редактора, что приводить его здесь представляется нецелесообразным. Он будет приложен к исполняемому модулю и предъявлен при защите по требованию преподавателя
Результат работы программы:
__________________________________________
| This program converts HEX number to DEC |
| Input HEX number by entering four chars |
--------------------------------------------------------------
NOTICE: program takes only HEX-chars, any others are forbidden
if you want to exit, just press ESC
--------------------------------------------------------------
ABCD = ABCD 43981
1234 = 1234 4660
1111 = 1111 4369
000A = 000A 10
AF be much more attentive, man. You must enter four digits
DDDD = DDDD 56797
FFFF = FFFF 65535
Be much more attentive, man. You must enter four digits
00AC = 00AC 172
Press any key to exit...
Блок-схема программы:
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.