【问题标题】:How to take input and then display as output (assembly 8086)如何获取输入然后显示为输出(程序集 8086)
【发布时间】:2018-01-08 15:55:06
【问题描述】:

我有以下代码。

.data
msg         db 10, 13, "this is a string $"
bufferSize  db 21  ; 20 char + RETURN
inputLength db 0   ; number of read characters
buffer      db 21 DUP(0) ; actual buffer

.code

main proc
    mov ax, @data
    mov ds, ax
    lea dx, msg
    mov ah, 09h ;output
    int 21h

    mov dx, offset bufferSize ; load our pointer to the beginning of the structure
    mov ah, 0Ah ; GetLine function
    int 21h

    xor dx, dx
    lea dx, buffer
    mov ah, 06h ;output
    int 21h

    mov ah,0
    int 21h

endp
end main

代码应提示输入名称,然后显示它。提示正确,但不显示结果。

【问题讨论】:

  • int 21h/ah=06h 读取单个字符。也许您打算使用int 21h/ah=0ah。此外,int 21h/ah=09h 会打印 strings,因此您不能像在程序结束时尝试那样使用它来打印单个字符。
  • 是的,我使用了 0ah 并且它有效,但是在输入之后它在哪里存储输入?如果我输入不能用 21h/09h 打印,你是什么意思?我可以用什么来打印它?
  • “但是在输入之后它会将输入存储在哪里” 你在哪里told the interrupt function to store it“如果我接受输入是什么意思,我不能用 21h/09h 打印它” 看起来你正试图通过将字符放在 dl 中然后使用 @987654327 来打印单个字符@。这是行不通的,因为int 21h/ah=09h 打印$ 终止的字符串。查找int 21h 函数的参考资料,了解您可以使用哪些函数。
  • 我更新了它,如果可以的话,告诉我问题出在哪里:)
  • 你在 .data 中保留空间,但给 DOS .code:BufferSize 地址,如果你有 EXE 文件,这是不同的段(cs == ds 仅在 COM 文件中)。在你的第一个输出正确之后,你的缓冲区也是正确的ds,所以没有必要做mov ax,csmov ds,ax,这是设置ds指向.code段。

标签: assembly emu8086


【解决方案1】:

如果您在 How buffered input works

代码应提示输入名称,然后显示它。提示正确,但不显示结果。

链接帖子中的示例正是这样做的。

  1. 它会打印一个提示。
  2. 使用函数 0Ah 输入。
  3. 打印结果。

【讨论】:

    【解决方案2】:
    .model small
    .stack 100h 
    .data
    msg         db 10, 13, "this is a string $"
    bufferSize  db 21  ; 20 char + RETURN
    inputLength db 0   ; number of read characters
    buffer      db 21 DUP("$") ; actual buffer
    
    .code
    main proc
    
    mov ax, @data
    mov ds, ax
    lea dx, msg
    mov ah, 09h ;output
    int 21h
    
    mov dx, offset bufferSize ; load our pointer to the beginning of the structure
    mov ah, 10 ; GetLine function
    int 21h
    
    mov ax, @data 
    mov ds , ax 
    lea dx, buffer
    mov ah, 09 ;output
    int 21h
    
    endp
    end main    
    

    【讨论】:

      【解决方案3】:
      .model tiny
      .stack 100h
      .code
      main proc
          mov ah,1
          int 21h
          mov bl,al 
          
          mov ah,1
          int 21h
          mov bh,al
          
          mov ah,2
          mov dl,bl
          int 21h   
          
          
          mov ah,2
          mov dl,bh
          int 21h
                    
                    
      end main
      

      【讨论】:

      • 没有解释的代码转储对于试图了解这些部分如何组合在一起以制作工作程序的人来说不是很有用。无论用户想要输入多少字节,这似乎都准确地读取了 2 个字节(然后按顺序将它们写回)。
      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多