我需要用汇编语言编写一个程序,它在文件中查找以给定间隔的字母开头的单词,并列出这些单词。单词不能重新开始,必须有一个数字显示该单词重复的次数,并且列表必须按字母顺序排序。然后我必须制作另一个列表,按重复降序排序。
我制作了一个程序,用于记下每个单词,从单词间隔开始写入文件。
现在我想立即检查单词是否重复,如果是,则在重复数字中加1,或者如果单词更大,则将其添加到文本文件中。
问题是我需要在文本文件的中间添加行或完全替换一些咬合。我现在可以使用 int 21h ah = 42h 移动文件指针,但是如何删除部分文件或替换它?
你能给我一些建议吗?我怎样才能完成这项工作或者给我另一个算法呢?
编辑: 它是8086汇编语言 我已编写的代码程序:
.model small
.stack 100H
.data
ri db 2, 0, 2 dup (0)
dFail dw ?
skbuf db 255, 0, 255 dup (0)
buff_dydis db 0h
pask_vieta db 0h
eilp_vieta db 0h
failo_pabaiga db 0h
rez db "rez.txt", 0h
rFail dw ?
;pagalbos pranesimas
help db "Iveskite raidzdiu intervala taokiu formatu *-*, tada iveskite failu pavadinimus ar direktorijas$"
failaspav db 255, 0, 255 dup(0)
failas db 255, 0, 255 dup (0)
zodis1 db ' $'
zodis2 db 30 dup(0)
skaicius db " 1$"
passk db 3, 0, 3
didsk db 20h, 20h, 31h
enteris db 0Dh, 0Ah
klaid1 db "Neivesti duomenys i parametru eilute$"
klaid2 db "Failo sukurimo klaida $"
klaid3 db "Failo atidarymo klaida $"
klaid4 db "Skaitymo is failo klaida $"
klaid5 db "Rasymo i faila klaida $"
klaid6 db "Klaida uzdarant faila $"
klaid7 db "Neivesti failu pavadinimai $"
.code
start:
mov dx, @data
mov ds, dx
;--------------------------------------------------------------------------------
xor ch, ch ;tikrinam parametru eilute
mov cl, es:[0080h]
cmp cx, 0h
je klaida1 ;jei nera parametru, metam klaida
cmp cx, 3h ;jei parametru tik 3, tai reiskia, kad nera failu
je klaida7 ;todel metam, kad nera failu pavadinimu
mov bx, 82h
;--------------------------------------------------------------------------------
Ieskok:
cmp es:[bx], '?/' ;ziurim ar yra /?, t.y. help
Je Yra ;jei randam, isvedam ir baigiam
inc bx
loop Ieskok
jmp Nera ;jei neram tesiam programa
Yra:
mov ah, 9
mov dx, offset help ;jei radom /? isvedam help
int 21h
jmp pabaiga
Nera:
;--------------------------------------------------------------------------------
;rezultatu failo sukurimas
mov ah, 3Ch
mov cx, 0h
mov dx, offset rez
int 21h
jc klaida2
mov rFail, ax
jmp toliau
;--------------------------------------------------------------------------------
;Klaidos 1, 2, 7
klaida1:
mov ah, 09h
mov dx, offset klaid1
int 21h
jmp pabaiga
klaida2:
mov ah, 09h
mov dx, offset klaid2
int 21h
jmp pabaiga
klaida7:
mov ah, 09h
mov dx, offset klaid7
int 21h
jmp pabaiga
;--------------------------------------------------------------------------------
toliau:
;parametru eilutes ilgis
mov cl, es:[80h] ;80-ajame es saugomas parametru eilutes ilgis
sub cl, 5d ;nuimame 5, nes pirmi 5 bus tarpa ir raidziu intervalas
mov buff_dydis, cl ;issaugom likusi eilutes ilgi
;raidziu intervalas
mov al, es:[82h] ;isirasom pirma intervalo raida
mov [ri+0], al
mov al, es:[84h] ;isirasom antra intervalo raide
mov [ri+1], al
;tekstu failai
mov si, 86h
;push si
xor di, di ;eisime dirbti su pirmu failu
jmp fail_at
;--------------------------------------------------------------------------------
;==============================================================================
;==============================================================================
;==============================================================================
naujas_failas: ;cia dirbsime tik nuo antro failo
xor di, di
xor ax, ax
mov al, pask_vieta ;praeito failo pavadinimo paskutine vieta
mov si, ax
inc si ;padidinam ja 1, nes ten bus tarpas
push si
xor ax, ax
mov dFail, ax ;nusinulinam deskriptoriu
mov cx, 30d ;nusinulinam failu pav buferi
mov si, 0
nulinti1:
mov al, 0h
mov [failaspav+si], al
inc si
loop nulinti1
mov cx, 255d ;nusinulinam eilutes buferi
mov si, 0
nulinti2:
mov al, 0h
mov [failas+si], al
inc si
loop nulinti2
;;nusispacinam zodi
mov cx, 30d
mov si, 0
spacinti:
mov al, 20h
mov [zodis1+si], al
inc si
loop spacinti
mov al, buff_dydis ;nuimam nuo buff_dydis 1, nes praleidom tarpa
dec al
mov buff_dydis, al
pop si
fail_at: ;i bufferi sukeliam failo pavadinima po viena simboli iki tarpo
mov dl, es:[si] ;pirma failo raide
cmp dl, 0h ;jei 0, vadinasi failo pavadinimas baigesi
je darbas
cmp dl, 20h ;jei tarpas, failo pavadinimas irgi baigesi
je darbas
cmp dl, 13d ;jei enter failo pavadinimas irgi baigesi
je darbas
mov [failaspav+di], dl ;jei ne tarpas irasom i failo pavadinimo bufferi
inc si
inc di
jmp fail_at ;darom loopa kol nerasim 0, space, enter
darbas:
xor ax, ax
mov ax, di
sub buff_dydis, al ;issisaugom pirmos raides pozicija
xor ax, ax
mov ax, si
mov pask_vieta, al ;issisaugom paskutines raides pozicija
;atidarom faila
mov ah, 3Dh
mov al, 0h
mov dx, offset failaspav
int 21h
jc klaida3 ;jei failas neatsidaro, metam klaida
mov dFail, ax ;issisaugom failo deskriptoriaus numeri
jmp pirmeil ;einam dirbti su pirma eilute
;--------------------------------------------------------------------------------
;klaida 3
klaida3:
mov ah, 09h
mov dx, offset klaid3
int 21h
jmp pabaiga
;--------------------------------------------------------------------------------
;===============================================================================================================
;===============================================================================================================
skaitomeil:
mov cl, eilp_vieta
cmp cl, 255
je toliau3
jmp fail_uz
toliau3:
mov cx, 255d ;nusinulinam eilutes buferi
mov si, 0
nulinti3:
mov al, 0h
mov [failas+si], al
inc si
loop nulinti3
;;nusispacinam zodi
mov cx, 30d
mov si, 0
spacinti1:
mov al, 20h
mov [zodis1+si], al
inc si
loop spacinti1
pirmeil:
mov ah, 3Fh
mov bx, dFail
mov cx, 255d ;skaitome 255 simbolius
mov dx, offset failas ;nuskaitome 1 eilute
int 21h
jc klaida4
mov eilp_vieta, al ;issisaugom, kiek yra eilutej simboliu
cmp ax, 0h
jne testi1 ;jei nera error, tesiam
jmp fail_uz
testi1:
xor si, si
xor di, di
jmp ieskom_zodzio ;einame skaityti pirmo zodzio
;================================================================================================================
kitas_zodis:
xor ax, ax
mov al, eilp_vieta ;sekantis zodis prasides nuo paskutinio tarpo vietos+1
cmp si, ax
jl toliau2
jmp skaitomeil
toliau2:
xor di, di ;di - naujo zodzio piram raide
inc si
;si - kur paliko bufferi raide
mov cx, 30d
spacinti2:
mov al, 20h
mov [zodis1+di], al
inc di
loop spacinti2
xor di, di
ieskom_zodzio:
cmp [failas+si], 20h ;tikrinam ar simbolis yra tarpas
je tikrinam
cmp [failas+si], 0Dh ;ar simbolis yra enter
je tikrinam
cmp [failas+si], 0Ah ;ar simbolis yra trpas
je tikrinam
cmp [failas+si], 0h ;ar simbolis yra 0
je tikrinam ;jei taip vadinasi baigesi bufferis
mov al, [failas+si] ;kol ne tarpas perkaliam simbolius is failas bufferio i zodis1 bufferi
mov [zodis1+di], al
inc si
inc di ;einam prie kitu simboliu
jmp ieskom_zodzio
;--------------------------------------------------------------------------------
;klaida4
klaida4:
mov ah, 09h
mov dx, offset klaid4
int 21h
jmp pabaiga
;--------------------------------------------------------------------------------
tikrinam:
mov bl, [ri+0] ;nuskaitom pirma intervalo raide
mov bh, [ri+1] ;nuskaitom antra intervalo raide
cmp [zodis1+0], bl ;tikrinam ar pirma raide ieina i intervala
jl kitas_zodis ;jei raide mazesne, ieskom kito zodzio
cmp [zodis1+0], bh ;jei raide didesne arba lygi, tikrinam ar ji didesne uz antra raide
jg kitas_zodis ;jei didesne, einam toliau
mov ah, 42h ;einam i failo pradzia
mov bx, rFail
mov al, 00h
mov dx, 0h
mov cx, 0h
int 21h
tik_ar_yra:
mov ah, 42h ;einam i failo pradzia
mov bx, rFail
mov al, 01h
mov dx, 0h
mov cx, 0h
int 21h
push dx
push cx
mov bx, rFail ;nuskaitome pirma zodi is rezultato failo
mov dx, offset zodis2
mov ah, 3Fh
mov cx, 30d ;skaitome pirmus 30 simboliu, nes tiek duosime irasydami
int 21h
jc klaida4 ;jei neiseijo nuskaityti, mesime klaida
cmp ax, 0h
je prid_i_viet ;jei nuskaiteme0, vadinasi, dar nera
mov bl, zodis1 ;tikrinam ar tas zodis lygus nuskaitytam zodziui
cmp bl, zodis2
je sudeti ;jei taip, pridesime viena prie pasikartojimu skaiciaus
cmp bl, zodis2
jg prid_i_viet ;jei zodis pagal abecele mazesnis, pridesime i ta vieta
jmp tik_ar_yra
prid_i_viet:
pop cx
pop dx
mov ah, 42h
mov bx, rFail
mov al, 00h
int 21h
xor dx, dx ;jei zpdis naujas:
mov ah, 40h
mov bx, rFail
mov cx, 30d
mov dx, offset zodis1 ;irasome zodi
int 21h
jc klaida5
mov ah, 40h
mov bx, rFail
mov cx, 3d
mov dx, offset skaicius ;irasome 3 vietas skirtas skaiciui su irasytu 1
int 21h
jc klaida5
mov ah, 40h
mov bx, rFail
mov cx, 1d
mov dx, offset enteris ;irasom enter
int 21h
jc klaida5
cmp [failas+si], 0h ;tikrinam ar si 0
je sk_eil ;jei taip, eilute baigesi
jmp kitas_zodis ;jei ne, einam prie kito zodzio
sk_eil:
jmp skaitomeil
;--------------------------------------------------------------------------------
;klaida 5
klaida5:
mov ah, 09h
mov dx, offset klaid5
int 21h
jmp pabaiga
klaida42:
mov ah, 09h
mov dx, offset klaid4
int 21h
jmp pabaiga
;--------------------------------------------------------------------------------
sudeti:
mov bx, rFail
mov dx, offset passk ;nuskaitome pasikartojimu skaiciu
mov ah, 3Fh
mov cx, 3d
int 21h
jc klaida42
xor ax, ax
koks_sk:
mov al, [passk+2]
cmp al, 39h ;tikrinam ar skaitmuo 9
je kita_des ;jei taip, einam i kita desimti
inc al
mov [passk+2], al ;jei ne, pridedam 1 prie dabartinio skaiciaus
jmp irasyti_i_faila
kita_des:
mov al, 30h
mov [passk+2], al ;pakeiciam vienetu skaiciu 0
mov al, [passk+1]
cmp al, 39h ;tikrinam ar desimciu skaicius lygus 9
je kitas_sim ;jei taip, einam i kita simta
cmp al, 20h ;tikrinam ar is vis egzistuoja vienetu skaicius
je pirma_des ;jei ne, pridesim i ta vieta 1
inc al
mov [passk+1], al
jmp irasyti_i_faila
pirma_des: ;jei dar nera desimciu, pridedame 1
mov al, 31h
mov [passk+1], al
jmp irasyti_i_faila
kitas_sim:
mov al, 30h
mov [passk+1], al
mov al, [passk+0]
cmp al, 20h
je pirmas_simtas
inc al
mov [passk+0], al
jmp irasyti_i_faila
pirmas_simtas: ;;jei dar nera simtu, pridedame 1
mov al, 31h
mov [passk+1], al
jmp irasyti_i_faila
irasyti_i_faila: ;irasome gauta skaiciu i faila
pop cx
pop dx
sub dx, 3
mov ah, 42h
mov bx, rFail
mov al, 00h
int 21h
xor ah, ah
push ax
mov ah, 40h
mov bx, rFail
mov cx, 3d
mov dx, offset passk
int 21h
jc klaida52
mov ah, 40h
mov bx, rFail
mov cx, 1d
mov dx, offset enteris ;irasom enter
int 21h
jc klaida52
pop ax
cmp al, didsk
jg didesnis_sk
jmp kitas_zodis
didesnis_sk: ;jei radome nauja didziausia skaiciu, ji issaugome
mov didsk, al
jmp kitas_zodis
;=======================================================================================================
klaida52:
jmp klaida5
;===============================================================================================================
;===============================================================================================================
fail_uz:
mov ah, 3Eh
mov bx, dFail
int 21h
jc klaida6
;ziurim ar dar bus failo pavadinimu
xor cx, cx
mov cl, buff_dydis
cmp cx, 0h
je failo_uzdarymas
jmp naujas_failas
;==============================================================================
;==============================================================================
;==============================================================================
failo_uzdarymas:
mov ah, 3Eh
mov bx, rFail
int 21h
jc klaida6
jmp pabaiga
klaida6:
mov ah, 09h
mov dx, offset klaid6
int 21h
jmp pabaiga
pabaiga:
mov ah, 4ch
mov al,00h
int 21h
end start