Заключение
При написании программы на Ассемблере следует внимательно относиться к резервированию и инициализации памяти (данных). Следует иметь в виду, что к одним и тем же ячейкам можно обращаться как к данным различного типа, но это желательно предусмотреть при их резервировании. Не следует использовать для переменных типы данных, не соответствующие им по сути, по применяемой обработке, по диапазону значений.
Литература
Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высш. шк., 1992. – 447 с.
Коффрон Дж. Технические средства микропроцессорных систем. М. Мир 1983г. - 344 с.
Коффрон Дж., В. Лонг. Расширение микропроцессорных систем. М. Машино-строение 1987г. - 320 с.
Морису, Э.Т. Есикава. Микро ЭВМ за три дня. М. Мир 1981г. - 194 с.
Уокерли Дж.. Архитектура и программирование микро ЭВМ. В 2-х кн. М. Мир 1984г. кн.1 - 486 с., кн. 2 - 341 с.
Гивонэ Д., Россер Р.. Микропроцессоры и микрокомпьютеры. Вводный курс. М. Мир 1983г. - 484 с.
Гилмор И.. Введение в микропроцессорную технику. М. Мир 1984г. - 334 с.
Лю Ю - Чжен, Гибсон Г.. Микропроцессоры семейства 8086/8088. М. Радио и связь 1987г. - 512с.
Морс С.П., Алберт Д.Д.. Архитектура микропроцессора 80286. М. Радио и связь 1990г.
Григорьев В.Л.. Микропроцессор i486. Архитектура и программирование (в 4-х книгах). – М., ГРАНАЛ, 1993. – с. 346 (кн.1), с. 382 (кн.2-4).
Григорьев В.Л.. Программирование однокристальных микропроцессоров. М. Энергоатомиздат 1987г. - 288 с.
Дао Л.. Программирование микропроцессора 8088. М. Мир 1988г. - 357 с.
Брамм П., Брамм Д.. Микропроцессор 80386 и его программирование. М. Мир 1990г. - 448 с.
Смит Б. Э., Джонсон М. Т.. Архитектура и программирование микропроцессора INTEL 80386 М. ТОО “Конкорд” 1992 г. 326 с.
Майко Г.В. Ассемблер для IBM PC. М.: Бизнес - Информ, Сирин 1997 г. - 212 с.
Пильщиков В.Н. Программирование на языке ассемблера IBM PC. М.: ДИАЛОГ - МИФИ, 1997. - 288 с.
Приложения
Приложение 1. Пример сегмента данных программы.
Еще один пример описания данных различных типов.
В исходном модуле определен сегмент данных:
.data
db 'Begin of DATAseg'
z1 db 12h
z2 dw 12h
z3 dd 12h
z4 dq 12h
z5 dt 12h
z6 dp 12h
z7 df 12h
s1 db 'String 1'
db '*'
db ?
db ?
b1 db 10h dup (12h)
В листинге сегмент данных получен в следующем виде:
7 0000 42 65 67 69 6E 20 6F+ db 'Begin of DATAseg'
8 66 20 44 41 54 41 73+
9 65 67
10
11 0010 12 z1 db 12h
12 0011 0012 z2 dw 12h
13 0013 00000012 z3 dd 12h
14 0017 0000000000000012 z4 dq 12h
15 001F 00000000000000000012 z5 dt 12h
16 0029 000000000012 z6 dp 12h
17 002F 000000000012 z7 df 12h
18
19 0035 53 74 72 69 6E 67 20+ s1 db 'String 1'
20 31
21 003D 2A db '*'
22 003E ?? db ?
23 003F ?? db ?
24
25 0040 10*(12) b1 db 10h dup (12h)
В окне отладчика сегмент данных имеет следующий вид:
0 1 2 3 4 5 6 7 8 9 A B C D E F |
DS:0000 42 65 67 69 6E 20 6F 66 20 44 41 54 41 73 65 67 |Begin of DATAseg
DS:0010 12 12 00 12 00 00 00 12 00 00 00 00 00 00 00 12 |........ ........
DS:0020 00 00 00 00 00 00 00 00 00 12 00 00 00 00 00 12 |........ ........
DS:0030 00 00 00 00 00 53 74 72 69 6E 67 20 31 2A 00 00 |.....Str ing 1*..
DS:0040 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 |........ ........
Приложение 2. Пример сегмента данных программы с вещественными числами.
В программе определен сегмент данных, содержащий вещественные числа. Фрагмент листинга, полученного в результате трансляции, приведен ниже:
1 name dat_fp
2
3 .model small
4
5 0000 .data
6 ;---------------------
7 0000 00000000 xf0 dd 0e0
8 0004 0000000000000000 xf0q dq 0e0
9 000C 00000000000000000000 xf0t dt 0e0
10 0016 80000000 xf0_ dd –0e0
11
12 001A 3F000000 xf05 dd 0.5E0
13 001E 3FE0000000000000 xf05q dq 0.5E0
14 0026 3FFE8000000000000000 xf05t dt 0.5E0
15 0030 BF000000 xf05_ dd –0.5E0
16
17 0034 3F800000 xf1 dd 1E0
18 0038 3FF0000000000000 xf1q dq 1E0
19 0040 3FFF8000000000000000 xf1t dt 1E0
20 004A BF800000 xf1_ dd –1E0
21
22 004E 40000000 xf2 dd 2E0
23 0052 4000000000000000 xf2q dq 2E0
24 005A 40008000000000000000 xf2t dt 2E0
25 0064 C0000000 xf2_ dd –2E0
26
27 0068 477FFF00 xf16 dd 65535e0
28 006C 40EFFFE000000000 xf16q dq 65535e0
29 0074 400EFFFF000000000000 xf16t dt 65535e0
30
31 007E 7FFFFFFF xf38 dd 6.8056471355946732339e38
32 0082 47FFFFFFF0000000 xf38q dq 6.8056471355946732339e38
33
34 008A 7FFFFFFFFFFFFFFF xf308 dq 3.595386269724631317e308
Примечание. Подробнее о форматах вещественных чисел можно прочитать в [Л.10, кн 3, с.132 – 141].
Приложение 3. Пример сегмента данных программы с числами в формате BCD.
В программе определен сегмент данных, содержащий числа в формате «Упакованный BCD (binary coded decimal)». Фрагмент листинга, полученного в результате трансляции, приведен ниже:
1 name dat_bcd
2
3 0000 .model small
4
5 = 1234 my_const1 equ 1234h
6 = 04D2 my_const2 equ 1234
7 0000 .data
8 ;---------------------
9
10
11 0000 000004D2 bin dd 1234 ; это двоичное целое
12
13 0004 00000000000000001234 bcd dt 1234 ; это упакованное BCD
14
15 000E 00000000001234567890 bcd01 dt 1234567890
16
17 0018 99999999999999999999 bcd02 dt 99999999999999999999
18 0022 19999999999999999999 bcd03 dt -99999999999999999999
19
Далее пример представления константы 16 в различных форматах (32-битное с фиксированной точкой, 80-битное упакованное BCD, 32-битное с плавающей точкой, 80-битное с плавающей точкой):
20 002C 00000010 bin16 dd 16
21 0030 00000000000000000016 bcd16 dt 16
22 003A 41800000 fpd16 dd 16.
23 003E 40038000000000000000 fpt16 dt 16.
24
Далее – неинициализированные 10 байт:
25 0048 ???????????????????? bcd3 dt ?
26
Обратите внимание на использование директивы EQU (см. выше):
27 0052 00000000000000001234 bcd41 dt my_const1
28 005C 00001234 bcd42 dd my_const1
29 0060 000000000000000004D2 bcd43 dt my_const2
30 006A 000004D2 bcd44 dd my_const2