assembly - 如何在DOS汇编中从键盘读取字符并将其保存到文件中?

标签 assembly input x86 dos

我正在使用 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/

相关文章:

c++ - 为什么使用 GCC 在 x86 上整数溢出会导致无限循环?

c - tasm 中自动插入代码

javascript - 如何将用户输入存储在数组中

html - 使用 css 垂直格式化输入和标签标签

java - 代码仅在我使用断点时才有效 - 可能是线程问题

assembly - 无法在 NASM 中打印数字

objective-c - Mac 上汇编语言的纯函数

Windows 初始执行上下文

c - 对主 ld 的 undefined reference

assembly - 修补时 IDA "Invalid Operand"错误