Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота №4.docx
Скачиваний:
3
Добавлен:
09.12.2018
Размер:
69.19 Кб
Скачать

Лабораторна робота №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