我用3Ch函数创建文件并使用40h函数保存字符(我读过它here)
我不明白如何把读取字符放在DS:DX
。
这是我的代码:
org 100h
bits 16
section .data
file DB 'file.txt',0
section .bss
file_handle resw 1
; CREATE FILE
section .text
mov DX, file
mov CX, 0000h
mov AH, 3Ch
int 21h
; START INPUT
INPUTSTART:
mov AH,01h
int 21h
; SAVE INPUT TO FILE
mov SI, file_handle
mov BX, [SI]
mov CX, 0001h
mov AH, 40h
int 21h
jmp INPUTSTART
mov AH,4Ch
int 21h
如您所见,程序旨在循环工作并编写与用户类型一样多的字符。请帮助获取40h函数的文件句柄并将数据放入qazxsw poi。
根据代码的语法,我猜你正在使用NASM并试图创建一个.COM程序。
.COM程序的代码从文件的最开始开始,并且文件没有任何划分为逻辑部分,因此您不能先放置数据部分(例如.data或.bss),而不是甚至定义这些部分也很有意义。
所以,你的代码应如下所示:
DS:DX
要么
org 100h
bits 16
; code begins here
; then goes data
接下来,函数3Ch返回org 100h
bits 16
jmp start
; here goes data
start:
; here goes the rest of code
中的文件句柄。您可以使用此句柄对文件执行进一步操作(例如,读取,写入,关闭)。你的代码并没有在AX
中存放这个句柄,我猜这是为了那个目的而完全定义的,并且通过用file_handle
覆盖AX
的值来摧毁它。你需要解决这个问题。
在程序结束时,您必须使用功能3Eh关闭文件。如果不这样做,该文件可能最终只包含已写入其中的一部分数据,在重新启动PC之前该文件可能无法访问,您也可能无法打开(或创建)更多文件如果你积累了足够的未闭合文件句柄。所以,最后关闭文件。
至于在文件中保存字符,没有什么可以阻止你定义一个字节变量,比如mov AH,01h
,将key
存储到其中,然后将AL
的地址传递给函数40h,例如:
key
另外,不要忘记指定一些键来突破你现在在程序中的无限循环。
实际上你没有将字符放在...
mov AH,01h
int 21h
mov [key], AL
; SAVE INPUT TO FILE
mov BX, [file_handle]
mov DX, key
mov CX, 0001h
mov AH, 40h
int 21h
...
file_handle dw 0
key db 0
...
中,而是使用ds:dx
来指代存储字符或任何数据的内存地址,在Intel语法中它将是ds:dx
(但[ds:dx]
不能用于内存寻址)。
那么,你需要做什么:存储从键盘读取的值与DOS中断dx
/ 21h
,在ah = 01h
中返回到某个内存地址,然后用al
引用该内存地址。
在您的代码中,您根本不存储文件句柄,并在写入文件调用之前从变量ds:dx
加载0,因为这是您初始化它的方式。然后你尝试从file_handle
读取文件句柄(如ds:0
等于0),这根本没有意义。您需要处理的文件句柄就是存储它(在文件创建/截断后在si
中返回值)并始终将其加载到后续ax
中引用相同文件的相关寄存器(写入文件,从文件读取,关闭文件)等)。
所以,通过下面的修复它应该工作(没有测试)。我还将函数调用参数组织为Ralf Brown中断列表使用的顺序,以便更容易理解。
int 21h
...
.section data
file db 'file.txt',0
character_read db 0