This repository was archived by the owner on Oct 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.asm
More file actions
188 lines (132 loc) · 3.18 KB
/
Copy pathmain.asm
File metadata and controls
188 lines (132 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
; Для каждой строки построить цифровую подпись
; посредством суммирования всех символов по модулю 2^64.
; Использовать полученные сигнатуры
; для проверки подлинности других строк.
model small
.stack 100h
.data
main_string db 255, ?, 255 dup("$") ; Главная строка
tmp db 2, ?, 2 dup(0) ; Хранение ввода пункта меню
sum dd 0b ; Хеши строк
main_sum dd 0b ; Хеш главной строки
part1 dd 0b
part2 dd 0b
input_string db 'Input string:',10,13,"$"
; ================================================================================
.code
.486
extrn print_menu:near
extrn print_result:near
extrn print_no_input:near
extrn print_no_string:near
extrn print_no_result:near
extrn io_file_read:near
extrn io_file_save:near
extrn io_result_true:near
extrn io_result_false:near
extrn flush:near
extrn buffer:byte
public work
start:
mov ax, @data
mov ds, ax
; =============== Контрольная позиция ===============
main:
call print_menu ; Вызываем вывод меню на экран
lea dx, tmp
mov ah, 0ah
int 21h
process: ; Обработка введенного пункта меню
cmp tmp[2], '0'
je exit
cmp tmp[2], '1'
je main
cmp tmp[2], '2'
je new_string
cmp tmp[2], '3'
je file_read
cmp tmp[2], '4'
je file_save
cmp tmp[2], '5'
je output
call print_no_input
jmp main
; =============== Ввод главной строки ===============
new_string:
lea dx, input_string
mov ah, 9
int 21h
lea dx, main_string
mov ah, 0ah
int 21h
mov main_sum, 0b
mov si, 2
new_string_loop:
lodsb
cmp al, 0Dh ; Проверка на конец строки
je main
call work_quadruple
add main_sum, edx
jmp new_string_loop
; =============== Обработка строк ===============
work proc near
xor ax, ax
xor si, si
mov sum, 0
work_sign:
mov al, buffer[esi]
; Конец строки
cmp ax, 0Dh
je work_compare
call work_quadruple
add sum, edx
inc si
jmp work_sign
work_quadruple:
cbw ; al -> ax
cwde ; ax -> eax
cdq ; eax -> edx:eax
mov part1, eax
mov part2, edx
xor edx, edx
add edx, part1
add edx, part2
ret
work_compare:
mov eax, sum
mov ebx, main_sum
cmp eax, ebx
jne work_write_false
je work_write_true
work_write_true:
call io_result_true
ret
work_write_false:
call io_result_false
ret
work endp
; =============== Загрузка из файла ===============
file_read:
cmp main_string[2], "$" ; Проверяем, есть ли главная строка
je no_string
call io_file_read
jmp main
; =============== Сохранение файла ===============
file_save:
call io_file_save
jmp main
; =============== Разное ===============
; Вывод результата на экран
output:
call print_result
jmp main
; Отсутствует главная строка
no_string:
call print_no_string
jmp main
; =============== Конец программы ===============
exit:
call flush
mov ax, 4c00h
int 21h
end