【问题标题】:Don't get full buffer with DOS input-string / output-string calls不要通过 DOS 输入字符串/输出字符串调用获得完整的缓冲区
【发布时间】:2021-11-11 07:02:13
【问题描述】:

为什么当我尝试获取我的输出时,只能得到原始输入缓冲区的一半(甚至更少)?

一开始我输入随机符号,当我将它们传输到新缓冲区时,结果我得到了原来缓冲区的一半,我不知道为什么

这些是我的代码的一部分:

我的数据段:

.data
buff     db 255,?,255 dup("$")
result   db 255,?,255 dup(" ")
_result  db "Result: $"
endl     db 13,10,"$"

我用 int21,0Ah 扫描:

    mov ah, 0Ah
    mov dx, offset buff
    int 21h

这里我将符号转移到另一个缓冲区

    loop_tranfer:
        
        mov ah, [si]     ;source buffer     
        mov  [ di ], ah      ;ah move to result buffer 
        inc di               ;increase destination index
        inc si               ;increase source index
                                              
    loop loop_tranfer

在这里我想得到一个结果,但我不能

    mov ah, 09h
    mov dx, offset _result ;message "Result:"
    int 21h
    
    mov ah, 40h
    mov bx, 1 
    xor cx, cx
    mov cl, result+1
    mov dx, offset result ; result ; here I get less than than entered
    int 21h

    mov ax, 4c00h ;exit
    int 21h 

end start

【问题讨论】:

  • 有什么建议吗?
  • loop uses cx,您显示的 sn-ps 在循环之前没有将任何有意义的内容放入 cx 中。

标签: assembly dos x86-16


【解决方案1】:

我用 int21,0Ah 扫描:

请阅读How buffered input works

您没有向我们展示您如何初始化您在 loop_tranfer 中使用的 CXSIDI 寄存器。这是相当必要的!

(1) 将一个完整的缓冲区复制到另一个:

mov   di, offset result
mov   si, offset buff
mov   cx, 2+255

(2) 仅将输入的符号复制到另一个缓冲区(同步)

mov   di, offset result+2
mov   si, offset buff+2
movzx cx, byte ptr [si-1]

(3) 仅将输入的符号复制到另一个缓冲区(不同步)

mov   di, offset result
mov   si, offset buff+2
movzx cx, byte ptr [si-1]

mov dx, offset result

如果您制作的缓冲区副本包括 2 个标头字节 (1),那么可以想象,DOS.WriteToDevice 函数 40h 可以将第二个字节中的值(实际长度)解释为特殊字节。例如。长度为 8 将执行退格,因为您将字节发送到 STDOUT,即屏幕。

mov cl, result+1

如果您制作的缓冲区副本仅包含实际字符,但您从 result (3) 开始复制这些字符,那么您传递给 DOS 的长度功能可以变化很大!长度将根据字符的 ASCII 码得出。

【讨论】:

  • 我在xor cx, cx ;clear register中使用CX;和SI, DI 作为源和目标寄存器:mov si, offset buff+2 ;source mov di, offset result ;destination
  • @NewAtC 如果您以计数CX=0 开始您的loop_tranfer 循环,那么LOOP 指令将迭代65536 次。这将导致数据段发生严重变化,并且可以解释为什么您只获得了所需输出的一半或更少。无论如何,你说你使用匹配案例(3)的指针来自我的回答。
  • 我在循环之前没有使用CX,所以也许这是一个错误,但是如果我在我的代码中输入movzx cx, byte ptr [si-1],我会收到错误Illeagal instructions
  • @NewAtC 根据您使用的编码/执行环境,MOVZX 指令确实可能不可用。您可以轻松替换它:xor cx, cxmov cl, [si-1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2013-01-16
  • 2014-12-22
相关资源
最近更新 更多