ХАНДЫФАР
Программа, которая считет количество всех гласных букв в строке.
title
Автор: Довгополов Евгений Сергеевич
.
model
small
.
stack
100
h
data
segment
public
____
string
db
"Intel 8086. Microsoft "
___________
db
"Macro Assembler"
____
vowels
db
"aeiouAEIOU"
____
output
db
"Number of vowels: $"
____
result
dw
0
data
ends
code
segment
public
____
assume
ds
:
data
,
cs
:
code
____
main
proc
________
mov
____
ax
,
seg
data
________
mov
____
ds
,
ax
________
mov
____
es
,
ax
________
mov
____
cx
,
37
________
lea
____
di
,
es
:
[
vowels
]
________
lea
____
si
,
ds
:
[
string
]
____
OuterLoop
:
________
push
___
cx
________
mov
____
cx
,
10
________
lodsb
________
push
___
di
__
repnz
scasb
________
jne
____
Skip
________
inc
____
result
____
Skip
:
________
pop
____
cx
________
pop
____
cx
________
loop
___
OuterLoop
________
mov
____
ah
,
09
h
________
lea
____
dx
,
ds
:
[
output
]
________
int
____
21h
________
mov
____
dx
,
result
________
call
___
PrintNumber
________
mov
____
ax
,
4C00
h
________
int
____
21h
____
main
endp
____
PrintNumber
proc
________
mov
____
ax, dx
________
mov
____
bx
,
10
________
cwd
________
div
____
bx
________
mov
____
cl
,
8
________
shl
____
ax
,
cl
________
xchg
___
al
,
dl
________
or
_____
ax
,
3030
h
________
xchg
___
ax
,
bx
________
mov
____
ah
,
02
h
________
cmp
____
bh
,
30
h
________
je
_____
PrintOneDigit
________
mov
____
dl
,
bh
________
int
____
21h
____
PrintOneDigit
:
________
mov
____
dl
,
bl
________
int
____
21h
________
ret
____
PrintNumber
endp
code
ends
end
main
Программа, которая считет количество всех гласных букв в строке.
title
Автор: Довгополов Евгений Сергеевич
.
model
small
.
stack
100
h
data
segment
public
____
string
db
"Intel 8086. Microsoft Macro Assembler"
____
vowels
db
"aeiouAEIOU"
____
output
db
"Number of vowels: $"
____
result
dw
0
data
ends
code
segment
public
_____________
; Начало сегмента кода
____
assume
ds
:
data
,
cs
:
code
____
main
proc
___________________
; Начало процедуры main
________
mov
____
ax
,
seg
data
_____
; Получаем адрес сегмента памяти данных и сохраняем его в ax
________
mov
____
ds
,
ax
___________
; Передаём адрес сегмента памяти данных из регистра ax в ds
________
mov
____
es
,
ax
___________
; Передаём адрес сегмента памяти данных из регистра ax в es
________
mov
____
cx
,
37
___________
; Копируем значение 37 в регистр cx (длина строки string)
________
lea
____
di
,
es
:
[
vowels
]
__
; Загружаем адрес массива vowels в регистр es:di
________
lea
____
si
,
ds
:
[
string
]
__
; Загружаем адрес массива string в регистр ds:si
____
OuterLoop
:
________
push
___
cx
_______________
; Сохраняем значение регистра cx в стеке
________
mov
____
cx
,
10
___________
; Копируем значение 10 в регистр cx (количество гласных)
________
lodsb
____________________
; Загружаем байт из регистра-источника si в регистр al
________
push
___
di
_______________
; Сохраняем значение регистра di в стеке
__
repnz
scasb
____________________
; Сканируем байт в регистре al с байтами в регистре di пока CX≠0
________
jne
____
Skip
_____________
; Если ZF=0, то прыгаем на метку Skip
________
inc
____
result
___________
; Увеличиваем значение переменной result
____
Skip
:
________
pop
____
cx
_______________
; Выталкиваем значение из стека в регистр di
________
pop
____
cx
_______________
; Выталкиваем значение из стека в регистр cx
________
loop
___
OuterLoop
________
; Выполняем цикл пока CX≠0
________
mov
____
ah
,
09
h
__________
; Копируем значение функции вывода строки в регистр ah
________
lea
____
dx
,
ds
:
[
output
]
__
; Загружаем адрес переменной output в регистр ds:dx
________
int
____
21h
______________
; Вызываем прерывание
________
mov
____
dx
,
result
_______
; Копируем значение переменной result в регистр dx
________
call
___
PrintNumber
______
; Вызываем процедуру PrintNumber
________
mov
____
ax
,
4C00
h
________
; Копируем значение функции завершения в ah а значение в al
________
int
____
21h
______________
; Вызываем прерывание DOS
____
main
endp
___________________
; Конец процедуры main
____
PrintNumber
proc
________
mov
____
ax
,
dx
___________
; Копируем значение регистра dx в регистр ax
________
mov
____
bx
,
10
___________
; Копируем число 10 в регистр bx
________
cwd
______________________
; Выполняем знаковое расширение регистра dx
________
div
____
bx
_______________
; Выполняем деление значения в регистре ax на bx (10)
________
mov
____
cl
,
8
____________
; Копируем число 8 в регистр cl
________
shl
____
ax
,
cl
___________
; Выполняем логический сдвиг влево на количество в регистре cl
________
xchg
___
al
,
dl
___________
; Выполняем обмен содержимого регистров al и dl
________
or
_____
ax
,
3030
h
________
; Выполняем логическое ИЛИ над ax с 3030
________
xchg
___
ax
,
bx
___________
; Выполняем обмен содержимого регистров ax и bx
________
mov
____
ah
,
02
h
__________
; Копируем значение функции вывода на консоль в регистр ah
________
cmp
____
bh
,
30
h
__________
; Сравниваем значение в регистре bh c 30h
________
je
_____
PrintOneDigit
____
; Если ZF=1, то прыгаем на метку PrintOneDigit
________
mov
____
dl
,
bh
___________
; Копируем значение регистра bh в регистр dl
________
int
____
21h
______________
; Вызываем прерывание
____
PrintOneDigit
:
________
mov
____
dl
,
bl
___________
; Копируем значение регистра bl в регистр dl
________
int
____
21h
______________
; Вызываем прерывание
________
ret
______________________
; Возврат из процедуры
____
PrintNumber
endp
code
ends
_______________________
; Конец сегмента кода
end
main
________________________
; Конец файла. Точкой входа указывается процедура main
8E D8
8E C0
8D 3E 0025
__
8D 36 0000
B9 0025
51
B9 000A
AC
57
F2 AE
75 04
FF 06 0042
5F
59
E2 EE
B4 09
8D 16 002F
CD 21
8B 16 0042
B8 4C00
CD 21
8B C2
BB 000A
99
F7 F3
B1 08
D3 E0
86 C2
0D 3030
93
B4 02
80 FF 30
74 04
8A D7
CD 21
8A D3
CD 21
C3
Made on
Tilda