Сборка Изменить содержимое файла

После того, как я прочитал байт из файла в сборке, текущая позиция файла обновляется. Как я могу изменить этот байт и записать его в файл в той же позиции, с которой я его прочитал? Я работаю в Tasm на x8086

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 ответ

Решение

Вы можете использовать услугу 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

Подробнее о работе с файлами можно узнать здесь.

Другие вопросы по тегам