程序集修改文件内容

时间:2017-12-11 22:39:14

标签: assembly dos x86-16 tasm

从程序集中的文件中读取一个字节后,将更新当前文件位置。我怎么能想修改那个字节,而不是把它写在我从中读取的相同位置的文件中?我在x8086上的tasm工作

READ_LOOP:
    MOV AH,3FH
    MOV BX, HANDLE
    MOV CX, 1
    LEA DX, BUFFER
    INT 21H
    INC SI
    ;if no byte was read we reached the end of file or an error occured
    CMP AL, 1
    JB EOF_END_ERR

    ;write the read content to output
    ;MOV AH, 02H
    ;MOV DL, BUFFER
    ;INT 21H

    JMP ENCRYPTING
    JMP FINAL

ENCRYPTING:
    XOR AX,AX
    MOV DL, BUFFER[0]
    ADD DL, NUMBER[0]
    MOV TEMP, DL

    MOV AH, 42H
    MOV BX, HANDLE
    MOV CX,0FFFFH
    MOV DX, 0FFFFH
    MOV AL,1
    INT 21H

    XOR DX,DX
    MOV DL, 65
    MOV BX, HANDLE
    MOV CX,1
    MOV AH, 40H
    INT 21H

    JMP READ_LOOP

我尝试使用上面的代码,只需将NUMBER [0]添加到读取字节的ASCII代码中,然后将其写回文件中。但它没有在文件中写出它应该写的内容

1 个答案:

答案 0 :(得分:1)

您可以使用服务AH=42h。从文件中读取一个字节后,文件指针将被更新。现在要将文件中的先前读取字节替换为其他内容,您需要先将文件指针向后移动一个字节(使其指向要替换的字节),这可以通过以下代码完成:

将文件指针从当前位置向后移动一个字节的代码:

    mov al, 1        ; relative to current file position
    mov ah, 42h      ; service for seeking file pointer
    mov bx, handle
    mov cx, -1       ; upper half of lseek 32-bit offset (cx:dx)
    mov dx, -1       ; moves file pointer one byte backwards (This is important)
    int 21h   

执行上述代码后,您现在可以用新字节覆盖该字节,这可以通过以下代码完成:

从文件指针的当前位置写入的代码:

    mov ah, 40h          ; service for writing to a file
    mov bx, handle    
    mov cx, 1            ; number of bytes to write
    mov dx, offset char  ; buffer that holds the new character to be written
    int 21h

有关文件操作的更多信息,请转到here