Комплект лабораторных 1-6 / Лаба 4
.docМинистерство образования Российской Федерации
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
Кафедра МОЭВМ
Отчет по лабораторной работе №4
«Программа, подпрограмма и макрос на языке Ассемблера»
Вариант 14
Выполнили:
студенты гр. 3352
Воронин С.
Сергеев М.
Проверил:
Улитовский В.А.
Санкт-Петербург
2005 г.
Текст задания
Вычислить выражение
Z= a s1(b s2 c s3 d), где a,b,c,d- простые переменные; s1,s2,s3- арифметические операции.
-
Каждая из арифметических операций должна быть оформлена в виде подпрограммы либо макроса в соответствии с таблицей 1.
Таблица 1
Операция |
Подпрограмма |
Размещение подпрограммы |
s1 |
S1 |
CS |
s2 |
S2 |
ES |
s3 |
S3 |
файл S31.obj |
-
Простые переменные a,b,c,d организовать в соответствии с таблицей 2.
Таблица 2
Переменная |
Размещение |
a |
DS |
b |
DS |
c |
ES |
d |
файл S32 |
-
Вид операций, тип и длина операндов, способ передачи данных в подпрограмму и аппаратные средства, используемые для передачи данных, выбираются из таблицы 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-файле.
Выводы
Проделав данную лабораторную работу, мы научились использовать различные подпрограммы, а также писать программы в нескольких модулях. Ассемблер предоставляет большие возможности для реализации различных подпрограмм: ближние и дальние процедуры, макросы, модули(с дополнительными процедурами).