Сборка Изменить содержимое файла
После того, как я прочитал байт из файла в сборке, текущая позиция файла обновляется. Как я могу изменить этот байт и записать его в файл в той же позиции, с которой я его прочитал? Я работаю в 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
Подробнее о работе с файлами можно узнать здесь.