如何从键盘读取字符并将其保存到DOS程序集中的文件?

问题描述 投票:2回答:2

我用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。

assembly input x86 dos
2个回答
2
投票

根据代码的语法,我猜你正在使用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

另外,不要忘记指定一些键来突破你现在在程序中的无限循环。


2
投票

实际上你没有将字符放在... 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
© www.soinside.com 2019 - 2024. All rights reserved.