Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
37
Добавлен:
01.05.2014
Размер:
70.14 Кб
Скачать

Министерство образования Российской Федерации

Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»

Кафедра МОЭВМ

Отчет по лабораторной работе №4

«Программа, подпрограмма и макрос на языке Ассемблера»

Вариант 14

Выполнили:

студенты гр. 3352

Воронин С.

Сергеев М.

Проверил:

Улитовский В.А.

Санкт-Петербург

2005 г.

Текст задания

Вычислить выражение

Z= a s1(b s2 c s3 d), где a,b,c,d- простые переменные; s1,s2,s3- арифметические операции.

  1. Каждая из арифметических операций должна быть оформлена в виде подпрограммы либо макроса в соответствии с таблицей 1.

Таблица 1

Операция

Подпрограмма

Размещение подпрограммы

s1

S1

CS

s2

S2

ES

s3

S3

файл S31.obj

  1. Простые переменные a,b,c,d организовать в соответствии с таблицей 2.

Таблица 2

Переменная

Размещение

a

DS

b

DS

c

ES

d

файл S32

  1. Вид операций, тип и длина операндов, способ передачи данных в подпрограмму и аппаратные средства, используемые для передачи данных, выбираются из таблицы 3

Таблица 3

Операции

Операнды

s1

s2

s3

Тип

Способ передачи

Средства передачи

/

-

+

б/зн

по ссылке

РОН

Описание изучаемого материала, включая директивы и операторы.

Директива ASSUME указывает ассемблеру, с каким сегментом или группой сегментов связан тот или иной сегментный регистр.

EXTRN описывает метку, определенную в другом модуле (с помощью PUBLIC).

INCLUDE имя_файла — директива, вставляющая в текст программы текст файла аналогично команде препроцессора C #include. Обычно используется для включения файлов, содержащих определения констант, структур и макросов.

Директива LABEL определяет метку и задает ее тип.

Метка, объявленная директивой PUBLIC, становится доступной для других модулей программы. Так, можно объявлять имена процедур, переменные и константы, определенные директивой EQU.

CALL Сохраняет текущий адрес в стеке и передает управление по адресу, указанному в операнде. Операндом может быть непосредственное значение адреса (метка в ассемблерных программах), регистр или переменная, содержащие адрес перехода.

RET считывает из стека слово (или двойное слово, в зависимости от режима адресации) и загружает его в IP (или EIP), выполняя тем самым действия, обратные ближнему вызову процедуры командой, CALL.

ADD Команда выполняет арифметическое сложение приемника и источника, помещает сумму в приемник, не изменяя содержимое источника.

SUB Вычитает источник из приемника и помещает разность в приемник. Приемник может быть регистром или переменной, источник может быть числом, регистром или переменной, но нельзя использовать переменную одновременно и для источника, и для приемника.

DIV Выполняет целочисленное деление без знака AL, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно.

Текст модулей на входном языке

Модуль s32.asm

d Dw 2d

Модуль S31.obj

S3 PROC far

add ax,bx

ret

S3 ENDP

Все файлы и сообщения компилятора и компоновщика

Файл LST

__Microsoft (R) Macro Assembler Version 5.10 4/13/5

Page 1-1

1 ; ТЕКСТ ПРОГРАММЫ

2

3 ; Стек программы

4

5 0000 AStack SEGMENT STACK

6 0000 000C[ DW 12 DUP(?) ; Отводится 1

2 слов памяти

7 ????

8 ]

9

10 0018 AStack ENDS

11

12 ; Данные программы

13

14 0000 DATA SEGMENT

15 0000 000C a Dw 12d

16 0002 0006 b Dw 6d

17 0004 0005 c Dw 5d

18 0006 DATA ENDS

19

20

21 0000 ESEG SEGMENT

22

23 0000 S2 PROC far

24 0000 2B C3 sub ax,bx

25 0002 CB ret

26 0003 S2 ENDP

27

28 0003 ESEG ENDS

29

30 ; Код программы

31

32 0000 CODE SEGMENT

33 ASSUME CS:CODE, DS:DATA, SS:A

Stack, ES:ESEG

34

35 ; Процедура печати строки

36 0000 S1 PROC NEAR

37 0000 F7 F3 div bx

38 0002 C3 ret

39 0003 S1 ENDP

40

41

42 include s32.asm

43 0003 0002 C d Dw 2d

44 include S31.obj

