СПО лаба №1

20 Февраль 2014 →

Федеральное агентство по образованию

Федеральное государственное бюджетное образовательное

Учреждение высшего профессионального образования

Национальный исследовательский ядерный университет «МИФИ»

Обнинский институт атомной энергетики

Кафедра Компьютерных систем, сетей и технологий

Лабораторная работа №1 по курсу

«Системное программное обеспечение».

Раздельная трансляция.

Выполнил:

студент гр. ВТ2-С10

Малафеев В.Н.

Проверил:

Калинин Д. А.

Обнинск, 2013г.

Цель работы: осуществить раздельную трансляцию на примере лабораторной работы №3 из прошлого семестра, сравнить способы определения сегментов (упрощеные директивы и директива SEGMENT), изучить директивы PUBLIC и EXTRN, а так же таблицы сиволических имен и перекрестных ссылок.

Краткая теория: для осуществления раздельной трансляции необходимо разбить программу лабораторной работы №3 на 2 модуля – модуль, хранящий код процедур (l12.asm) и модуль, эти процедуры вызывающий (l11.asm). В вызывающем модуле необходимо указать имена процедур с директивой EXTRN (т.о. мы указываем, что процедура с данным именем определена в другом модуле), соответственно в хранящем модуле имена процедур нужно указать с директивой PUBLIC (процедура с этой директивой будет доступна в других модулях). Таким образом мы обеспечиваем связь по управлению. Также необходимо организовать связь по данным – в данной лабораторной работе она реализуется с помощью «общего» сегмента данных cdata и параметра директивы SEGMENT COMMON (сегмент cdata в обоих модулях находится в одном месте в оперативной памяти, т.о. изменение данных в пределах одного модуля «перетирает» данные из другого модуля).

Процедура раздельной трансляции выполняется путем транслирования модулей в обьектные файлы по отдельности(tasm < имя модуля> /l /c) и их компоновки с помощью tlink (tlink < модуль1>+< модуль2> /s). Параметры /l и /c означают, что будет создан файл листинга (.lst) и в него будет помещена таблица перекрестных ссылок. Параметр /s означает, что в карту памяти (.map) будет помещена структура программы.

Выполнение работы:

Листинги:

l11.lst

Turbo Assembler Version 4.1 02/24/13 16:40:03 Page 1

l11.asm

1 0000 .model small

2 0000 cdata segment paracommon "data";общий сегмент данных

3 0000 40*(24) scrsvr db 64 dup("$")

4 0040 40*(24) input db 64 dup("$")

5 0080 cdata ends

6 0000 code segment para public "code"

7 assume cs:code,ds:cdata,es:cdata

8 extrn clearscreen:far

9 extrn compare:far

10 0000 start:

11 0000 B8 0000smov ax,cdata ;настраивается сегментный регистр

12 0003 8E D8mov ds,ax

13 0005 8E C0mov es,ax

14 0007 FCcld;флаговый регистр df = 0

15

16 0008 C6 06 0000r 40mov scrsvr,64;max в первый байтscrsvr(0ah - подготовка)

17 000D BA 0000rlea dx,scrsvr;заполняем строку скринсейвера

18 0010 B4 0Amov ah,0ah

19 0012 CD 21int 21h

20

21 0014 0E E8 0000ecall clearscreen;очистка экрана воизбежание хвостов для след. ввода

22 0018 cycle:

23 0018 0E E8 0000ecall compare ;вызываем процедуру сравнения

24 001C 74 02je exit ;если строки равны, то выходим

25 001E EB F8jmp cycle ;если нет,то продолжаем

26 0020 exit:

27 0020 B8 4C00mov ax,4c00h

28 0023 CD 21int 21h

29 0025 code ends

30 end start

Turbo Assembler Version 4.1 02/24/13 16:40:03 Page 2

Symbol Table

