assembly 如何从int 21 h/ AH=0Ah读取和循环多个输入线的缓冲区

hc8w905p  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(144)

我想问的是,当我向缓冲区写入行时,我如何操作它?当我把它们都存储在那里时,我如何从一开始就读取它们?在NASM中。
每一行最多可以是100个字节,最多可以是600行。我想从一开始我会读取行,然后将缓冲区中的位置增加104,然后再读取另一行。我需要将它们存储在缓冲区中,因为我需要计算它们的数量,然后只读取一半
我有这样的缓冲区:

segment data
data_rows db 62400 DUP(0)

阅读到这样的句子:

loop_01 lea bx, [data_rows]
    mov al, 0x65
    mov [bx], al
    
    lea dx, [data_rows]
    mov ah, 0x0a
    int 21h
    
    inc word [len_data]
    
    mov al, [data_rows + 1]
    cmp al, 0
    jne loop_01
jei2mxaa

jei2mxaa1#

lea bx, [data_rows]
mov al, 0x65
mov [bx], al

最好不仅设置缓冲区大小,而且还将第二个字节预加载为0。了解为什么在How buffered input works中这样做更好。

mov  bx, data_rows
mov  ax, 101
mov  [bx], ax

由于您为大缓冲区中的每个 record(“record”比“segment”更好)分配了固定数量的字节,并且您认为空输入是所有输入的结束,因此填充大缓冲区的过程如下:

mov  cx, -1                 ; Number of non-empty records
  mov  bx, data_rows - 104
InputLoop:
  inc  cx
  add  bx, 104
  mov  ax, 101                ; Preset input structure
  mov  [bx], ax
  mov  dx, bx
  mov  ah, 0x0A               ; DOS.BufferedInput
  int  21h
  cmp  byte [bx + 1], 0       ; Number of inputted characters
  jne  InputLoop
  mov  [NumberOfRecords], cx

这是一个处理大缓冲区的例子,这段代码计算输入行的平均长度,然后根据需要进行调整:

mov  cx, [NumberOfRecords]
  jcxz NothingToDo
  mov  bx, data_rows
  xor  ax, ax                 ; Sum of lengths, max is 600 x 100 
SumLoop:
  add  al, [bx + 1]           ; Number of characters
  adc  ah, 0
  add  bx, 104                ; Hop to next record
  loop SumLoop
  xor  dx, dx
  div  word [NumberOfRecords] ; -> AX is average length of the lines
  ...
NothingToDo:

相关问题