45 0005 C S3 PROC far

46 0005 03 C3 C add ax,bx

47 0007 CB C ret

48 0008 C S3 ENDP

49

50 ; Головная процедура

51 0008 Main PROC FAR

52 0008 1E push DS ;\ Сохранение

__Microsoft (R) Macro Assembler Version 5.10 4/13/5

Page 1-2

адреса начала PSP в стеке

53 0009 2B C0 sub AX,AX ; > для послед

ующего восстановления по

54 000B 50 push AX ;/ команде re

t, завершающей процедуру.

55 000C B8 ---- R mov AX,DATA ; З

агрузка сегментного

56 000F 8E D8 mov DS,AX ; р

егистра данных.

57 0011 A1 0002 R mov AX,b

58 0014 8B 1E 0004 R mov BX,c

59 0018 9A 0000 ---- R call s2

60 001D 2E: 8B 1E 0003 R mov BX,d

61 0022 9A 0005 ---- R call s3

62 0027 8B D8 mov BX,AX

63 0029 A1 0000 R mov AX,a

64 002C E8 0000 R call s1

65 002F CB ret

66

67 0030 Main ENDP

68 0030 CODE ENDS

69 END Main

__Microsoft (R) Macro Assembler Version 5.10 4/13/5

Symbols-1

Segments and Groups:

N a m e Length Align Combine Class

ASTACK . . . . . . . . . . . . . 0018 PARA STACK

CODE . . . . . . . . . . . . . . 0030 PARA NONE

DATA . . . . . . . . . . . . . . 0006 PARA NONE

ESEG . . . . . . . . . . . . . . 0003 PARA NONE

Symbols:

N a m e Type Value Attr

A . . . . . . . . . . . . . . . L WORD 0000 DATA

B . . . . . . . . . . . . . . . L WORD 0002 DATA

C . . . . . . . . . . . . . . . L WORD 0004 DATA

D . . . . . . . . . . . . . . . L WORD 0003 CODE

MAIN . . . . . . . . . . . . . . F PROC 0008 CODE Length = 0028

S1 . . . . . . . . . . . . . . . N PROC 0000 CODE Length = 0003

S2 . . . . . . . . . . . . . . . F PROC 0000 ESEG Length = 0003

S3 . . . . . . . . . . . . . . . F PROC 0005 CODE Length = 0003

@CPU . . . . . . . . . . . . . . TEXT 0101h

@FILENAME . . . . . . . . . . . TEXT lr4

@VERSION . . . . . . . . . . . . TEXT 510

66 Source Lines

66 Total Lines

17 Symbols

46414 + 410254 Bytes symbol space free

0 Warning Errors

0 Severe Errors

Файл MAP

Start Stop Length Name Class

00000H 00017H 00018H ASTACK

00020H 00025H 00006H DATA

00030H 00032H 00003H ESEG

00040H 0006FH 00030H CODE

Program entry point at 0004:0008

Файл CRF

:Olr4.ASM $ @CPU $ @VERSION ASTACK ASTACK

DATA $ Aᄂ ᄂ $ B $ C DATA ᄉ ᄉ ESEGᄃ ᄃ юя$ S2 S2 ESEG ‑ ‑ ­ ­ CODE CODE DATA ASTACK ESEG! ! " " # # яя$ S1$ $ % % & & S1' ' ( ( ) ) * 8s32.asm* $ D+ + 8lr4.ASM, , 8S31.obj, юя$ S3- - . . / / S30 0 8lr4.ASM1 1 1 2 2 юя$ MAIN3 3 4 4 5 5 6 6 DATA7 7 8 8 B9 9 C: : S2; ; D< < S3= = > > A? ? S1@ @ A A B B MAINC C CODED D MAINE

Пояснения к файлам MAP и CRF

MAP – файл содержит адреса памяти начала и конца всех сегментов программы, а также их длину и имя. В конце файла указан адрес точки входа в программу.

CRF-файл показывает, какие команды ссылаются на какие поля данных. Кроме того, ассемблер генерирует в LST-файле номера строк, которые используются в CRF-файле.

Выводы

Проделав данную лабораторную работу, мы научились использовать различные подпрограммы, а также писать программы в нескольких модулях. Ассемблер предоставляет большие возможности для реализации различных подпрограмм: ближние и дальние процедуры, макросы, модули(с дополнительными процедурами).

Соседние файлы в папке Комплект лабораторных 1-6