СП - ЛР 5 (Готовая лаба №5)
Описание файла
Файл "СП - ЛР 5" внутри архива находится в следующих папках: Готовая лаба №5, [СП] ЛР 5. Документ из архива "Готовая лаба №5", который расположен в категории "". Всё это находится в предмете "системное программирование" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "системное программирование" в общих файлах.
Онлайн просмотр документа "СП - ЛР 5"
Текст из документа "СП - ЛР 5"
Согласовано: Гапанюк Ю.Е. "__"_____________2010 г. | Утверждаю: Большаков С.А. "__"_____________2010 г. |
Лабораторная работа №5 по курсу
Системное программирование
"Ввод строки и вывод в машинном формате"
9
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-41 | ________________ |
Сидякин А.А. | "20" марта 2010 г. |
Москва - 2010
__________________________________________________________
Цель лабораторной работы:
Разработать и отладить программу на языке Ассемблер для ввода строки символов с клавиатуры (последовательности символов) и вывода их в шестнадцатеричном представлении (через пробел)
Исходный текст программы:
; Лабораторная работа №5
;===============================================================================
prgr segment ; начало сегмента команд
assume CS:prgr, DS:data ; сегментный регистр CS - сегмент команд
; сегментный регистр DS - сегмент данных
begin: mov AX,data ; адрес сегмента данных сначала загрузить в AX
; так как нельзя загрузить сразу напрямую в DS
mov DS,AX ; теперь из AX загружаем в DS
mov AX,02h ; очистка экрана
int 10h
mov AH,09h ; функция DOS вывода на экран строки
mov DX,offset greet ; адреса строки содержится в DX
int 21h ; прерывание, вызывающее DOS
CALL CLRF
mov AH,09h
mov DX,offset defl
int 21h
CALL CLRF
mov AH,02h ; запись функции DOS вывода символа
mov DL,36 ; запись кода символа новой строки
int 21h
mov AH,09h
mov DX,offset info1
int 21h
CALL CLRF
mov AH,09h
mov DX,offset info2
int 21h
CALL CLRF
CALL CLRF
mov BX,offset hextb ; указатель DS:BX на таблицу для XLAT
inp: mov CX,4 ; максимальная длина вводимой строки
mov SI,3 ; пропускаем 3 символа (пробел, =, пробел)
trsc: CALL GETCH
cmp AL,'$' ; если введено $,
JE enst ; то ввод строки закончен
cmp SI,3 ; если сейчас был введён первый символ,
JE chck ; то пойдём проверять
kego: CALL HEX
inc SI
loop trsc
enst: push BX
mov AH,40h ; функция DOS вывода на экран строки
mov BX,1 ; дескриптор экрана
push CX
dec SI
mov CX,SI ; число выводимых байтов
mov DX,offset line ; адрес строки содержится в DX
int 21h ; прерывание, вызывающее DOS
mov CX,11 ; до конца преобразованной строки
mov SI,3 ; начиная с после пробела после =
clr: mov line[SI],32 ; вписать пробел
inc SI ; следующий элемент строки
loop clr
pop CX
pop BX
mov CX,4 ; предотвращение ошибочного завершения ввода строк
CALL CLRF
loop inp
fin: CALL CLRF
CALL CLRF
mov AH,09h ; функция DOS вывода на экран строки
mov DX,offset msg ; адреса строки содержится в DX
int 21h ; прерывание, вызывающее DOS
CALL GETCH
mov AX,02h ; очистка экрана
int 10h
mov AX,4C00h ; функция DOS 4Ch завершения программы
; код 0 успешного завершения
int 21h
chck: cmp AL,'*' ; если введено *,
JE fin ; то шабаш,
JNE kego ; инче (just 'инче') продолжаем ввод
; ------------------------------------------------------------------------------
GETCH proc ; процедура ввода символа
mov AH,01h ; функция DOS ожидания символа из стандартного ввода
int 21h
RET ; выход из процедуры
GETCH endp
; ------------------------------------------------------------------------------
CLRF proc ; процедура переноса строки и возврата каретки
mov AH,02h ; запись функции DOS вывода символа
mov DL,10 ; запись кода символа новой строки
int 21h
mov AH,02h ; запись функции DOS вывода символа (на всякий)
mov DL,13 ; запись символа возврата каретки
int 21h
RET
CLRF endp
; ------------------------------------------------------------------------------
HEX proc ; процедура перевода из DEC в HEX
push AX
shr AL, 1 ; сдвигаем вправо на 1 разряд
shr AL, 1
shr AL, 1
shr AL, 1
XLAT ; записываем ASCII код в AL
mov line[SI],AL
inc SI ; перейти ко второму элементу массива
pop AX ; восстанавить число
and AL, 00001111b ; маскировка старшей цифры
XLAT ; записать ASCII код в AL
mov line[SI],AL ; поместить это значение во второй элемент массива
inc SI
mov AL,45
mov line[SI],AL
RET
HEX endp
; ------------------------------------------------------------------------------
prgr ends ; конец сегмента команд
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
data segment ; начало сегмента данных
hextb db '0123456789ABCDEF'
hexdgt db 2 dup ('*')
def db ' - $'
line db 14 dup (' = ')
msg db 'Press any key to exit... $'
greet db 'Type any chars, maximum length - 4$'
defl db '----------------------------------$'
info1 db ' - end of string$'
info2 db '* - end of input$'
data ends ; конец сегмента данных
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
stk segment stack ; начало сегмента стека
db 256 dup (0) ; резервирование 256 байт для стека
stk ends ; конец сегмента стека
; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
end begin ; конец текста программы, установка точки входа
;===============================================================================
Листинг программы:
Turbo Assembler Version 2.51 20/03/10 13:40:45 Page 1
lr5.ASM
1 ; Лабораторная работа №5
2
3 0000 prgr segment
4
5 assume CS:prgr, DS:data
6
7 0000 B8 0000s begin: mov AX,data
8
9 0003 8E D8 mov DS,AX
10
11 0005 B8 0002 mov AX,02h
12 0008 CD 10 int 10h
13
14 000A B4 09 mov AH,09h
15 000C BA 005Ar mov DX,offset greet
16 000F CD 21 int 21h
17 0011 E8 00AF CALL CLRF
18 0014 B4 09 mov AH,09h
19 0016 BA 007Dr mov DX,offset defl
20 0019 CD 21 int 21h
21 001B E8 00A5 CALL CLRF
22 001E B4 02 mov AH,02h
23 0020 B2 24 mov DL,36
24 0022 CD 21 int 21h
25 0024 B4 09 mov AH,09h
26 0026 BA 00A0r mov DX,offset info1
27 0029 CD 21 int 21h
28 002B E8 0095 CALL CLRF
29 002E B4 09 mov AH,09h
30 0030 BA 00B1r mov DX,offset info2
31 0033 CD 21 int 21h
32 0035 E8 008B CALL CLRF
33 0038 E8 0088 CALL CLRF
34
35 003B BB 0000r mov BX,offset hextb
36
37
38 003E B9 0004 inp: mov CX,4
39 0041 BE 0003 mov SI,3
40 0044 E8 0057 trsc: CALL GETCH
41 0047 3C 24 cmp AL,'$'
42 0049 74 0B JE enst
43 004B 83 FE 03 cmp SI,3
44 004E 74 48 JE chck
45 0050 E8 007D kego: CALL HEX
46 0053 46 inc SI
47 0054 E2 EE loop trsc
48
49 0056 53 enst: push BX
50 0057 B4 40 mov AH,40h
51 0059 BB 0001 mov BX,1
52 005C 51 push CX
53 005D 4E dec SI
54 005E 8B CE mov CX,SI
55 0060 BA 0016r mov DX,offset line
56 0063 CD 21 int 21h
57
58 0065 B9 000B mov CX,11
59 0068 BE 0003 mov SI,3
60 006B C6 84 0016r 20 90 clr: mov line[SI],32
61 0071 46 inc SI
62 0072 E2 F7 loop clr
63
64 0074 59 pop CX
65 0075 5B pop BX
66 0076 B9 0004 mov CX,4
67 0079 E8 0047 CALL CLRF
68 007C E2 C0 loop inp
69
70 007E E8 0042 fin: CALL CLRF
71 0081 E8 003F CALL CLRF
72 0084 B4 09 mov AH,09h
73 0086 BA 0040r mov DX,offset msg
74 0089 CD 21 int 21h
75 008B E8 0010 CALL GETCH
76
77 008E B8 0002 mov AX,02h
78 0091 CD 10 int 10h
79
80 0093 B8 4C00 mov AX,4C00h
81
82 0096 CD 21 int 21h
83
84 0098 3C 2A chck: cmp AL,'*'
85 009A 74 E2 JE fin
86 009C 75 B2 JNE kego
87
88
89 009E GETCH proc
90 009E B4 01 mov AH,01h
91 00A0 CD 21 int 21h
92 00A2 C3 RET
93 00A3 GETCH endp
94
95
96 00C3 CLRF proc
97 00C3 B4 02 mov AH,02h
98 00C5 B2 0A mov DL,10
99 00C7 CD 21 int 21h
100 00C9 B4 02 mov AH,02h
101 00CB B2 0D mov DL,13
102 00CD CD 21 int 21h
103 00CF C3 RET
104 00D0 CLRF endp
105
106 00D0 HEX proc
107 00D0 50 push AX
108 00D1 D0 E8 shr AL, 1
109 00D3 D0 E8 shr AL, 1
110 00D5 D0 E8 shr AL, 1
111 00D7 D0 E8 shr AL, 1
112 00D9 D7 XLAT
113 00DA 88 84 0016r mov line[SI],AL
114 00DE 46 inc SI
115 00DF 58 pop AX
116 00E0 24 0F and AL, 00001111b
117 00E2 D7 XLAT
118 00E3 88 84 0016r mov line[SI],AL
119 00E7 46 inc SI
120 00E8 B0 2D mov AL,45
121 00EA 88 84 0016r mov line[SI],AL
122 00EE C3 RET
123 00EF HEX endp
124
125 00EF prgr ends
126
127 0000 data segment
128
129 0000 30 31 32 33 34 35 36+ hextb db '0123456789ABCDEF'
130 37 38 39 41 42 43 44+
131 45 46
132 0010 02*(2A) hexdgt db 2 dup ('*')
133 0012 20 2D 20 24 def db ' - $'
134 0016 0E*(20 3D 20) line db 14 dup (' = ')
135 0040 50 72 65 73 73 20 61+ msg db 'Press any key to exit.. $'
136 6E 79 20 6B 65 79 20+
137 74 6F 20 65 78 69 74+
138 2E 2E 2E 20 24
139 005A 54 79 70 65 20 61 6E+ greet db 'Type any chars, maximum 4$'
140 79 20 63 68 61 72 73+
141 2C 20 6D 61 78 69 6D+
142 75 6D 20 6C 65 6E 67+
143 74 68 20 2D 20 34 24
144 007D 2D 2D 2D 2D 2D 2D 2D+ defl db '------------------------$'
145 2D 2D 2D 2D 2D 2D 2D+
146 2D 2D 2D 2D 2D 2D 2D+
147 2D 2D 2D 2D 2D 2D 2D+
148 2D 2D 2D 2D 2D 2D 24
149 00A0 20 2D 20 65 6E 64 20+ info1 db ' – end of string$'
150 6F 66 20 73 74 72 69+
151 6E 67 24
152 00B1 2A 20 2D 20 65 6E 64+ info2 db '* - end of input$'
153 20 6F 66 20 69 6E 70+
154 75 74 24
155
156 00C2 data ends
157
158 0000 stk segment stack
159 0000 0100*(00) db 256 dup (0)
160 0100 stk ends
161
162 end begin
Symbol Name Type Value
??DATE Text "20/03/10"
??FILENAME Text "lr5 "
??TIME Text "13:40:45"
??VERSION Number 0205
@CPU Text 0101H
@CURSEG Text STK
@FILENAME Text LR5
@WORDSIZE Text 2
BEGIN Near PRGR:0000
CHCK Near PRGR:0098
CLR Near PRGR:006B
CLRF Near PRGR:00C3
DEF Byte DATA:0012
DEFL Byte DATA:007D
ENST Near PRGR:0056
FIN Near PRGR:007E
GETCH Near PRGR:009E
GREET Byte DATA:005A
HEX Near PRGR:00D0
HEXDGT Byte DATA:0010
HEXTB Byte DATA:0000
INFO1 Byte DATA:00A0
INFO2 Byte DATA:00B1
INP Near PRGR:003E
KEGO Near PRGR:0050
LINE Byte DATA:0016
MSG Byte DATA:0040
PUTCH Near PRGR:00A3
TRSC Near PRGR:0044
Groups & Segments Bit Size Align Combine Class
DATA 16 00C2 Para none
PRGR 16 00EF Para none
STK 16 0100 Para Stack
Результат работы программы:
Type any chars, maximum length - 4
----------------------------------
$ - end of string
* - end of input
AAaA = 41-41-61-41
ABCD = 41-42-43-44
abcd = 61-62-63-64
asfl = 61-73-66-6C
sd$ = 73-64
dfgg = 64-66-67-67
hee* = 68-65-65-2A
$ =
q$ = 71
f**k = 66-2A-2A-6B
gtyy = 67-74-79-79
*
Press any key to exit...
Блок-схема программы: