- •Лабораторна робота №4 Процедури та макроси
- •4.1 Результати виконання роботи
- •4.1.1 Лістинг файлу “mult_4.Lst”
- •4.1.2 Лістинг файлу “my_prog.Lst” програми, що задана на самостійну роботу
- •1 0000 .Model small
- •3 0000 .Data
- •38 0198 .Code
- •61 Endm; кінець макросу
- •116 Endm; кінець макросу
- •135 0077 Repeat:
- •182 End StartProg
- •4.1.3 Результати роботи програми “mult_4.Exe”
- •4.1.4 Результати роботи програми “my_prog.Exe”
Лабораторна робота №4 Процедури та макроси
Мета роботи
Ознайомитись з технікою модульного програмування в асемблері за допомогою підпрограм (процедур) та макросів.
4.1 Результати виконання роботи
Під час роботи виконували програму виведення рядків за допомогою процедур. Було виконано дану програму покроково під відлагоджувачем td.exe. В процесі роботи спостерігалась зміна значень регістрів IP та SP при роботі процедур.
4.1.1 Лістинг файлу “mult_4.Lst”
Turbo Assembler Version 4.1 08/11/11 22:38:55 Page 1
MULT_4.ASM
1 0000 .model small
2 0000 .stack 200h
3 0000 .data
4 0000 0D 0A 82 A2 A5 A4 69+ str1 DB 0dh, 0ah, 130, 162, 165, 164,
105, 226, 236, 32, 225, 168, 172, 162,
174, 171, 58, +
5 E2 EC 20 E1 A8 AC A2+ 0dh, 0ah, '$'
6 AE AB 3A 0D 0A 24
7 0014 0D 0A 89 AE A3 AE 20+ str2 DB 0dh, 0ah, 137, 174, 163, 174,
32, 170, 174, 164, 58, 0dh, 0ah, '$'
8 AA AE A4 3A 0D 0A 24
9 0022 str3 label byte
10 0022 0D 0A 89 AE A3 AE 20+ DB 0dh, 0ah, 137, 174, 163, 174, 32,
170, 174, 164, 32, 175, 174, 172, 173,
174, 166, 165, +
11 AA AE A4 20 AF AE AC+ 173, 168, 169, 32, 173, 160, 32, 52,
32, 40, 175, 224, 174, 230, 165, 164,
227, 224, 160, 41, +
12 AD AE A6 A5 AD A8 A9+ 58, 0dh, 0ah, '$'
13 20 AD A0 20 34 20 28+
14 AF E0 AE E6 A5 A4 E3+
15 E0 A0 29 3A 0D 0A 24
16 004C str4 label byte
17 004C 0D 0A 89 AE A3 AE 20+ DB 0dh, 0ah, 137, 174, 163, 174, 32,
170, 174, 164, 32, 175, 174, 172, 173,
174, 166, 165, +
18 AA AE A4 20 AF AE AC+ 173, 168, 169, 32, 173, 160, 32, 52,
32, 40, 172, 160, 170, 224, 174, 225,
41, 58, 0dh, 0ah, '$'
19 AD AE A6 A5 AD A8 A9+
20 20 AD A0 20 34 20 28+
21 AC A0 AA E0 AE E1 29+
22 3A 0D 0A 24
23 0073 0000 tmp dw 0
24 0075 0A ten db 10
25
26 0076 .code
27 0000 printnum proc
28 0000 B9 0000 mov cx, 0; лічильник цифр
29 0003 repeat:
30 0003 F6 36 0075r div [ten]; АХ=залишок ; ділене
31 0007 BA 0000 mov dx, 0; DX=0 ; 0
32 000A 8A D0 mov dl, al; DX=0 ; ділене
33 000C 8A C4 mov al, ah; АХ=залишок ; залишок
34 000E 04 30 add al, '0'; АХ=ост ; цифра
35 0010 B4 00 mov ah, 0; АХ=0 ; цифра
36 0012 50 push ax ;цифру в стек
37 0013 8B C2 mov ax, dx; АХ=0; ділене
38 0015 41 inc cx; лічильник цифр
39 0016 3D 0000 cmp ax, 0; цифр не залишилось?
40 0019 74 02 je printdigits; так, ідемо друкувати
41 001B EB E6 jmp repeat;ні, повторення розбору
42 001D printdigits:; в СХ-кількість цифр
43 001D B4 02 mov ah,2; Fn 2=вивід на екран
44 001F 5A pop dx; чергова права цифра в DL
45 0020 CD 21 int 21h; надрукували
46 0022 E2 F9 loop printdigits
47 0024 C3 ret
48 0025 printnum endp; кінець процедури
49
50 0025 MultiplyBy4 proc
51 0025 2B D2 sub dx, dx; онулення регістра dx
52 0027 D1 E0 shl ax, 1; циклічний зсув вліво регістра ax
53 0029 D1 D2 rcl dx, 1; зсув вліво регістра dx
54 002B D1 E0 shl ax, 1; циклічний зсув вліво регістра ax
55 002D D1 D2 rcl dx, 1; зсув вліво регістра dx
56 002F C3 ret; повернення в головну програму
57 0030 MultiplyBy4 endp; кінець процедури
Turbo Assembler Version 4.1 08/11/11 22:38:55 Page 2
MULT_4.ASM
58
59 Multiply_By_4 macro
60 sub dx, dx; онулення регістра dx
61 shl ax, 1; циклічний зсув вліво регістра ax
62 rcl dx, 1; зсув вліво регістра dx
63 shl ax, 1; циклічний зсув вліво регістра ax
64 rcl dx, 1; зсув вліво регістра dx
65 endm; кінець макросу
66
67 0030 StartProg:
68 0030 B8 0000s mov ax, @data
69 0033 8E D8 mov ds, ax
70 0035 B4 09 mov ah, 9
71 0037 BA 0000r mov dx, OFFSET str1
72 003A CD 21 int 21h
73 003C B4 01 mov ah, 1
74 003E CD 21 int 21h
75 0040 98 cbw; перетворення байта в слово (значення al в
ax)
76 0041 A3 0073r mov tmp, ax
77 0044 B4 09 mov ah, 9
78 0046 BA 0014r mov dx, OFFSET str2
79 0049 CD 21 int 21h
80 004B A1 0073r mov ax, tmp
81 004E E8 FFAF call PRINTNUM
82 0051 B4 09 mov ah, 9
83 0053 BA 0022r mov dx, OFFSET str3
84 0056 CD 21 int 21h
85 0058 A1 0073r mov ax, tmp
86 005B E8 FFC7 call MultiplyBy4
87 005E E8 FF9F call PRINTNUM
88
89 0061 B4 09 mov ah, 9
90 0063 BA 0000r mov dx, OFFSET str1
91 0066 CD 21 int 21h
92 0068 B4 01 mov ah, 1
93 006A CD 21 int 21h
94 006C 98 cbw; петворення байта в слово (значення al в
ax)
95 006D A3 0073r mov tmp, ax
96 0070 B4 09 mov ah, 9
97 0072 BA 0014r mov dx, OFFSET str2
98 0075 CD 21 int 21h
99 0077 A1 0073r mov ax, tmp
100 007A E8 FF83 call PRINTNUM
101 007D B4 09 mov ah, 9
102 007F BA 004Cr mov dx, OFFSET str4
103 0082 CD 21 int 21h
104 0084 A1 0073r mov ax, tmp
105 Multiply_By_4; виклик макросу MultiplyBy4
1 106 0087 2B D2 sub dx, dx; онулення регістра dx
1 107 0089 D1 E0 shl ax, 1; циклічний зсув вліво регістра ax
1 108 008B D1 D2 rcl dx, 1; зсув вліво регістра dx
1 109 008D D1 E0 shl ax, 1; циклічний зсув вліво регістра ax
1 110 008F D1 D2 rcl dx, 1; зсув вліво регістра dx
111 0091 E8 FF6C call PRINTNUM
112
113 0094 B4 08 mov ah, 8
114 0096 CD 21 int 21h
Turbo Assembler Version 4.1 08/11/11 22:38:55 Page 3
MULT_4.ASM
115 0098 B4 4C mov ah, 4ch
116 009A CD 21 int 21h
117 end StartProg
Turbo Assembler Version 4.1 08/11/11 22:38:55 Page 4
Symbol Table
Symbol Name Type Value
??DATE Text "08/11/11"
??FILENAME Text "MULT_4 "
??TIME Text "22:38:55"
??VERSION Number 040A
@32BIT Text 0
@CODE Text _TEXT
@CODESIZE Text 0
@CPU Text 0101H
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text MULT_4
@INTERFACE Text 000H
@MODEL Text 2
@STACK Text DGROUP
@WORDSIZE Text 2
MULTIPLYBY4 Near _TEXT:0025
PRINTDIGITS Near _TEXT:001D
PRINTNUM Near _TEXT:0000
REPEAT Near _TEXT:0003
STARTPROG Near _TEXT:0030
STR1 Byte DGROUP:0000
STR2 Byte DGROUP:0014
STR3 Byte DGROUP:0022
STR4 Byte DGROUP:004C
TEN Byte DGROUP:0075
TMP Word DGROUP:0073
Macro Name
MULTIPLY_BY_4
Groups & Segments Bit Size Align Combine Class
DGROUP Group
STACK 16 0200 Para Stack STACK
_DATA 16 0076 Word Public DATA
_TEXT 16 009C Word Public CODE