как заменить текст в файле в сборке, используя инструкцию DOS - PullRequest
0 голосов
/ 07 мая 2019

NASM ASSEMBLER Предположим, что мы создали текстовый файл с помощью блокнота со следующим текстом:

      “Of all the languages I've studied, Assembly is   
        my favorite.”

Предположим, мы хотим изменить «избранное» на «весело-весело», вставив слово «весело-Приколы "вместо" любимых ".Как мы можем это сделать - не нарушая и не переписывая эти первые 47 байтов перед «моим»?

Я думал, что чтение каждого байта первым будет началом ..

mov AH, 3F ; AH=3F=read
mov BX, in_handle
mov CX,60
Int 21H

Затем потеряно ??

1 Ответ

2 голосов
/ 08 мая 2019
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 / руководство.

...