Заменить слова в файле (аргументы передаются через командную строку) - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д