如何使用DOS指令替换程序集中文件中的文本

时间:2019-05-07 08:35:10

标签: assembly nasm dos x86-16

NASM大会 假设我们使用记事本创建了一个文本文件,其中包含以下文本:

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

假设我们想通过将“ fun-fun”一词插入“ favorite”来将“ favourite”更改为“ fun-fun”。我们该如何做-不打扰或重写“我”之前的前47个字节?

我认为首先读取每个字节都是一个开始。

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

然后迷路了?

1 个答案:

答案 0 :(得分:2)

mov BX, in_handle

如果您使用的是NASM,则上面的代码将加载BX in_handle 变量的地址。那不是你所需要的!您需要此变量的内容

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”


  

没有打扰或重写“ my”之前的前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

在这里修改缓冲区的内容,使其读为“ fun-fun”。请注意,它比“收藏夹”少1个字符!这就是必须重写直到EndOfFile的原因。您不想在文本中留出空白。

要更新文件,请像上面一样重新放置文件指针,然后从同一缓冲区使用DOS.WriteFile函数40h,但在CX中使用较小的计数。

为什么mov cx, 9999(仅在阅读时)?

记事本将在行尾附加字节13(回车)和字节10(换行)!甚至字节26(文件末尾)。
不用担心,DOS只会读取可用的内容,非常重要的是报告AX寄存器中的数量。查阅API /手册。