如何读取任意长度的字符串?

how to read any length of string?

我是汇编语言的新手,进退两难。我如何要求用户输入字符串并以未知长度读取它?目前我只知道如何要求用户输入和阅读有限的长度,比如...

      .data
input db 24 dup ("$")
      .code
      mov input, 22
      lea dx, input
      mov ah, 0ah
      int 21h

我想知道是否可以在不担心长度的情况下要求用户输入...如果可能的话,您能否向 process/code 展示并解释如何操作?

作为选项之一,您可以使用 BIOS int 16h fn 0 循环等待按键按下,然后检查按下了哪个键并进行相应处理。

类似

  ;
  ; ES:DI points to input buffer
  ;
_do:
  ;
  ; wait key press
  ;
  mov ah, 0
  int 0x16
  cmp al, 13  ;ENTER pressed?
  jz _end
  ;
  ; display char
  ;
  mov ah, 0x0e
  mov bh, 0
  int 0x10
  ;
  ; save char to buffer
  ;
  stosb
  jmp _do
_end:
  ...

如果您将输入过程委托给 OS,您将始终需要处理一些长度限制。 DOS 使用大约 255 字节的限制。

但即使您自己编写了一个输入例程,您仍然需要担心您准备花费多少内存来存储这些字符。

在 DOS 中,您可以使用函数 AH=3Fh 在文件级别读取(几乎)任意长度的输入字符串, 参见中断列表 http://www.ctyme.com/intr/rb-2783.htm

MOV DX, OFFSET input ; Memory where you want the string be read to.
MOV CX,24 ; Number of bytes allocated for the string (maximal possible length).
MOV BX,0 ; Standard handle for system input (usually the keyboard).
MOV AH,3Fh ; DOS function "READ FROM FILE OR DEVICE"
INT 21h ; Waits until ENTER pressed (character 0Dh). Returns AX=number of bytes read.