close

Вход

Забыли?

вход по аккаунту

?

сп1

код для вставкиСкачать
Цель работы: * Осуществить раздельную трансляцию программы (используя программу лабораторной работы №3 с первого семестра обучения);
* изучить директивы PUBLIC и EXTRN
* изучить таблицы перекрестных ссылок и карту памяти (.map)
Теория: Для того, чтобы выполнить раздельную трансляцию нужно разделить программу (л.р. №3 первого семестра обычения) на 2 файла: в одном файле должна находиться процедура - часть программы, а в другом - остальная часть программы с вызовом этой процедуры. В программе-процедуре необходимо с использованием директивы PUBLIC указать на то, что процедура будет вызываться из другого модуля, соответственно в основной программе необходимо с помощью директивы EXTRN указать, что вызываемая в данном файле процедура описывается в другом файле. Раздельная трансляция осуществляется следующим образом:
TASM main .asm /c /l
TASM second.asm /c /l
/c - указание на включение в файл листинга с информацией о перекрестных ссылках;
/l - указывает на необходимость создания файла листинга;
TLINK main.obj second.obj /m /s
/m - создать файл карты;
/s - в файл карты включается информация о сегментах (адрес, длина в байтах, класс, имя сегмента).
Выполнение:
Ниже будут приведены файлы листинга двух модулей и файл карты памяти (.map)
Основной модуль (main.lst)
Turbo Assembler Version 3.1 27/11/09 17:53:42 Page 1
g:\main.asm
10000 model small
20000 .stack 80h
30000 .data
4 public msg
50000 4B 6F 6C 69 63 6865+ msg db 'Kolichestvo bukv: ', '$'
6 73 74 76 6F 20 6275+
7 6B 76 3A 20 24
80013 41 42 43 44 45 4647+ tabl_bukv db 41h, 42h, 43h, 44h, 45h, 46h,47h, 48h, 49h, 4Ah, 4Bh, 4Ch, 4Dh, 4Eh,4Fh, 50h, +
9 48 49 4A 4B 4C 4D4E+ 51h, 52h, 53h, 54h, 55h, 56h, 57h,58h, 59h, 5Ah, 61h, 62h, 63h, 64h, 65h,66h, 67h, 68h, 69h, +
10 4F 50 51 52 53 5455+ 6Ah, 6Bh, 6Ch, 6Dh, 6Eh, 6Fh, 70h,71h, 72h, 73h, 74h, 75h, 76h, 77h, 78h,79h, 7Ah
11 56 57 58 59 5A 6162+
12 63 64 65 66 67 6869+
13 6A 6B 6C 6D 6E 6F70+
14 71 72 73 74 75 7677+
15 78 79 7A
160047 .code
17 extrn vyvod:near
180000 B8 0000s begin: mov ax, @data
190003 8E D8 mov ds, ax
200005 BF 0082 mov di, 0082h
210008 33 C9 xor cx, cx
22000A 26: 8A 1D space: mov bl, es:[di]
23000D 80 FB 0D cmp bl, 0Dh
240010 74 19 jeend
250012 38 9C 0013r ent: cmp tabl_bukv[si],bl
260016 75 06 jne inc_si
270018 41 bukva: inc cx
280019 47 inc di
29001A 33 F6 xor si, si
30001C EB EC jmp space
31001E 83 FE 33 inc_si: cmp si, 51
320021 74 03 jenbukva
330023 46 next_b: inc si
340024 EB EC jmp ent
350026 47 nbukva: inc di
360027 33 F6 xor si, si
370029 EB DF jmp space
38002B E8 0000e end: call vyvod
39 end begin
Turbo Assembler Version 3.1 27/11/09 17:53:42 Page 2
Symbol Table
Symbol NameType Value Cref(defined at #)
??DATEText "27/11/09"
??FILENAMEText "main"
??TIMEText "17:53:42"
??VERSIONNumber 030A
@32BITText 0 #1
@CODEText _TEXT #1 #1 #16
@CODESIZEText 0 #1
@CPUText 0101H
@CURSEGText _TEXT #3 #16
@DATAText DGROUP #1 18
@DATASIZEText 0 #1
@FILENAMEText MAIN
@INTERFACEText 00H #1
@MODELText 2 #1
@STACKText DGROUP #1
@WORDSIZEText 2 #3 #16
BEGINNear _TEXT:0000 #1839
BUKVANear _TEXT:0018 #27
ENDNear _TEXT:002B 24 #38
ENTNear _TEXT:0012 #2534
INC_SINear _TEXT:001E 26 #31
MSGByte DGROUP:0000 4 #5
NBUKVANear _TEXT:0026 32 #35
NEXT_BNear _TEXT:0023 #33
SPACENear _TEXT:000A #2230 37
TABL_BUKVByte DGROUP:0013 #8 25
VYVODNear _TEXT:---- Extern #1738
Groups & SegmentsBit Size AlignCombineClass Cref(defined at #)
DGROUPGroup #1 1 18
STACK16 0080 ParaStackSTACK #2
_DATA16 0047 WordPublicDATA #1 #3
_TEXT16 002E WordPublicCODE #1 1 #16 16
Дополнительный модуль (second.lst)
Turbo Assembler Version 3.1 27/11/09 17:54:13 Page 1
g:\second.asm
10000 model small
20000 .stack 80h
30000 .data
4 extrn msg
50000 .code
6 public vyvod
70000 vyvod procnear
80000 BA 0000e mov dx, offset msg
90003 B4 09 mov ah, 9
100005 CD 21 int 21h
110007 8B C1 mov ax, cx
120009 33 C9 xor cx, cx
13000B BB 000A mov bx, 10
14000E 33 D2 next_c: xor dx, dx
150010 F7 F3 div bx
160012 52 push dx
170013 41 inc cx
180014 3D 0000 cmp ax, 0
190017 75 F5 jne next_c
200019 5A screen: pop dx
21001A 80 C2 30 add dl, 30h
22001D B4 02 mov ah,2
23001F CD 21 int 21h
240021 49 dec cx
250022 83 F9 00 cmp cx, 0h
260025 75 F2 jne screen
270027 B4 4C mov ah, 4ch
280029 CD 21 int 21h
29002B C3 ret
30002C vyvod endp
31 end vyvod
Turbo Assembler Version 3.1 27/11/09 17:54:13 Page 2
Symbol Table
Symbol NameType Value Cref(defined at #)
??DATEText "27/11/09"
??FILENAMEText "second"
??TIMEText "17:54:13"
??VERSIONNumber 030A
@32BITText 0 #1
@CODEText _TEXT #1 #1 #5
@CODESIZEText 0 #1
@CPUText 0101H
@CURSEGText _TEXT #3 #5
@DATAText DGROUP #1
@DATASIZEText 0 #1
@FILENAMEText SECOND
@INTERFACEText 00H #1
@MODELText 2 #1
@STACKText DGROUP #1
@WORDSIZEText 2 #3 #5
MSGWord DGROUP:---- Extern #4 8
NEXT_CNear _TEXT:000E #1419
SCREENNear _TEXT:0019 #2026
VYVODNear _TEXT:0000 6 #7 31
Groups & SegmentsBit Size AlignCombineClass Cref(defined at #)
DGROUPGroup #1 1
STACK16 0080 ParaStackSTACK #2
_DATA16 0000 WordPublicDATA #1 #3
_TEXT16 002C WordPublicCODE #1 1 #5 5
Файл карты памяти (main.map)
Start Stop Length Name Class
00000H 00059H 0005AH _TEXT CODE
00060H 000A7H 00048H _DATA DATA
000B0H 001AFH 00100H STACK STACK
Detailed map of segments
0000:0000 002E C=CODE S=_TEXT G=(none) M=G:\MAIN.ASM ACBP=48
0000:002E 002C C=CODE S=_TEXT G=(none) M=G:\SECOND.ASM ACBP=48
0006:0000 0047 C=DATA S=_DATA G=DGROUP M=G:\MAIN.ASM ACBP=48
0006:0048 0000 C=DATA S=_DATA G=DGROUP M=G:\SECOND.ASM ACBP=48
0006:0050 0080 C=STACK S=STACK G=DGROUP M=G:\MAIN.ASM ACBP=74
0006:00D0 0080 C=STACK S=STACK G=DGROUP M=G:\SECOND.ASM ACBP=74
Address Publics by Name
0006:0000 MSG
0000:002E VYVOD
Address Publics by Value
0000:002E VYVOD
0006:0000 MSG
Program entry point at 0000:0000
Вывод: осуществлена раздельная трансляция при помощи директив PUBLIC и EXTRN. Приведены файлы листинга (.lst) и файл карты памяти (.map). Рассмотрена структура .map файла. В моей программе исмользована упрощенная директива определения сегментов. Выбранная модель памяти - small. Вследствии чего в моей программе возникает такая группа сегментов как DGROUP, в которую входят сегменты DATA и STACK. Убедиться в этом можно просмотрев .map файл. Разобран побитно байт ACBP в .map файле. Определено, что в моем случае сегменты CODE и DATA выравнены по границе слова и являются общекомбинируемыми; сегмент STACK выравнен по границе параграфа и имеет класс сочетания "стек".
Структура объектного модуля. (OBJ-файл)
OBJ файл представляет собой набор записей со следующими полями: тип записи - 1 байт, длина записи - 2 байта, содержимое записи - не превышает 1024 байта , байт контрольной суммы.
Рассмотрим структуру модуля на примере SECOND. OBJ
00000000 80 0F 00 0D 67 3A 5C 73 65 63 6F 6E 64 2E 61 73 €...g:\second.as
00000010 6D 7C 88 20 00 00 00 1C 54 75 72 62 6F 20 41 73 m|ˆ ....Turbo As
00000020 73 65 6D 62 6C 65 72 20 20 56 65 72 73 69 6F 6E sembler Version
00000030 20 33 2E 31 9A 88 15 00 40 E9 8E 72 69 3B 0D 67 3.1šˆ..@éŽri;.g
00000040 3A 5C 73 65 63 6F 6E 64 2E 61 73 6D A1 88 03 00 :\second.asm¡ˆ..
00000050 40 E9 4C 96 02 00 00 68 88 03 00 40 A1 94 96 0C @éL-...hˆ..@¡"-.
00000060 00 05 5F 54 45 58 54 04 43 4F 44 45 96 98 07 00 .._TEXT.CODE-˜..
00000070 48 2C 00 02 03 01 E7 96 0C 00 05 5F 44 41 54 41 H,....ç-..._DATA
00000080 04 44 41 54 41 C2 98 07 00 48 00 00 04 05 01 0F .DATA˜..H......
00000090 96 0D 00 05 53 54 41 43 4B 05 53 54 41 43 4B 67 -...STACK.STACKg
000000A0 98 07 00 74 80 00 06 07 01 5F 96 08 00 06 44 47 ˜..t€...._-...DG
000000B0 52 4F 55 50 8B 9A 06 00 08 FF 03 FF 02 55 8C 06 ROUP‹š...ÿ.ÿ.UŒ.
000000C0 00 03 4D 53 47 00 84 90 0C 00 00 01 05 56 59 56 ..MSG.".....VYV
000000D0 4F 44 00 00 00 C6 88 04 00 40 A2 01 91 A0 30 00 OD...ƈ..@¢.' 0.
000000E0 01 00 00 BA 00 00 B4 09 CD 21 8B C1 33 C9 BB 0A ...º..´.Í!‹Á3É".
000000F0 00 33 D2 F7 F3 52 41 3D 00 00 75 F5 5A 80 C2 30 .3Ò÷óRA=..uõZ€Â0
00000100 B4 02 CD 21 49 83 F9 00 75 F2 B4 4C CD 21 C3 47 ´.Í!Iƒù.uò´LÍ!ÃG
00000110 9C 06 00 C4 01 16 01 01 81 8A 07 00 C1 00 01 01 œ..Ä....Š..Á...
00000120 00 00 AC ..¬
Типы записей:
Тип записиОписание80Translator Header Record8АModule End Record8СExternal Names Definition Record90Public Names Definition Record94Line Numbers Record96List of Names Record98Info for specific seg9АInfo for specific group9СRelocation listА0Segment dataА2Duplicated Segment Data
Разбирем 3 типа записи: 8СH, 90H и 96H
1. 8CH.
- 8С - External symbols
- 06 00 - Длина записи
- 03 - Запись содержит строку длиной 03
- 4D 53 07 - Внешнее имя (MSG)
- 00 - тип не определен TYPEDEF записью в объектном модуле
- 84 - контрольная сумма
2. 90H
- 90 - Public symbols
- 0C 00 - Длина записи
- 00 - Индекс базовой группы (никакой группы не связано с этой записью)
- 01 - Индекс базового сегмента (имя определено в первой записи SEGDEF объектного модуля - "CODE")
- 05 - Длина строки с именем
- 56 59 56 4F 44 - Внешнее имя (VYVOD)
- 00 00 - Публичное смещение - 00 - тип не определен TYPEDEF записью в объектном модуле
- С6 - контрольная сумма
3. 96H
- 96 - Segment/Group symbols
- 08 00 - Длина записи
- 06 - Длина строки с именем
- 44 47 52 4f 55 50 - строка "DGROUP"
- 8B - контрольная сумма
Вывод: рассмотрена структура объектного модуля, побайтно разобраны 3 типа записи: External symbols (8CH) - в моем случае имя "MSG", Public symbols (90H) - в моем случае имя "VYVOD" и Segment/Group symbols (96H) - в моем случае группа "DGROUP".
Документ
Категория
Рефераты
Просмотров
8
Размер файла
28 Кб
Теги
сп1
1/--страниц
Пожаловаться на содержимое документа