ХАНДЫФАР
Программа которая подсчитывает количество слов в заданной строке.
title
Автор: Довгополов Евгений Сергеевич
.
model
small
.
stack
100
h
data
segment
public
____
string
db
_
"I've got many friends in "
___________
db
_
"China$"
____
strlen
equ
(
$
-
string
)
____
output
db
_
"Number of words: $"
____
count
_
dw
_
0
data
ends
code
segment
public
____
assume
ds
:
data
,
cs
:
code
____
main
proc
________
mov
____
ax
,
seg
data
________
mov
____
ds
,
ax
________
xor
_____
si
,
si
________
mov
____
cx
,
strlen
________
lea
____
bx
,
ds
:
[
string
]
____
MainLoop
:
________
cmp
____
byte ptr
[
bx
+
si
-
1
]
,
20
h
________
jne
____
Skip
________
inc
____
count
____
Skip
:
________
inc
____
si
________
loop
___
MainLoop
________
inc
____
count
________
mov
____
ah
,
09
h
________
lea
____
dx
,
ds
:
[
output
]
________
int
____
21h
________
mov
____
dx
,
count
________
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
_
"I've got many friends in China$"
; У меня много друзей в Китае
____
strlen
equ
(
$
-
string
)
_______________________
; Вычисляем длину массива string
____
output
db
_
"Number of words: $"
_____________
; Число слов:
____
count
_
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
________
xor
_____
si
,
si
__________________
; Обнуляем регистр-счётчик si
________
mov
____
cx
,
strlen
______________
; Копируем значение переменной strlen в регистр cx
________
lea
____
bx
,
ds
:
[
string
]
_________
; Загружаем адрес переменной string в регистр ds:bx
____
MainLoop
:
________
cmp
____
byte ptr
[
bx
+
si
-
1
]
,
20
h
__
; Сравниваем значение в bx под индексом si-1 с пробелом
________
jne
____
Skip
____________________
; Если ZF=0, то прыгаем на метку Skip
________
inc
____
count
___________________
; Увеличиваем значение переменной count на 1
____
Skip
:
________
inc
____
si
______________________
; Увеличиваем значение индекса si на 1
________
loop
___
MainLoop
________________
; Выполняем цикл пока CX≠0
________
inc
____
count
___________________
; Увеличиваем значение count на 1. Учитываем последнее слово
________
mov
____
ah
,
09
h
_________________
; Копируем значение функции вывода строки в регистр ah
________
lea
____
dx
,
ds
:
[
output
]
_________
; Загружаем адрес переменной output в регистр ds:dx
________
int
____
21h
_____________________
; Вызываем прерывание
________
mov
____
dx
,
count
_______________
; Копируем значение переменной result в регистр dx
________
call
___
PrintNumber
_____________
; Вызываем процедуру PrintNumber
________
mov
____
ax
,
4C00
h
_______________
; Копируем значение функции завершения в ah а значение в al
________
int
____
21h
_____________________
; Вызываем прерывание
____
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
33 F6
B9 001F
8D 36 0000
80 78 FF 20
__
75 04
FF 06 0031
46
E2 F3
FF 06 0031
B4 09
8D 16 001F
CD 21
8B 16 0031
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