我正在使用 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 函数的文件句柄并将数据放入 DS:DX
中。
最佳答案
根据代码的语法,我猜测您正在使用 NASM 并尝试创建一个 .COM 程序。
.COM 程序的代码从文件的最开头开始,并且也没有将文件划分为逻辑部分,因此您不能首先放置数据部分(例如 .data 或 .bss),而且它不会甚至定义这样的部分也没有多大意义。
因此,您的代码应如下所示:
org 100h
bits 16
; code begins here
; then goes data
或者
org 100h
bits 16
jmp start
; here goes data
start:
; here goes the rest of code
接下来,函数 3Ch 返回 AX
中的文件句柄。您可以使用此句柄对文件执行进一步的操作(例如读、写、关闭)。您的代码没有将此句柄隐藏在 file_handle
中,我猜它正是为此目的而定义的,并且它通过用 覆盖
。您需要解决这个问题。AX
的值来丢弃它>mov AH,01h
在程序结束时,您必须使用函数 3Eh 关闭文件。如果不这样做,该文件最终可能只包含已写入其中的部分数据,该文件可能会变得无法访问,直到您重新启动电脑为止,并且您也可能无法打开(或创建)更多文件如果您积累了足够的未关闭文件句柄。因此,最后关闭文件。
至于将字符保存在文件中,没有什么可以阻止您定义一个字节变量,例如 key
,将 AL
存储到其中,然后传递 的地址>key
功能 40h,例如:
...
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
...
另外,不要忘记指定一些键来打破当前程序中的无限循环。
关于assembly - 如何在DOS汇编中从键盘读取字符并将其保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885635/