Symbol NameType Value Cref(defined at #)

??DATEText "02/24/13"

??FILENAMEText "l11"

??TIMEText "16:40:03"

??VERSIONNumber 040A

@32BITText 0 #1

@CODEText _TEXT #1 #1

@CODESIZEText 0 #1

@CPUText 0101H

@CURSEGText CODE #2 #6

@DATAText DGROUP #1

@DATASIZEText 0 #1

@FILENAMEText L11

@INTERFACEText 000H #1

@MODELText 2 #1

@STACKText DGROUP #1

@WORDSIZEText 2 #2 #6

CLEARSCREENFar CODE:---- Extern #8 21

COMPAREFar CODE:---- Extern #9 23

CYCLENear CODE:0018 #2225

EXITNear CODE:0020 #24 #26

INPUTByte CDATA:0040 #4

SCRSVRByte CDATA:0000 #3 16 17

STARTNear CODE:0000 #1030

Groups & SegmentsBit Size AlignCombine Class Cref(defined at #)

CDATA16 0080 ParaCommonDATA #2 7 7 11

CODE16 0025 ParaPublicCODE #6 7

DGROUPGroup #1 1

_DATA16 0000 WordPublicDATA #1

_TEXT16 0000 WordPublicCODE #1 1

l12.lst

Turbo Assembler Version 4.1 02/24/13 16:52:58 Page 1

l12.asm

1 0000 .model small

2 0000 cdata segment paracommon "data" ;общий сегмент данных

3 0000 40*(24) scrsvr db 64 dup("$")

4 0040 40*(24) input db 64 dup("$")

5 0080 cdata ends

6 0000 code segment para public "code"

7 assume cs:code,ds:cdata,es:cdata

8 0000 clearscreen proc far ;очистка экрана

9 0000 B8 0003 mov ax,03

10 0003 CD 10 int 10h

11 0005 CB ret

12 0006 clearscreen endp

13 0006 compare proc far

14 0006 C6 06 0040r 40 mov input,64 ;max в первый байтinput(0ah - подготовка)

15 000B BA 0040r lea dx,input ;ввод строки для сравнения

16 000E B4 0A mov ah,0ah

17 0010 CD 21 int 21h

18 0012 0E E8 FFEA call clearscreen ;очистка экрана воизбежание хвостов для след. ввода

19 0016 BE 0000r lea si,scrsvr ;подготовка к сравнению

20 0019 BF 0040r lea di,input

21 001C 8A 0E 0041r mov cl,input[1]

22 0020 F3> A6 repe cmps scrsvr,input ;сравнение(результат в регистре сx, его анализ в l11)

23 0022 CB ret

24 0023 compare endp

25 public compare

26 public clearscreen

27 0023 code ends

28 end

Turbo Assembler Version 4.1 02/24/13 16:52:58 Page 2

Symbol Table

Symbol NameType Value Cref(defined at #)

??DATEText "02/24/13"

??FILENAMEText "l12"

??TIMEText "16:52:58"

??VERSIONNumber 040A

@32BITText 0 #1

@CODEText _TEXT #1 #1

@CODESIZEText 0 #1

@CPUText 0101H

@CURSEGText CODE #2 #6

@DATAText DGROUP #1

@DATASIZEText 0 #1

@FILENAMEText L12

@INTERFACEText 000H #1

@MODELText 2 #1

@STACKText DGROUP #1

@WORDSIZEText 2 #2 #6

CLEARSCREENFar CODE:0000 #8 18 26

COMPAREFar CODE:0006 #1325

INPUTByte CDATA:0040 #4 14 15 20 21 22

SCRSVRByte CDATA:0000 #3 19 22

Groups & SegmentsBit Size AlignCombine Class Cref(defined at #)

CDATA16 0080 ParaCommonDATA #2 7 7

CODE16 0023 ParaPublicCODE #6 7

DGROUPGroup #1 1

_DATA16 0000 WordPublicDATA #1

_TEXT16 0000 WordPublicCODE #1 1

Карта памяти обьединенного модуля:

Start Stop Length Name Class

00000H 00000H 00000H _TEXT CODE

00000H 00052H 00053H CODE CODE

00054H 00054H 00000H _DATA DATA

00060H 000DFH 00080H CDATA DATA

Detailed map of segments

0000:0000 0000 C=CODE S=_TEXT G=(none) M=L11.ASM ACBP=48

0000:0000 0000 C=CODE S=_TEXT G=(none) M=L12.ASM ACBP=48

0000:0000 0025 C=CODE S=CODE G=(none) M=L11.ASM ACBP=68

0000:0030 0023 C=CODE S=CODE G=(none) M=L12.ASM ACBP=68

0005:0004 0000 C=DATA S=_DATA G=DGROUP M=L11.ASM ACBP=48

0005:0004 0000 C=DATA S=_DATA G=DGROUP M=L12.ASM ACBP=48

0006:0000 0080 C=DATA S=CDATA G=(none) M=L11.ASM ACBP=78

0006:0000 0080 C=DATA S=CDATA G=(none) M=L12.ASM ACBP=78

Address Publics by Name

0000:0030 CLEARSCREEN

0000:0036 COMPARE

Address Publics by Value

0000:0030 CLEARSCREEN

0000:0036 COMPARE

Program entry point at 0000:0000

Сегменты, содержащиеся в модулях, были обьединены в соответствии с параметрами директивы SEGMENT.

Тип выравнивания всех сегментов – PARA (сегмент начинается с адреса, кратного 16). Тип связи кодового сегмента – PUBLIC (компоновщик последовательно соединяет все одноименные сегменты в один, все адреса пересчитываются). Тип связи сегмента данных – COMMON (компоновщик обьединяет одноименные сегменты таким образом, что они «перекрывают» друг друга).

Теперь используем упрощенные директивы определения сегментов:

l11.lst

Turbo Assembler Version 4.1 02/24/13 16:40:03 Page 1

l11.asm

1 0000 .model small

2 0000 cdata segment paracommon "data";общий сегмент данных

3 0000 40*(24) scrsvr db 64 dup("$")

4 0040 40*(24) input db 64 dup("$")

5 0080 cdata ends

6 0000 .code

7 assume ds:cdata,es:cdata

8 extrn clearscreen:far

9 extrn compare:far

10 0000 start:

11 0000 B8 0000smov ax,cdata ;настраивается сегментный регистр

12 0003 8E D8mov ds,ax

13 0005 8E C0mov es,ax

14 0007 FCcld;флаговый регистр df = 0

15

16 0008 C6 06 0000r 40mov scrsvr,64;max в первый байтscrsvr(0ah - подготовка)

17 000D BA 0000rlea dx,scrsvr;заполняем строку скринсейвера

18 0010 B4 0Amov ah,0ah

19 0012 CD 21int 21h

20

21 0014 0E E8 0000ecall clearscreen;очистка экрана воизбежание хвостов для след. ввода

22 0018 cycle:

23 0018 0E E8 0000ecall compare ;вызываем процедуру сравнения

24 001C 74 02je exit ;если строки равны, то выходим

25 001E EB F8jmp cycle ;если нет,то продолжаем



Страницы: 1 | 2 | Одной страницей


See also:
Для студента
Похожие записи

Комментарии закрыты.