
Пропускаем цикл
cmp AL,00h
ax 0009
bx 0000
cx 000A
dx 0000
si 000E
di 0000
bp 0000
sp FFEE
ds 5925
es 5911
ss 5921
cs 5929
ip 0109
je end_l
ax 0009
bx 0000
cx 000A
dx 0000
si 000E
di 0000
bp 0000
sp FFEE
ds 5925
es 5911
ss 5921
cs 5929
ip 010B
or AL,30h
ax 0039
bx 0000
cx 000A
dx 0000
si 000E
di 0000
bp 0000
sp FFEE
ds 5925
es 5911
ss 5921
cs 5929
ip 010D
mov [SI],AL
ax 0039
bx 0000
cx 000A
dx 0000
si 000E
di 0000
bp 0000
sp FFEE
ds 5925
es 5911
ss 5921
cs 5929
ip 010F
pop DX
ax 0039
bx 0000
cx 000A
dx 0098
si 000E
di 0000
bp 0000
sp FFF0
ds 5925
es 5911
ss 5921
cs 5929
ip 0110
pop СX
ax 0039
bx 0000
cx 0000
dx 0098
si 000E
di 0000
bp 0000
sp FFF2
ds 5925
es 5911
ss 5921
cs 5929
ip 0111
pop BX
ax 0039
bx 0000
cx 0000
dx 0098
si 000E
di 0000
bp 0000
sp FFF4
ds 5925
es 5911
ss 5921
cs 5929
ip 0112
pop AX
ax 967F
bx 0000
cx 0000
dx 0098
si 000E
di 0000
bp 0000
sp FFF6
ds 5925
es 5911
ss 5921
cs 5929
ip 0113
ret 4
ax 967F
bx 0000
cx 0000
dx 0098
si 000E
di 0000
bp 0000
sp FFFC
ds 5925
es 5911
ss 5921
cs 5929
ip 0135
mov DX,SI
ax 967F
bx 0000
cx 0000
dx 000E
si 000E
di 0000
bp 0000
sp FFFC
ds 5925
es 5911
ss 5921
cs 5929
ip 0137
call WriteMsg
ax 0924
bx 0000
cx 0000
dx 000E
si 000E
di 0000
bp 0000
sp FFFC
ds 5925
es 5911
ss 5921
cs 5929
ip 013A
ret
ax 0924
bx 0000
cx 0000
dx 000E
si 000E
di 0000
bp 0000
sp 0000
ds 5925
es 5911
ss 5921
cs 5911
ip 0000
Terminated, exit code 0
Таблица 2
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 1
lr4_prob.ASM
1 ; Учебная программа N4 цикла лаб.раб. по дисциплине
2 ; "Организация и функционирование ЭВМ"
3 ;
4 ;
5 ; ТЕКСТ ПРОГРАММЫ
6
7 = 0024 EOFLine EQU '$' ; Определение символьной константы
8 ; "Конец строки"
9
10 ; Стек программы
11
12 0000 AStack SEGMENT STACK
13 0000 0C*(????) DW 12 DUP(?) ; Отводится 12 слов памяти
14 0018 AStack ENDS
15
16 ; Данные программы
17
18 0000 DATA SEGMENT
19
20 ; Директивы описания данных
21
22 0000 39 39 39 39 39 39 39 in_num DB '9999999'
23 = 0007 len=$-in_num ; Длина строки
24 0007 0000 tmp_DX DW 0
25 0009 0000 tmp_AX DW 0
26
27
28 000B 0A*(30) 0A 0D 24 dec_num DB 10 dup('0'),0AH,0DH,EOFLine
29 ;src_dword DD 11111111111111111111111111111111B
30 ;src_dword DD 00000000000011010001111101100000B
31 ;src_dword DD 2387568
32
33 0018 00 fig DB 0 ;Временный результат десятичной цифры
34 0019 00 flagC DB 0 ;Флаг переноса, десятичной цифры
35 001A DATA ENDS
36
37 ; Код программы
38
39 0000 CODE SEGMENT
40 ASSUME CS:CODE, DS:DATA, SS:AStack
41
42 ; Процедура печати строки
43 0000 WriteMsg PROC NEAR
44 0000 B4 09 mov AH,9
45 0002 CD 21 int 21h ; Вызов функции DOS по прерыванию
46 0004 C3 ret
47 0005 WriteMsg ENDP
48
49 ;---------------------------------------------------
50 0005 STRING_TO_DWORD PROC far
51 ; Перевод числа из строкового типа в тип DWORD
52 ; Входной параметр SI адрес конца строки, CX длина строки
53 ; Выходные параметры DX:AX результат
54 0005 53 push BX
55 0006 55 push BP
56 0007 BD 0001 mov BP, 1 ; Счетчик разряда
57 000A 8A 04 mov AL, [SI] ; Заносим количество единиц
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 2
lr4_prob.ASM
58 000C 2C 30 sub AL,'0'
59 000E 33 D2 xor DX, DX
60 0010 while_not_EOL:
61 0010 4E dec SI ; Уменьшаем позицию курсора в строке
62 0011 50 push AX ; Сохраняем текущее значения числа
63 0012 52 push DX
64 0013 33 D2 xor DX,DX
65 0015 8A 04 mov al,[SI] ; Считываем очередной символ
66 0017 2C 30 sub Al,'0'
67 0019 B4 00 mov ah,0
68 001B 51 push CX
69 001C 8B CD mov CX,BP
70 001E again_mul:
71 ; Умножение на 10 32-битного числа
72 001E 52 push DX
73 001F 50 push AX
74 0020 51 push CX
75 0021 B9 0003 mov CX,3
76 0024 shift3: ; Умножение на 8
77 0024 D1 E2 sal DX,1
78 0026 D1 E0 sal AX,1
79 0028 73 01 jnc noper0
80 002A 42 inc DX
81 002B noper0:
82 002B E2 F7 loop shift3
83
84 002D 59 pop CX
85 002E 89 16 0007r mov tmp_DX,DX
86 0032 A3 0009r mov tmp_AX,AX
87 0035 58 pop AX
88 0036 03 C0 add AX,AX ; Добавляем текущее число два раза
89 0038 73 04 jnc noper1 ; Получаем x*8+x+x=10*x
90 003A FF 06 0007r inc tmp_DX
91 003E noper1:
92 003E 01 06 0009r add tmp_AX,AX
93 0042 73 04 jnc noper2
94 0044 FF 06 0007r inc tmp_DX
95 0048 noper2:
96 0048 5A pop DX
97 0049 01 16 0007r add tmp_DX,DX
98 004D 01 16 0007r add tmp_DX,DX
99 0051 8B 16 0007r mov DX,tmp_DX
100 0055 A1 0009r mov AX,tmp_AX
101 0058 E2 C4 loop again_mul ; Повторяем умножение в завичисмости
102 ; От номера разряда x*10^n
103 005A 89 16 0007r mov tmp_DX,DX ; Сохраняем текущее значение числа DX:AX
104 005E A3 0009r mov tmp_AX,AX
105 0061 59 pop CX
106 0062 5A pop DX
107 0063 03 16 0007r add DX,tmp_DX
108 0067 58 pop AX
109 0068 03 06 0009r add AX,tmp_AX
110 006C 73 01 jnc noper ; Прибавляем значение следующего разряда
111 006E 42 inc DX
112 006F noper:
113 006F 45 inc BP
114 0070 E2 9E loop while_not_EOL ; Повторяем пока не кончится строка
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 3
lr4_prob.ASM
115
116 0072 5D pop BP
117 0073 5B pop BX
118 0074 CB ret
119 0075 STRING_TO_DWORD ENDP
120
121 0075 DWORD_TO_DEC PROC near
122 ; перевод в 10с/с , DX:AX - содержит исходное двойное слово,
123 ; SI - адрес поля младшей цифры строки-приемника,
124 ; используемые регистры AX,BX,CX,DX
125 0075 55 push BP
126 0076 8B EC mov BP,SP
127 0078 8B 56 04 mov DX,[BP+4]
128 007B 8B 46 06 mov AX,[BP+6]
129 007E 5D pop BP
130 007F 50 push AX
131 0080 53 push BX
132 0081 51 push CX
133 0082 52 push DX
134 0083 8B DA mov BX,DX
135 0085 33 D2 xor DX,DX
136 0087 B9 000A loop_bd: mov CX,10 ;
137 008A F7 F9 idiv CX ; Находим остаток от младшего слова
138 008C 88 16 0018r mov fig,DL ; Сохраняем остаток млашего слова
139 0090 83 FB 00 cmp BX,0
140 0093 75 17 jne BXNotZero
141 0095 50 push AX
142 0096 02 16 0019r add dl,flagC ; Сложение остатка и переноса и предыдущего разряда
143 009A 33 C0 xor AX,AX
144 009C 8A C2 mov al,dl ; Проверка отстаток < 10
145 009E F6 F1 div cl
146 00A0 A2 0019r mov flagC,Al
147 00A3 80 CC 30 or AH,30h
148 00A6 88 24 mov [SI],AH
149 00A8 58 pop AX
150 00A9 EB 52 90 jmp BXZero
151 ;Нахождение остатка от старшего слова
152 00AC 50 BXNotZero: push AX
153 00AD 8B C3 mov AX,BX ;
154 00AF 33 D2 xor DX,DX ;
155 00B1 F7 F1 div CX ;
156 ;Нахождение десятичного остатка
157 00B3 50 push AX
158 00B4 52 push DX
159 REPT 4
160 shl DX,1 ; Умножение на 100h
161 ENDM
1 162 00B5 D1 E2 shl DX,1 ; Умножение на 100h
1 163 00B7 D1 E2 shl DX,1 ; Умножение на 100h
1 164 00B9 D1 E2 shl DX,1 ; Умножение на 100h
1 165 00BB D1 E2 shl DX,1 ; Умножение на 100h
166 00BD 8B C2 mov AX,DX
167 00BF 33 D2 xor DX,DX
168 00C1 F7 F1 div CX
169 00C3 02 16 0018r add dl,fig ; Сложение всех остатков
170 00C7 02 16 0019r add dl,flagC ; Сложение остатка и переноса и предыдущего разряда
171 00CB 8A C2 mov al,dl ; Проверка отстаток < 10
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 4
lr4_prob.ASM
172 00CD F6 F1 div cl
173 00CF A2 0019r mov flagC,Al
174 00D2 80 CC 30 or AH,30h
175 00D5 88 24 mov [SI],AH
176 00D7 5A pop DX
177 00D8 58 pop AX
178
179 00D9 8B D8 mov BX,AX ; Сохранение частного от деления старшего слова
180 ; Нахождение шестнадцатиричного остатка старшего слова от деления на 0Ah
181 00DB B8 1999 mov AX,1999h
182 00DE 52 push DX
183 00DF F7 E2 mul DX
184 00E1 5A pop DX
185 00E2 50 push AX
186 00E3 33 C0 xor AX,AX ; 1999h*Остаток старшего слова+
187 00E5 8A C2 mov AL,DL ; +отстаток старшего слова деленный пополам(+1, если +
188 нечетный>3)
189 00E7 B1 02 mov CL,2
190 00E9 F6 F1 div CL
191 00EB 3C 01 cmp AL,1
192 00ED 7F 02 jg NotZero ; Если остаток 1, то надо добавить 0
193 00EF B4 00 mov Ah,0 ; Если остаток 3, то надо добавить 1
194 00F1 02 C4 notZero: add AL,AH
195 00F3 B4 00 mov AH,0
196 00F5 8B D0 mov DX,AX
197 00F7 58 pop AX
198 00F8 03 D0 add DX,AX
199 00FA 58 pop AX
200 00FB 03 C2 add AX,DX
201
202 00FD 4E BXZero: dec SI ;Уменшение позиции курсора в строке результата
203
204 00FE 33 D2 xor DX,DX
205 0100 3D 000A cmp AX,10 ; Проверка, нужно ли еще делить?
206 0103 72 02 jb AXB10
207 0105 EB 80 jmp loop_bd
208 0107 3C 00 AXB10: cmp AL,00h
209 0109 74 04 je end_l
210 010B 0C 30 or AL,30h
211 010D 88 04 mov [SI],AL
212 010F 5A end_l: pop DX
213 0110 59 pop CX
214 0111 5B pop BX
215 0112 58 pop AX
216 0113 C2 0004 ret 4
217 0116 DWORD_TO_DEC ENDP
218 ;
219 ;-------------------------------
220
221 ; Головная процедура
222 0116 Main PROC FAR
223 0116 1E push DS ;Сохранение адреса начала PSP в стеке
224 0117 2B C0 sub AX,AX ;для последующего восстановления по
225 0119 50 push AX ;команде ret, завершающей процедуру.
226 011A B8 0000s mov AX,DATA ; Загрузка сегментного
227 011D 8E D8 mov DS,AX ; регистра данных.
228 011F 33 C0 xor ax,ax
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 5
lr4_prob.ASM
229 0121 BE 0006r mov SI, offset in_num+len-1 ; Загрузка строки с числом
230 0124 33 C9 xor cx,cx
231 0126 B9 0006 mov cx, word ptr len-1 ; Загрузка длины строки
232 0129 0E E8 FED8 call string_to_dword ; Перевод числа
233 ; mov DX,word ptr [src_dword+2] ; Загрузка исх.байта
234 ; mov ax,word ptr [src_dword] ; Загрузка исх.байта
235 012D BE 0014r mov SI, OFFSET Dec_num + 9 ; Загрузка адреса вых.
236 ; строки
237 0130 50 push AX
238 0131 52 push DX
239 0132 E8 FF40 call DWORD_to_dec ; Преобр. байта в изобр.
240 ; 10-ного числа
241 0135 8B D6 mov DX,SI
242 0137 E8 FEC6 call WriteMsg ; Вывод на экран
243 ; 10-ного числа
244 013A CB ret ; Выход в DOS по команде,
245 ; нах-ся в 1-ом слове PSP.
246 013B Main ENDP
247 013B CODE ENDS
248 END Main
Turbo Assembler Version 2.5 16/04/02 19:13:33 Page 6
Symbol Table
Symbol Name Type Value
??DATE Text "16/04/02"
??FILENAME Text "lr4_prob"
??TIME Text "19:13:33"
??VERSION Number 0205
@CPU Text 0101H
@CURSEG Text CODE
@FILENAME Text LR4_PROB
@WORDSIZE Text 2
AGAIN_MUL Near CODE:001E
AXB10 Near CODE:0107
BXNOTZERO Near CODE:00AC
BXZERO Near CODE:00FD
DEC_NUM Byte DATA:000B
DWORD_TO_DEC Near CODE:0075
END_L Near CODE:010F
EOFLINE Number 0024
FIG Byte DATA:0018
FLAGC Byte DATA:0019
IN_NUM Byte DATA:0000
LEN Number 0007
LOOP_BD Near CODE:0087
MAIN Far CODE:0116
NOPER Near CODE:006F
NOPER0 Near CODE:002B
NOPER1 Near CODE:003E
NOPER2 Near CODE:0048
NOTZERO Near CODE:00F1
SHIFT3 Near CODE:0024
STRING_TO_DWORD Far CODE:0005
TMP_AX Word DATA:0009
TMP_DX Word DATA:0007
WHILE_NOT_EOL Near CODE:0010
WRITEMSG Near CODE:0000
Groups & Segments Bit Size Align Combine Class
ASTACK 16 0018 Para Stack
CODE 16 013B Para none
DATA 16 001A Para none
Вывод: В результате проведенной лабораторной работы, мы освоили способ вывода на экран содержимое регистров или стека в какой-либо кодировке.
Также освоили способы вызова подпрограмм типа near, far.