; Assembler. Task №1.
; 13. Malashenkov Anton. group 1538. ITMO, KT.
; Variant 1. HashTable
;cl - key/value
;ch - enter?
;bx - hash
org 100h
xor cl, cl
xor bx, bx
xor ch, ch
ReadChar:
mov ah, 01h
int 21h
cmp al, CODE_SPACE
je Space
cmp al, CODE_ENTER
je Enter_1
mov ch, 0
cmp cl, 1
call InsertNextCharOfValue
cmp cl, 0
call CalcHash
jmp ReadChar
Enter_1:
cmp ch, 1
je Start
mov byte[si], '$'
mov cl, 0
xor ch, 1
jmp ReadChar
InsertNextCharOfValue:
mov [si], al
inc si
ret
Space:
;-------------------
; mov ah, 02h
; mov dx, bx
; int 21h
; jmp exit0
;-------------------
mov cl, 1
mov di, HashTable
mov si, HashTable
while_bx_nz_1:
cmp bx, 0
je end_while_1
add di, LENGTH_WORDS
dec bx
jmp while_bx_nz_1
end_while_1:
mov si, di
jmp ReadChar
CalcHash:
;hash = (hash * 29 + s[i]) % 1543, where s[i] - iый символ ключа
push cx
imul bx, 29
mov di, SIZE_HASH_TABLE
mov ax, bx
div di
mov bx, dx
pop cx
ret
Start:
xor ch, ch
xor bx, bx
ReadQuery:
mov ah, 01h
int 21h
cmp al, CODE_ENTER
je Enter_2
call CalcHash
mov ch, 0
jmp ReadQuery
Enter_2:
cmp ch, 1
je exit0
mov ch, 1
FindValue:
mov di, HashTable
while_bx_nz_2:
cmp bx, 0
je end_while_2
add di, LENGTH_WORDS
dec bx
jmp while_bx_nz_2
end_while_2:
mov ah, 9
mov dx, di
int 21h
mov ah, 9
mov dx, NewLine
int 21h
jmp ReadQuery
exit0:
mov ax, 4c00h
int 21h
HashTable: rb (SIZE_HASH_TABLE * LENGTH_WORDS)
NewLine: db 13, 10, '$'
CODE_ENTER = 13
CODE_SPACE = 32
LENGTH_WORDS = 16
SIZE_HASH_TABLE = 1543
OyBBc3NlbWJsZXIuIFRhc2sg4oSWMS4KOyAxMy4gTWFsYXNoZW5rb3YgQW50b24uIGdyb3VwIDE1MzguIElUTU8sIEtULgo7IFZhcmlhbnQgMS4gSGFzaFRhYmxlCgo7Y2wgLSBrZXkvdmFsdWUKO2NoIC0gZW50ZXI/CjtieCAtIGhhc2gKCglvcmcgMTAwaAoJeG9yIGNsLCBjbAoJeG9yIGJ4LCBieAoJeG9yIGNoLCBjaAoKUmVhZENoYXI6Cgltb3YgYWgsIDAxaAoJaW50IDIxaAoJY21wIGFsLCBDT0RFX1NQQUNFCgkJamUgU3BhY2UKCgljbXAgYWwsIENPREVfRU5URVIKCQlqZSBFbnRlcl8xCgoJbW92IGNoLCAwCgljbXAgY2wsIDEKCQljYWxsIEluc2VydE5leHRDaGFyT2ZWYWx1ZQoKCWNtcCBjbCwgMAoJCWNhbGwgQ2FsY0hhc2gKCglqbXAgUmVhZENoYXIKCkVudGVyXzE6CgljbXAgY2gsIDEKCQlqZSBTdGFydAoKCW1vdiBieXRlW3NpXSwgJyQnCgltb3YgY2wsIDAKCXhvciBjaCwgMQoJam1wIFJlYWRDaGFyCgpJbnNlcnROZXh0Q2hhck9mVmFsdWU6Cgltb3YgW3NpXSwgYWwKCWluYyBzaQoJcmV0CgpTcGFjZToKOy0tLS0tLS0tLS0tLS0tLS0tLS0KOwltb3YgYWgsIDAyaAo7CW1vdiBkeCwgYngKOwlpbnQgMjFoCjsJam1wIGV4aXQwCjstLS0tLS0tLS0tLS0tLS0tLS0tCgltb3YgY2wsIDEKCW1vdiBkaSwgSGFzaFRhYmxlCgltb3Ygc2ksIEhhc2hUYWJsZQoJd2hpbGVfYnhfbnpfMToKCQljbXAgYngsIDAKCQkJamUgZW5kX3doaWxlXzEKCgkJYWRkIGRpLCBMRU5HVEhfV09SRFMKCQlkZWMgYngKCQlqbXAgd2hpbGVfYnhfbnpfMQoKCWVuZF93aGlsZV8xOgoJCW1vdiBzaSwgZGkKCQlqbXAgUmVhZENoYXIKCkNhbGNIYXNoOgoJO2hhc2ggPSAoaGFzaCAqIDI5ICsgc1tpXSkgJSAxNTQzLCB3aGVyZSBzW2ldIC0gadGL0Lkg0YHQuNC80LLQvtC7INC60LvRjtGH0LAKCXB1c2ggY3gKCglpbXVsIGJ4LCAyOQoJbW92IGRpLCBTSVpFX0hBU0hfVEFCTEUKCW1vdiBheCwgYngKCWRpdiBkaQoJbW92IGJ4LCBkeAoKCXBvcCBjeAoJcmV0CgpTdGFydDoKCXhvciBjaCwgY2gKCXhvciBieCwgYngKClJlYWRRdWVyeToKCW1vdiBhaCwgMDFoCglpbnQgMjFoCgljbXAgYWwsIENPREVfRU5URVIKCQlqZSBFbnRlcl8yCgoJY2FsbCBDYWxjSGFzaAoJbW92IGNoLCAwCglqbXAgUmVhZFF1ZXJ5CgpFbnRlcl8yOgoJY21wIGNoLCAxCgkJamUgZXhpdDAKCgltb3YgY2gsIDEKCkZpbmRWYWx1ZToKCW1vdiBkaSwgSGFzaFRhYmxlCgl3aGlsZV9ieF9uel8yOgoJCWNtcCBieCwgMAoJCQlqZSBlbmRfd2hpbGVfMgoKCQlhZGQgZGksIExFTkdUSF9XT1JEUwoJCWRlYyBieAoJCWptcCB3aGlsZV9ieF9uel8yCgoJZW5kX3doaWxlXzI6CgkJbW92IGFoLCA5CgkJbW92IGR4LCBkaQoJCWludCAyMWgKCgkJbW92IGFoLCA5CgkJbW92IGR4LCBOZXdMaW5lCgkJaW50IDIxaAoKCQlqbXAgUmVhZFF1ZXJ5CgpleGl0MDoKCW1vdiBheCwgNGMwMGgKCWludCAyMWgKCkhhc2hUYWJsZTogcmIgKFNJWkVfSEFTSF9UQUJMRSAqIExFTkdUSF9XT1JEUykKTmV3TGluZTogZGIgMTMsIDEwLCAnJCcKCkNPREVfRU5URVIgPSAxMwpDT0RFX1NQQUNFID0gMzIKTEVOR1RIX1dPUkRTID0gMTYKU0laRV9IQVNIX1RBQkxFID0gMTU0Mwo=