mov BX, in_handle
Если вы используете NASM, то вышеупомянутое загрузит адрес переменной in_handle в BX
.Это не то, что вам нужно!Вам нужно содержимое этой переменной.
mov bx, [in_handle]
mov AH, 3F ; AH=3F=read
mov BX, in_handle
mov CX,60
Int 21H
Номер функции, к которой вы переходите на AH
, представляет собой шестнадцатеричное число 3Fh,Вы должны написать суффикс "h" или префикс "0x".
Для соответствия с int 21h
, вы должны выбрать "h"
без нарушения или переписывание эти первые 47 байтов перед "моим"?
Если переписать, если не вариант, то вы должны использовать функцию DOS.MoveFilepointer 42h.
mov dx, 47 ; Fileoffset in CX:DX is 47
xor cx, cx
mov bx, [in_handle]
mov ax, 4200h ; AH=function 42h AL=offset from start of file
int 21h ; DX:AX CF
jc SomeError
mov dx, Buffer ; Buffer at DS:DX
mov cx, 9999 ; Everything till EndOfFile
mov bx, [in_handle]
mov ah, 3Fh ; DOS.ReadFile
int 21h ; -> AX CF
jc SomeError
Здесь вы изменяетесодержимое буфера, так что он читает "весело-весело".Обратите внимание, что это на 1 символ меньше, чем «любимый»!Вот что делает необходимым переписать до EndOfFile.Вы не хотите оставлять пробел в тексте.
Чтобы обновить файл, вы перемещаете указатель файла точно так же, как описано выше, а затем используете функцию DOS.WriteFile 40h из того же буфера, но с меньшим размером.считать в CX
.
Почему mov cx, 9999
(только во время чтения)?
Блокнот будет иметь прикрепленные байты 13 (возврат каретки) и 10 (перевод строки) к концу строки!Может быть, даже байт 26 (конец файла).
Не волнуйтесь, DOS будет читать только то, что доступно, и очень важно сообщать о сумме в регистре AX
.Обратитесь к API / руководство.