实际上,您没有将字符放入 中 ds:dx
,而是ds:dx
用于引用存储字符或任何数据的内存地址,在 Intel 语法中它会是[ds:dx]
(但dx
不能用于内存寻址)。
因此,您需要做的是:使用 DOS 中断21h
/存储从键盘读取的值ah = 01h
,返回al
到某个内存地址,然后使用ds:dx
.
在您的代码中,您根本不存储文件句柄,并file_handle
在写入文件调用之前从变量中加载 0,因为这就是您初始化它的方式。然后您尝试从ds:0
(si
等于0)读取文件句柄,这根本没有意义。您需要对文件句柄做的就是存储它(ax
在文件创建/截断后返回值)并在随后引用同一文件时始终将其加载到相关寄存器int 21h
(写入文件、从文件读取、关闭文件等) .)。
所以,通过下面的修复它应该可以工作(没有测试)。我还将函数调用参数按照 Ralf Brown 的中断列表使用的顺序进行了组织,以便于理解。
.section data
file db 'file.txt',0
character_read db 0
...
% create file:
mov ah,3Ch % create or truncate a file
mov dx,file % ds:dx points to ASCIIZ filename
xor cx,cx % file attributes.
int 21h
mov [file_handle], ax % file handle must be stored in memory or in a register!
INPUTSTART:
mov ah,1 % read character from STDIN, with echo.
int 21h
mov [character_read], al % store the ASCII code to memory.
% unless you want to loop eternally, you can check the ASCII code and exit.
cmp al,20h % space.
je EXIT
mov ah,40h % write to file or device
mov bx,[file_handle] % file handle is just a number.
mov cx,1 % number of bytes to write.
mov dx,character_read
int 21h
jmp INPUTSTART
EXIT:
% here you can add some clean-up code, if needed.
mov ah,3Eh % close file.
mov bx,[file_handle] % here you need the file handle again.
int 21h
mov ah,4Ch
int 21h