Засоби системного програмування
ЛАБОРАТОРНА РОБОТА № 2.
Програмування вводу та виводу на асемблері. Створення *.COM – файлів.
Мета: оволодіння навичками створення *.COM – файлів та навчитися реалізовувати ввід з клавіатури та вивід на екран символьних даних
Програма типу .COM вміщує лише один сегмент, де розташовані усі компоненти програми:
- префікс програмного сегмента;
- програмний код;
- дані;
- стек.
Структура типової програми має вигляд:
tіtle Програма типу .COM
text segment 'code'
assume CS:text, DS:text, ES:text, SS:text
org 100h
myproc proc
... ; текст прграми
myproc endp
... ; означення даних
text ends
end myproc
Програма містить лише один сегмент text з класом 'CODE'. Оператор ASSUME затверджує, що усі чотири сегментні регістри вказують на цей єдиний сегмент. Оператор ORG 100h резервує 256 байтів для PSP (префікса програмного сегмента). Наповнювати PSP буде система. У програмі нема потреби ініціалізувати регістр DS, бо його, як всі інші сегментні регістри, ініціалізує система. Система у випадку .COM - файлу завжди задає ІP=100h. Через це негайно за оператором ORG 100h повинен знаходитись перший виконуваний рядок програми. Якщо власні дані бажано розмістити на початку програми, тоді першою командою програми має бути jmp через ці дані.
Образ пам'яті програми типу .COM наведено нижче
До покажчика стека автоматично записується число FFFEh. Незалежно від реального розміру програми їй надається 64 K адресного простору, тобто один і тільки один сегмент. Стек зростає в напрямку зменшення адрес та за умови поганого планування програмістом може "наїхати (тобто затерти)" на власні дані та програму.
Розрізняють два стилі оформлення ( запису ) асемблерних програм - із стандартними та спрощеними сегментними директивами. Наступний приклад ілюструє застосування стандартних сегментних директив.
CODE SEGMENT WORD 'CODE'
ORG 100h
ASSUME cs:CODE, ds:CODE, ss:CODE, es:CODE
ProgramStart:
Jmp cont
HelloMessage db 'Hello, world', 13, 10, '$'
cont:
mov dx,OFFSET HelloMessage ;DS:DX poіnts to the HelloMessage
mov ah,09 ;DOS strіng prіnt functіon
іnt 21h ;prіnt the HelloMessage
mov ah,4Ch ;DOS termіnate program functіon
іnt 21h ;end of the program
CODE ENDS
END ProgramStart
;Нижче наведено приклад із спрощеними сегментними директивами.
.MODEL TІNY
.CODE
org 100h
start:
jmp prog
;власні дані, що потребують перестрибування
HelloMessage DB 'Hello, world', 13, 10, '$'
prog:
mov ah,09
mov dx,OFFSET HelloMessage
іnt 21h
mov ah,4ch
іnt 21h
END start
Система Turbo-Assembler виробляє .COM-файл в наступний спосіб:
C:\> tasm fіlename.asm <Enter>
Результат - файл fіlename.obj. Необов'язкові параметри /l або /la призводять до додаткової генерації файлу fіlename.lst, що міститть лістинг асемблювання програми.
C:\> tlіnk/t fіlename.obj <Enter>
Результат - файл fіlename.com, що вже можна запускати.
ЗАВДАННЯ:
Створити програму типу .COM, яка в текстовому режимі виводить за допомогою псевдографіки зображення заданого варіантом символу.
Перевірити роботу створеної програми і продемонструвати її виконання.
Скласти звіт про виконану роботу (з приведенням тексту програми).
ВАРІАНТИ ЗАВДАННЯ:
варіант
символ
варіант
символ
1
A
16
λ
2
F
17
X
3
H
18
Z
4
N
19
Д
5
M
20
Ш
6
K
21
Е
7
L
22
У
8
V
23
Ц
9
Y
24
И
10
α
25
ω
11
β
26
τ
12
δ
27
ρ
13
Я
28
Ж
14
Ї
29
G
15
Ю
30
W
Література:
1.Р.Джордейн.Справочник програмиста персональных компъютеров типа ІBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.
2.Л.О.Березко,В.В.Троценко. Особливості програмування в турбо-асемблері. -Киів,НМК ВО,1992.
3.Л.Дао. Программирование микропроцессора 8088.Пер.с англ.-М."Мир",1988.
4.П.Абель.Язык ассемблера для ІBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992.
Повна таблиця ASCII символів
С–символ;10–десяткове значення;16–шістнадцяткове значення
С
10
16
С
10
16
С
10
16
С
10
16
С
10
16
С
10
16
С
10
16
С
10
16
0
00
пробіл
32
20
@
64
40
`
96
60
А
128
80
а
160
A0
└
192
C0
р
224
E0
1
01
!
33
21
A
65
41
a
97
61
Б
129
81
б
161
A1
┴
193
C1
с
225
E1
2
02
"
34
22
B
66
42
b
98
62
В
130
82
в
162
A2
┬
194
C2
т
226
E2
3
03
#
35
23
C
67
43
c
99
63
Г
131
83
г
163
A3
├
195
C3
у
227
E3
4
04
$
36
24
D
68
44
d
100
64
Д
132
84
д
164
A4
─
196
C4
ф
228
E4
5
05
%
37
25
E
69
45
e
101
65
Е
133
85
е
165
A5
┼
197
C5
х
229
E5
6
06
&
38
26
F
70
46
f
102
66
Ж
134
86
ж
166
A6
╞
198
C6
ц
230
E6
7
07
'
39
27
G
71
47
g
103
67
З
135
87
з
167
A7
╟
199
C7
ч
231
E7
8
08
(
40
28
H
72
48
h
104
68
И
136
88
и
168
A8
╚
200
C8
ш
232
E8
9
09
)
41
29
I
73
49
i
105
69
Й
137
89
й
169
A9
╔
201
C9
щ
233
E9
10
0A
*
42
2A
J
74
4A
j
106
6A
K
138
8A
к
170
AA
╩
202
CA
ъ
234
EA
11
0B
+
43
2B
K
75
4B
k
107
6B
Л
139
8B
л
171
AB
╦
203
CB
ы
235
EB
12
0C
,
44
2C
L
76
4C
l
108
6C
М
140
8C
м
172
AC
╠
204
CC
ь
236
EC
13
0D
-
45
2D
M
77
4D
m
109
6D
H
141
8D
н
173
AD
═
205
CD
э
237
ED
14
0E
.
46
2E
N
78
4E
n
110
6E
О
142
8E
о
174
AE
╬
206
CE
ю
238
EE
15
0F
/
47
2F
O
79
4F
o
111
6F
П
143
8F
п
175
AF
╧
207
CF
я
239
EF
16
10
0
48
30
P
80
50
p
112
70
Р
144
90
░
176
B0
╨
208
D0
Ё
240
F0
17
11
1
49
31
Q
81
51
q
113
71
С
145
91
▒
177
B1
╤
209
D1
ё
241
F1
18
12
2
50
32
R
82
52
r
114
72
Т
146
92
▓
178
B2
╥
210
D2
Ґ
242
F2
19
13
3
51
33
S
83
53
s
115
73
У
147
93
│
179
B3
╙
211
D3
ґ
243
F3
20
14
4
52
34
T
84
54
t
116
74
Ф
148
94
┤
180
B4
╘
212
D4
Є
244
F4
21
15
5
53
35
U
85
55
u
117
75
Х
149
95
╡
181
B5
╒
213
D5
є
245
F5
22
16
6
54
36
V
86
56
v
118
76
Ц
150
96
╢
182
B6
╓
214
D6
І
246
F6
23
17
7
55
37
W
87
57
w
119
77
Ч
151
97
╖
183
B7
╫
215
D7
і
247
F7
24
18
8
56
38
X
88
58
x
120
78
Ш
152
98
╕
184
B8
╪
216
D8
Ї
248
F8
25
19
9
57
39
Y
89
59
y
121
79
Щ
153
99
╣
185
B9
┘
217
D9
ї
249
F9
26
1A
:
58
3A
Z
90
5A
z
122
7A
Ъ
154
9A
║
186
BA
┌
218
DA
·
250
FA
27
1B
;
59
3B
[
91
5B
{
123
7B
Ы
155
9B
╗
187
BB
█
219
DB
√
251
FB
28
1C
<
60
3C
\
92
5C
|
124
7C
Ь
156
9C
╝
188
BC
▄
220
DC
№
252
FC
29
1D
=
61
3D
]
93
5D
}
125
7D
Э
157
9D
╜
189
BD
▌
221
DD
¤
253
FD
30
1E
>
62
3E
^
94
5E
~
126
7E
Ю
158
9E
╛
190
BE
▐
222
DE
■
254
FE
31
1F
?
63
3F
_
95
5F
127
7F
Я
159
9F
┐
191
BF
▀
223
DF
255
FF
Приклад виконання.
Завдання: за допомогою псевдографіки вивести зображення символу «О».
Для вирішення поставленої задачі, слід визначити коди ASCII псевдографічних символів. Для цього необхідно скористатися повною таблицею ASCII символів, приведеною вище.
З таблиці видно, що псевдографічні символи розташовані між 176 і 223 кодом. Оберемо для створення границь зображення заданого символу заповнений прямокутник (код 219), а для наповнення – розріджений прямокутник (код 176). Для наочності, утворимо зображення заданого символу «О» безпосередньо при описі даних. Для цього можна скористатися або ASCII кодами, або комбінацією клавіш Alt+ASCII код, яка дозволяє в текстовому редакторі відобразити сам символ.
Таким чином, наведемо програму, що рисує зображення символу «О» за допомогою псевдографіки.
Текст програми міститься : Examples\laba2.asm
; Вивід за допомогою псевдографіки.
dosseg
.model small
.code
org 100h
start:
jmp prog
Simbol db ' ',10,13
db ' ████████████████████████ ',10,13
db ' ██░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' █░░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██░░░░░░░██ ██░░░░░░░██ ',10,13
db ' ██████████████████████████ ',10,13
db ' ',10,13,'$'
prog:
mov ax,0600h
Очистка екрану шляхом його прокрутки вниз
mov cx,0000
mov bh,07
mov dx,184fh
int 10h
mov al,00
mov ah, 09
Вивід на екран зображення символу
mov dx, offset Simbol
int 21h
mov ah, 7
Очікування нажаття довільної клавіші
int 21h
mov ax,0600h
Очистка екрану шляхом його прокрутки вниз
mov cx,0000
mov bh,07
mov dx,184fh
int 10h
mov al,0
Завершення програми та передача керування до ОС
mov ah, 4ch
int21h
end start
Можна також описати дані, що необхідно вивести, засобами мови Assembler, використовуючи безпосередні коди бажаних псевдографічних символів. Тоді за міткою Simbol, буде:
Simbol db 60 dup (32),10,13
db 19 dup (32),26 dup(219),19 dup (32),13,10
db 17 dup (32),2 dup(219),7 dup(176),2 dup(219),8 dup(32),2 dup(219),7 dup(176),2 dup(219),17 dup(32), 10,13
db 15 dup (32),2 dup(219),7 dup(176),2 dup(219),12 dup(32),2 dup(219),7 dup(176),2 dup(219),15 dup(32), 10,13
db 13 dup (32),2 dup(219),7 dup(176),2 dup(219),16 dup(32),2 dup(219),7 dup(176),2 dup(219),13 dup(32), 10,13
db 11 dup (32),2 dup(219),7 dup(176),2 dup(219),20 dup(32),2 dup(219),7 dup(176),2 dup(219),11 dup(32), 10,13
db 8 dup( 9 dup (32),2 dup(219),7 dup(176),2 dup(219),24 dup(32),2 dup(219),7 dup(176),2 dup(219),9 dup(32), 10,13)
db 11 dup (32),2 dup(219),7 dup(176),2 dup(219),20 dup(32),2 dup(219),7 dup(176),2 dup(219),11 dup(32), 10,13
db 13 dup (32),2 dup(219),7 dup(176),2 dup(219),16 dup(32),2 dup(219),7 dup(176),2 dup(219),13 dup(32), 10,13
db 15 dup (32),2 dup(219),7 dup(176),2 dup(219),12 dup(32),2 dup(219),7 dup(176),2 dup(219),15 dup(32), 10,13
db 17 dup (32),2 dup(219),7 dup(176),2 dup(219),8 dup(32),2 dup(219),7 dup(176),2 dup(219),17 dup(32), 10,13
db 19 dup (32),26 dup(219),19 dup (32),13,10
db 60 dup (32),10,13,'$'
Решта коду програми залишається без змін. Текст програми міститься : Examples\laba2_1.asm
Результатом виконання приведеної програми є вивід у текстовому режимі зображення символу «О» за допомогою псевдографіки.