如何在程序集8086中替换文本文件中的字符串?

时间:2015-11-20 11:21:25

标签: assembly

我想编写一个程序,它将打开一个文件,搜索指定的字符串并用另一个字符串替换该字符串。 我的想法是一次读取16字节的文件(我的字符串是16字节),检查它是否与指定的匹配。如果是,则将文件指针向后移动16字节,用空格替换16字节,再次向后移动文件指针16字节以用新字符串填充此16字节 但它不能正常工作。任何人都可以帮我解决这个问题吗?

这是我正在接受输入并尝试替换之前的过程。

edit1 proc
    pushf
    push ax
    push bx
    push cx
    push dx
    push di

    mov ah, 42h
    mov al, 1
    mov cx, -1
    mov dx, -18
    int 21h

    mov ah, 40h
    mov cx, 18
    mov dx, offset space1
    int 21h

    mov ah, 42h
    mov al, 1
    mov cx, -1
    mov dx, -18
    int 21h

    number_input1:  ;taking input string with which I want to replace
    mov ah, 01h
    lea di, number1
    cld  

    number_loop1:
    int 21h
    cmp al, 0dh
    je    write1 
    stosb
    jmp number_loop1 

    write1:
    mov ah, 40h
    mov cx, 18
    lea dx, number1
    int 21h 

    pop di
    pop dx
    pop cx
    pop bx
    pop ax
    popf
    ret 
edit1 endp     

2 个答案:

答案 0 :(得分:2)

  • 所有DOS调用似乎都缺少BX参数 这应该掌握你打开的文件的句柄!

  • 根据您的上一条评论,请考虑以下示例:

    您的 number_loop1 输入循环获取这11个字符(然后返回):

    Hello 12345
    

    此后,无论输入的字符数(此处为11), write1 代码始终写入18个字节。这将不可避免地导致文件中的垃圾字节(此处为7)。

    解决方案:
    你在文件中写了18个空格,但你应该在 number1 指向的内存中写入18个空格。

答案 1 :(得分:0)

抱歉,我的例子可能并不完美表达实际情况。在文件中,当字符串初始化为空格时,它总是写入18个字节。 当我试图从当前位置向后移动时,首先我寻找当前文件指针位置,然后从文件的起始点向前移动到该位置。由于以前的方法是失败的,现在我已经尝试过这种方式并且它有效。 谢谢大家。