Заменить слова в файле (аргументы передаются через командную строку) - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте подскажите пож.,в чем ошибка Задание такое: программе передаются через командную строку 3 аргумента: название файла(текстовый) и 2 слова. Нужно найти все первые слова в файле и заменить их на вторые. Не могу понять ,в чем ошибка, запускаю программу и командная строка виснет Вот код:
.model tiny
.code
.386
org 100h
start:
    mov cx,eS:0080h
    mov bx, eS:[0082h]  
    mov si,0
    mov di,0
    dec cx
    mov ax,0
while1:
    cmp cx,si
    je end_while1
    cmp byte ptr [bx+si],32
    je ooo
    cmp ax,0
    je file
    cmp ax,1
    je word11
    cmp ax,2
    je word22
file:
    mov dl,byte ptr [bx+si]
    mov file_name[di],dl
    inc di
    inc si
    jmp while1
word11:
  mov dl,byte ptr [bx+si]
    mov word1[di],dl
    inc di
    inc si
    jmp while1
word22:
     mov dl,byte ptr [bx+si]
     mov word2[di],dl
    inc di
    inc si
    jmp while1
ooo:
  cmp ax,2
  je len
    inc ax
    mov di,0
    jmp while1
len:
    mov lenght1,di
    inc ax
    mov di,0
    jmp while1
end_while1:
  mov ax,3D02h
  mov dx, offset file_name
  int 21h
  mov lenght2,di
  mov bx,ax
  mov cx,1
  mov ax,0
  mov ah,3Fh
  mov di,0
  mov si,0
 search:
  mov ah,3Fh
  mov dx,offset symb
  mov cx,1
  int 21h
  cmp ax,0
  je search_end
  int 21h
  inc i
  mov dl,symb
  cmp dl,word1[di] ; поиск слова
  je fileDI
  mov dx,0
  mov di,0
  jmp search
 fileDI:
  inc di
  cmp di,lenght1  ; смотрим размер слова
  je razn         ; если совпадает переходим на перестановку слова
  jmp search
razn:
  mov si,lenght1
  cmp si,lenght2
  ja razn1
  mov si,lenght2
  sub si,lenght1
  jmp replace
razn1:
  sub si,lenght2
  mov cx,0
  mov dx,lenght1
  mov ax,4201h   ; переместить 
  int 21h
  mov ah,40h    ; запись нового слова
  mov cx,lenght2
  mov dx,offset word2
  int 21h
  mov dx,i     
  sub dx,si
  mov i,dx  ; в i место откуда продолжать читать
  mov s,dx
  add dx,si
  mov s1,dx
replace1:
  mov ax,4200h ; переместить
  mov dx,s1
  mov cx,0
  int 21h
  mov cx,1
  mov dx,offset symb
  mov ah,3Fh    ; прочитать
  int 21h 
  cmp ax,0
  je del
  mov ax,4200h    ; переместить
  mov cx,0
  mov dx,s
  int 21h
  mov ah,40h    ; записать
  mov cx,1
  mov dx,offset symb
  int 21h
  inc s
  inc s1
  jmp replace1  
 del:
  mov ax,4202h    ; переместить
  mov cx,-1
  mov dx,0
  sub dx,si
  int 21h
  mov cx,0
  mov ah,40h
  int 21h
  jmp search
replace:
  mov dx,i
  add dx,si
  mov i,dx
  mov cx,0
  mov dx,si
  mov ax,4202h
  int 21h
  mov ah,40h
  mov cx,1
  mov dx,offset symb
  int 21h
  mov ax,4202h
  mov dx,0
  mov cx,0
  int 21h
  mov s1,1
  mov dx,0
  mov dx,s1
  add dx,si
  mov s,dx
@rep:
  mov dx,s
  cmp dx,i
  je search
  mov cx,-1
  mov dx,0
  sub dx,s
  mov ax,4202h ; перместился 
  int 21h
  mov dx,offset symb
  mov cx,1
  mov ah,3fh ; прочитал
  int 21h 
  mov cx,-1
  mov dx,0
  sub dx,s1
  mov ax,4202h ; перместился 
  mov cx,1
  mov dx,offset symb
  mov ah,40h
  int 21h
  inc s
  inc s1
  jmp @rep
search_end:
  mov ah,3Eh
  int 21h
    word1 db 50 dup(?)
  word2 db 50 dup(?)
  lenght1 dw 0
  lenght2 dw 0
  i dw 0
  s dw 0
  s1 dw 0
  symb db 0
  file_name db 100h dup(0h)
end start

Решение задачи: «Заменить слова в файле (аргументы передаются через командную строку)»

textual
Листинг программы
.model tiny
.code
.386
org 80h
strlen: ;длина командной строки
org 82h
file_name: ;имя файла без '0' в конце и остальная строка
org 100h
start:
;параметры разделены одним пробелом
;искать первый пробел и на его место записать '0'
    xor cx,cx
    mov cl,byte ptr [strlen]
    or cl,cl    ;cl=0 - нет параметров
    jz short exit
 
    lea dx,file_name ;для открытия файла
    mov di,dx   ;для поиска пробела
    mov al,' '
    repne scasb
    jnz short exit  ;нет пробела - плохая строка
 
    mov byte ptr [di-1],0 ;для ASCIIZ строки
    mov bp,di   ;искомое слово
 
    mov ax,3d02h    ;открыть
    int 21h
    mov bx,ax   ;ID
 
    mov ah,3fh  ;прочитать
    mov cx,-1
    lea dx,buf
    int 21h
 
;получить адрес буфера результат и сохранить его в di
    mov di,dx
    add di,ax
    mov byte ptr [di],' '
    inc di
    inc ax
push ax     ;размер файла + пробел в конце
 
    mov ah,3eh  ;закрыть
    int 21h
 
;получить и сохранить длину первого слова + пробел
    mov si,bp
    xor cx,cx
    lodsb
    inc cx
    mov ah,al   ;сохранить первый символ искомого слова
m1:
    lodsb
    inc cx
    cmp al,' '
    jnz short m1
    mov [wordlen],cx
    mov bx,si
 
;dx - буфер
;di - буфер результат
;bp - искомое слово
;bx - слово для замены
 
;читать из буфера, писать в буфер результат
pop cx      ;размер файла + пробел в конце
    mov si,dx
m0:
    lodsb
    cmp ah,al   ;если совпадает, на
    jz short m5 ;сравнение остального слова
    stosb
    loop m0
 
;пересоздать файл, что обнулит его
    mov ah,3ch
    lea dx,file_name
    mov cx,20h
    int 21h
    mov bx,ax   ;ID
 
;получить размер и адрес для записи
    mov cx,di
    sub cx,si
    dec cx
    mov dx,si
 
    mov ah,40h  ;записать
    int 21h
 
    mov ah,3eh  ;закрыть
    int 21h
exit:
    ret
;-------------------------
m5:     ;сравнение слов
push cx si di
    dec si
    mov di,bp
    mov cx,[wordlen]
    repe cmpsb
pop di si cx
    jz short m6 ;совпали
 
;записать слово с пробелом
    dec si
m7:
    cmp al,' '
    jz short m0
    lodsb
    stosb
    loop m7
 
m6:     ;записать слово для замены
push si
    mov si,bx
m4:
    lodsb
    cmp al,13
    jz short m3
    stosb
    jmp short m4
m3:
pop si
    add si,[wordlen]    ;востановить адрес и
    sub cx,[wordlen]    ;длину
    inc cx
    sub si,2
    jmp short m0        ;на следующий символ
 
wordlen dw ?
buf:
 
end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы