程序集修改文件内容

Assembly Modify file content

我在汇编中从文件中读取一个字节后,当前文件位置被更新。我怎么能想修改那个字节,而不是把它写在我从中读取的相同位置的文件中?我在 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 代码中,然后将其写回文件中。但是它没有在文件中写入它应该写的内容

您可以使用服务 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