451 lines
6.1 KiB
Text
Executable file
451 lines
6.1 KiB
Text
Executable file
.486
|
|
.model flat
|
|
extrn __fltused:near
|
|
extrn __ftol:near
|
|
public _main
|
|
_TEXT segment
|
|
_main:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,24
|
|
mov dword ptr (-24)[ebp],0
|
|
mov dword ptr (_next),0
|
|
jmp L3
|
|
L2:
|
|
lea edi,(-24)[ebp]
|
|
push edi
|
|
lea edi,(-20)[ebp]
|
|
push edi
|
|
call _lookup
|
|
add esp,8
|
|
inc dword ptr [eax]
|
|
L3:
|
|
lea edi,(-20)[ebp]
|
|
push edi
|
|
call _getword
|
|
add esp,4
|
|
cmp eax,0
|
|
jne L2
|
|
mov edi,dword ptr (-24)[ebp]
|
|
push edi
|
|
call _tprint
|
|
add esp,4
|
|
mov eax,0
|
|
L1:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _err
|
|
_err:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
lea edi,(L6)
|
|
push edi
|
|
call _printf
|
|
add esp,8
|
|
push 1
|
|
call _exit
|
|
add esp,4
|
|
mov eax,0
|
|
L5:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _getword
|
|
_getword:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,8
|
|
L8:
|
|
L9:
|
|
call _getchar
|
|
add esp,0
|
|
mov dword ptr (-4)[ebp],eax
|
|
cmp eax,-1
|
|
je L11
|
|
mov edi,dword ptr (-4)[ebp]
|
|
push edi
|
|
call _isletter
|
|
add esp,4
|
|
cmp eax,0
|
|
je L8
|
|
L11:
|
|
mov edi,dword ptr (20)[ebp]
|
|
mov dword ptr (-8)[ebp],edi
|
|
jmp L15
|
|
L12:
|
|
mov edi,dword ptr (-8)[ebp]
|
|
lea esi,(1)[edi]
|
|
mov dword ptr (-8)[ebp],esi
|
|
mov esi,dword ptr (-4)[ebp]
|
|
mov ebx,esi
|
|
mov byte ptr [edi],bl
|
|
L13:
|
|
call _getchar
|
|
add esp,0
|
|
mov dword ptr (-4)[ebp],eax
|
|
L15:
|
|
mov edi,dword ptr (-4)[ebp]
|
|
push edi
|
|
call _isletter
|
|
add esp,4
|
|
mov dword ptr (-4)[ebp],eax
|
|
cmp eax,0
|
|
jne L12
|
|
mov edi,dword ptr (-8)[ebp]
|
|
mov byte ptr [edi],0
|
|
mov edi,dword ptr (-8)[ebp]
|
|
mov esi,dword ptr (20)[ebp]
|
|
cmp edi,esi
|
|
jbe L16
|
|
mov eax,1
|
|
jmp L7
|
|
L16:
|
|
mov eax,0
|
|
L7:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _isletter
|
|
_isletter:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
mov edi,dword ptr (20)[ebp]
|
|
cmp edi,65
|
|
jl L19
|
|
cmp edi,90
|
|
jg L19
|
|
add dword ptr (20)[ebp],32
|
|
L19:
|
|
mov edi,dword ptr (20)[ebp]
|
|
cmp edi,97
|
|
jl L21
|
|
cmp edi,122
|
|
jg L21
|
|
mov eax,dword ptr (20)[ebp]
|
|
jmp L18
|
|
L21:
|
|
mov eax,0
|
|
L18:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _lookup
|
|
_lookup:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,4
|
|
mov edi,dword ptr (24)[ebp]
|
|
mov edi,dword ptr [edi]
|
|
cmp edi,0
|
|
je L24
|
|
mov edi,dword ptr (24)[ebp]
|
|
mov edi,dword ptr [edi]
|
|
mov edi,dword ptr (12)[edi]
|
|
push edi
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
call _strcmp
|
|
add esp,8
|
|
mov dword ptr (-4)[ebp],eax
|
|
cmp dword ptr (-4)[ebp],0
|
|
jge L26
|
|
mov edi,dword ptr (24)[ebp]
|
|
mov edi,dword ptr [edi]
|
|
lea edi,(4)[edi]
|
|
push edi
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
call _lookup
|
|
add esp,8
|
|
mov edi,eax
|
|
jmp L23
|
|
L26:
|
|
cmp dword ptr (-4)[ebp],0
|
|
jle L28
|
|
mov edi,dword ptr (24)[ebp]
|
|
mov edi,dword ptr [edi]
|
|
lea edi,(8)[edi]
|
|
push edi
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
call _lookup
|
|
add esp,8
|
|
mov edi,eax
|
|
jmp L23
|
|
L28:
|
|
mov edi,dword ptr (24)[ebp]
|
|
mov eax,dword ptr [edi]
|
|
jmp L23
|
|
L24:
|
|
cmp dword ptr (_next),2000
|
|
jl L30
|
|
lea edi,(L32)
|
|
push edi
|
|
call _err
|
|
add esp,4
|
|
L30:
|
|
mov edi,dword ptr (_next)
|
|
sal edi,4
|
|
mov dword ptr (_words)[edi],0
|
|
mov edi,dword ptr (_next)
|
|
sal edi,4
|
|
mov dword ptr (_words+8)[edi],0
|
|
mov dword ptr (_words+4)[edi],0
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
call _strlen
|
|
add esp,4
|
|
lea edi,(1)[eax]
|
|
push edi
|
|
call _malloc
|
|
add esp,4
|
|
mov esi,dword ptr (_next)
|
|
sal esi,4
|
|
mov dword ptr (_words+12)[esi],eax
|
|
mov edi,dword ptr (_next)
|
|
sal edi,4
|
|
mov edi,dword ptr (_words+12)[edi]
|
|
cmp edi,0
|
|
jne L36
|
|
lea edi,(L39)
|
|
push edi
|
|
call _err
|
|
add esp,4
|
|
L36:
|
|
mov edi,dword ptr (20)[ebp]
|
|
push edi
|
|
mov edi,dword ptr (_next)
|
|
sal edi,4
|
|
mov edi,dword ptr (_words+12)[edi]
|
|
push edi
|
|
call _strcpy
|
|
add esp,8
|
|
mov edi,dword ptr (_next)
|
|
lea esi,(1)[edi]
|
|
mov dword ptr (_next),esi
|
|
sal edi,4
|
|
lea edi,(_words)[edi]
|
|
mov esi,dword ptr (24)[ebp]
|
|
mov dword ptr [esi],edi
|
|
mov eax,edi
|
|
L23:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _tprint
|
|
_tprint:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
mov edi,dword ptr (20)[ebp]
|
|
cmp edi,0
|
|
je L42
|
|
mov edi,dword ptr (20)[ebp]
|
|
mov edi,dword ptr (4)[edi]
|
|
push edi
|
|
call _tprint
|
|
add esp,4
|
|
mov edi,dword ptr (20)[ebp]
|
|
mov esi,dword ptr (12)[edi]
|
|
push esi
|
|
mov edi,dword ptr [edi]
|
|
push edi
|
|
lea edi,(L44)
|
|
push edi
|
|
call _printf
|
|
add esp,12
|
|
mov edi,dword ptr (20)[ebp]
|
|
mov edi,dword ptr (8)[edi]
|
|
push edi
|
|
call _tprint
|
|
add esp,4
|
|
L42:
|
|
mov eax,0
|
|
L41:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
public _strcmp
|
|
_strcmp:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
mov ebp,esp
|
|
jmp L47
|
|
L46:
|
|
mov edi,dword ptr (20)[ebp]
|
|
lea esi,(1)[edi]
|
|
mov dword ptr (20)[ebp],esi
|
|
movsx edi,byte ptr [edi]
|
|
cmp edi,0
|
|
jne L49
|
|
mov eax,0
|
|
jmp L45
|
|
L49:
|
|
inc dword ptr (24)[ebp]
|
|
L47:
|
|
mov edi,dword ptr (20)[ebp]
|
|
movsx edi,byte ptr [edi]
|
|
mov esi,dword ptr (24)[ebp]
|
|
movsx esi,byte ptr [esi]
|
|
cmp edi,esi
|
|
je L46
|
|
mov edi,dword ptr (20)[ebp]
|
|
movsx edi,byte ptr [edi]
|
|
cmp edi,0
|
|
jne L51
|
|
mov eax,-1
|
|
jmp L45
|
|
L51:
|
|
mov edi,dword ptr (24)[ebp]
|
|
movsx edi,byte ptr [edi]
|
|
cmp edi,0
|
|
jne L53
|
|
mov eax,1
|
|
jmp L45
|
|
L53:
|
|
mov edi,dword ptr (20)[ebp]
|
|
movsx edi,byte ptr [edi]
|
|
mov esi,dword ptr (24)[ebp]
|
|
movsx esi,byte ptr [esi]
|
|
mov eax,edi
|
|
sub eax,esi
|
|
L45:
|
|
mov esp,ebp
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
_TEXT ends
|
|
extrn _strcpy:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
extrn _strlen:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
extrn _malloc:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
extrn _getchar:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
extrn _exit:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
extrn _printf:near
|
|
_TEXT segment
|
|
_TEXT ends
|
|
_DATA segment
|
|
public _next
|
|
align 4
|
|
_next label byte
|
|
db 4 dup (0)
|
|
public _words
|
|
align 4
|
|
_words label byte
|
|
db 32000 dup (0)
|
|
_DATA ends
|
|
_TEXT segment
|
|
align 1
|
|
L44 label byte
|
|
db 37
|
|
db 100
|
|
db 9
|
|
db 37
|
|
db 115
|
|
db 10
|
|
db 0
|
|
align 1
|
|
L39 label byte
|
|
db 111
|
|
db 117
|
|
db 116
|
|
db 32
|
|
db 111
|
|
db 102
|
|
db 32
|
|
db 119
|
|
db 111
|
|
db 114
|
|
db 100
|
|
db 32
|
|
db 115
|
|
db 116
|
|
db 111
|
|
db 114
|
|
db 97
|
|
db 103
|
|
db 101
|
|
db 0
|
|
align 1
|
|
L32 label byte
|
|
db 111
|
|
db 117
|
|
db 116
|
|
db 32
|
|
db 111
|
|
db 102
|
|
db 32
|
|
db 110
|
|
db 111
|
|
db 100
|
|
db 101
|
|
db 32
|
|
db 115
|
|
db 116
|
|
db 111
|
|
db 114
|
|
db 97
|
|
db 103
|
|
db 101
|
|
db 0
|
|
align 1
|
|
L6 label byte
|
|
db 63
|
|
db 32
|
|
db 37
|
|
db 115
|
|
db 10
|
|
db 0
|
|
_TEXT ends
|
|
end
|