ХАНДЫФАР
Программа, которая находит числа в строке и вычисляет их сумму.
title
Автор: Довгополов Евгений Сергеевич
.
model
small
.
stack
100
h
data
segment
public
____
string
db
"I was born in 1988, "
___________
db
"March 17$"
data
ends
code
segment
public
____
assume
ds
:
data
,
cs
:
code
____
main
proc
________
mov
____
ax
,
seg
data
________
mov
____
ds
,
ax
________
lea
____
si
,
ds
:
[
string
]
________
call
___
FindNumber
________
mov
____
ax
,
4C00
h
________
int
____
21h
____
main
endp
____
FindNumber
proc
________
push
___
ax
________
push
___
bx
________
push
___
cx
________
push
___
dx
________
push
___
si
________
xor
____
ax
,
ax
________
xor
____
cx
,
cx
____
FindLoop
:
________
lodsb
________
cmp
____
al
,
24
h
________
je
_____
Finish
________
cmp
____
al
,
30
h
________
jb
_____
FindLoop
________
cmp
____
al
,
39
h
________
ja
_____
FindLoop
________
and
____
al
,
0F
h
________
add
____
cx
,
ax
________
jmp
____
FindLoop
____
Finish
:
________
test
___
cx
,
cx
________
jnz
____
HasNumbers
________
mov
____
ah
,
02
h
________
mov
____
dl
,
30
h
________
int
____
21h
________
jmp
____
Done
____
HasNumbers
:
________
xchg
___
ax
,
cx
________
aam
________
or
_____
ax
,
3030
h
________
xchg
___
ax
,
bx
________
mov
____
ah
,
02
h
________
cmp
____
bh
,
30
h
________
jz
_____
PrintOneNumber
________
mov
____
dl
,
bh
________
int
____
21h
____
PrintOneNumber
:
________
mov
____
dl
,
bl
________
int
____
21h
____
Done
:
________
pop
____
si
________
pop
____
dx
________
pop
____
cx
________
pop
____
bx
________
pop
____
ax
________
ret
____
FindNumber
endp
code
ends
end
main
Программа, которая находит числа в строке и вычисляет их сумму.
title
Автор: Довгополов Евгений Сергеевич
.
model
small
.
stack
100
h
data
segment
public
____
string
db
"I was born in 1988, March 17$"
data
ends
code
segment
public
_____________
; Начало сегмента кода
____
assume
ds
:
data
,
cs
:
code
____
main
proc
___________________
; Начало процедуры main
________
mov
____
ax
,
seg
data
_____
; Получаем адрес сегмента памяти данных и сохраняем его в ax
________
mov
____
ds
,
ax
___________
; Передаём адрес сегмента памяти данных из регистра ax в ds
________
lea
____
si
,
ds
:
[
string
]
__
; Загружаем адрес переменной string в регистр ds:si
________
call
___
FindNumber
_______
; Вызываем процедуру FindNumber
________
mov
____
ax
,
4C00
h
________
; Копируем значение функции завершения в ah а значение в al
________
int
____
21h
______________
; Вызываем прерывание DOS
____
main
endp
___________________
; Конец процедуры main
____
FindNumber
proc
______________
; Начало процедуры FindNumber
________
push
___
ax
_______________
; Сохраняем значение регистра ax в стеке
________
push
___
bx
_______________
; Сохраняем значение регистра bx в стеке
________
push
___
cx
_______________
; Сохраняем значение регистра cx в стеке
________
push
___
dx
_______________
; Сохраняем значение регистра dx в стеке
________
push
___
si
_______________
; Сохраняем значение регистра si в стеке
________
xor
____
ax
,
ax
___________
; Обнуляем значение регистра ax
________
xor
____
cx
,
cx
___________
; Обнуляем значение регистра cx
____
FindLoop
:
________
lodsb
____________________
; Загружаем байт из регистра si в регистр al
________
cmp
____
al
,
24
h
__________
; Сравниваем значение в регистре al с 24h - '$'
________
je
_____
Finish
___________
; Если ZF=1, то прыгаем на метку Finish
________
cmp
____
al
,
30
h
__________
; Сравниваем значение в регистре al с ASCII значением 0
________
jb
_____
FindLoop
_________
; Если значение в al ниже чем 0, то прыгаем на метку FindLoop
________
cmp
____
al
,
39
h
__________
; Сравниваем значение в регистре al с ASCII значением 9
________
ja
_____
FindLoop
_________
; Если значение в al выше чем 9, то прыгаем на метку FindLoop
________
and
____
al
,
0F
h
__________
; Применяем маску, где обнуляем старший полубайт регистра al
________
add
____
cx
,
ax
___________
; Прибавляем значение в регистре ax к значению в регистре cx
________
jmp
____
FindLoop
_________
; Выполняем безусловный переход на метку FindLoop
____
Finish
:
________
test
___
cx
,
cx
________
jnz
____
HasNumbers
________
mov
____
ah
,
02
h
__________
; Копируем значение функции вывода на консоль в регистр ah
________
mov
____
dl
,
30
h
__________
; Копируем ASCII значение 0 регистре dl
________
int
____
21h
______________
; Вызываем прерывание DOS
________
jmp
____
Done
_____________
; Выполняем безусловный переход на метку Done
____
HasNumbers
:
________
xchg
___
ax
,
cx
___________
; Выполняем обмен содержимого регистров ax и cx
________
aam
______________________
; Создаём пару распакованных значений BCD (основание 10)
________
or
_____
ax
,
3030
h
________
; Выполняем преобразование значения в регистре ax в ASCII число
________
xchg
___
ax
,
bx
___________
; Выполняем обмен содержимого регистров ax и bx
________
mov
____
ah
,
02
h
__________
; Копируем значение функции вывода на консоль в регистр ah
________
cmp
____
bh
,
30
h
__________
; Сравниваем значение в регистре bh с ASCII значением 0
________
jz
_____
PrintOneNumber
________
mov
____
dl
,
bh
___________
; Копируем значение регистра bh в регистр dl
________
int
____
21h
______________
; Вызываем прерывание DOS
____
PrintOneNumber
:
________
mov
____
dl
,
bl
___________
; Копируем значение регистра bl в регистр dl
________
int
____
21h
______________
; Вызываем прерывание DOS
____
Done
:
________
pop
____
si
_______________
; Выталкиваем значение из стека в регистр si
________
pop
____
dx
_______________
; Выталкиваем значение из стека в регистр dx
________
pop
____
cx
_______________
; Выталкиваем значение из стека в регистр cx
________
pop
____
bx
_______________
; Выталкиваем значение из стека в регистр bx
________
pop
____
ax
_______________
; Выталкиваем значение из стека в регистр ax
________
ret
______________________
; Возврат из процедуры
____
FindNumber
endp
______________
; Конец процедуры FindNumber
code
ends
_______________________
; Конец сегмента кода
end
main
________________________
; Конец файла. Точкой входа указывается процедура main
8E D8
8D 36 0000
__
B8 4C00
CD 21
50
53
51
52
56
33 C0
33 C9
AC
3C 24
74 0E
3C 30
72 F7
3C 39
77 F3
24 0F
03 C8
EB ED
85 C9
75 09
B4 02
B2 30
CD 21
EB 17 90
91
D4 0A
0D 3030
93
B4 02
80 FF 30
74 04
8A D7
CD 21
8A D3
CD 21
5E
5A
59
5B
58
C3
Made on
Tilda