【问题标题】:how can I replace a string in a text file in assembly 8086?如何在程序集 8086 中替换文本文件中的字符串?
【发布时间】:2015-11-20 11:21:25
【问题描述】:

我想编写一个程序来打开一个文件,搜索一个指定的字符串并用另一个字符串替换这个字符串。 我的想法是一次读取 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     

【问题讨论】:

  • 如果您希望人们帮助展示您的代码
  • 无需将空格写入磁盘,然后再用您的字符串覆盖。只需编写字符串本身。如果这样做是因为字符串可能最多 16字节长,并且您希望确保完全删除旧字符串,只需在内存中使用一个 16 字节缓冲区,用空格填充它,复制您的字符串,然后将缓冲区写入磁盘一次。我意识到这并不能回答你的问题。此外,“不能正常工作”是对问题的一个非常糟糕的描述。您确实需要描述预期和观察到的内容 - 我们看不到您的屏幕!
  • 在一个文件中,会有一个名字(16字节),联系电话(16字节)和换行(2字节:0ah,0dh)。每次我想编辑一个数字时,它都会读取 34 个字节并检查前 16 个字节是否与给定名称匹配。如果匹配,则将对应的联系人号码替换为新的联系人号码。但是运行代码后,emu8086中的文件中写入了“A.txt”之类的文件名,即使在masm中也会在控制台中生成模棱两可的字符。
  • 但它不能正常工作。你能解释一下具体是什么不工作吗?在您随后的评论中,它也有点不清楚(我不确定 它在控制台中生成模棱两可的字符 是什么意思)。正如@Fifoernik 在他的回答中提到的那样,您还没有为文件 IO 设置文件句柄。但也许你在打开之后通过bx 将它传递给函数?目前还不清楚。 bx 会被一些 int 21h 调用覆盖,所以你需要注意这一点。
  • 我已经在 bx 寄存器中传递了句柄,但问题还没有解决。就像我输入:Hello 12345 然后想用 45678 替换那个数字,在文件中写成“Hello 45678 H”。 (不带双引号)

标签: assembly


【解决方案1】:
  • 您的所有 DOS 调用似乎都缺少 BX 参数。
    这应该包含您打开的文件的句柄!

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

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

    Hello 12345
    

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多