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
然后迷路了?
答案 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 /手册。