【问题标题】:How to load input from keyboard into an array in 8086?如何将键盘输入加载到 8086 中的数组中?
【发布时间】:2015-10-12 09:29:53
【问题描述】:

我正在用汇编语言练习字符串的输入和输出 - 8086 环境。我遇到了以下代码:

 org 100h

 .DATA

 SNAME DB 21,0,22 DUP('$')
 .CODE

 MOV AH, 0AH
 LEA DX, SNAME  

 INT 21H
 MOV AH, 9H
 LEA DX, SNAME +2;
 INT 21H
 ret

我知道程序接受来自键盘的字符串形式的输入并将其显示在屏幕上。 但是,我在这里遗漏了两件事

  1. 我们如何判断用户输入存储在变量SNAME中?指令LEA 是否让程序知道这一点?我问这个是因为在高级语言中我们可以说SNAME=someUserInput; - 这里我没有看到MOV SMANE,someUserInput;

  2. 我们为什么要在这个instaruction LEA DX,SNAME +2中添加2

【问题讨论】:

  • 如果你看看缓冲输入是如何完成的,你会发现 DX 包含 int 21h / ah = 0ah_ 的缓冲区地址. SNAME+2 是在使用 int 21h / ah = 09h_ 打印缓冲区时。输入命令返回的实际字符串前面有两个需要跳过的字节。有关 dos 输入命令的信息,请参阅:spike.scu.edu.au/~barry/interrupts.html#ah0a

标签: string assembly io x86-16


【解决方案1】:

我们如何判断用户输入将存储在变量 SNAME 中?

因为您的程序使用 DOS 输入功能 0Ah,需要您设置一个缓冲区来接收输入的字符。偏移量 0 处的字节必须指定从偏移量 2 开始有多少字节可用。指定 21 意味着您将能够输入 20 个字符。额外的字节将用回车符(ASCII 13)填充。

我们为什么要在这个instaruction LEA DX,SNAME +2 中加2?

DOS 输入函数将从偏移量 2 开始的输入字符存储在您指定的缓冲区中。在偏移量 1 处,您会找到一个包含输入字符数的字节。在这些输入的字符后面,DOS 添加了一个回车符(ASCII 13)。这意味着按照您的方式打印将不可避免地将光标留在行首。

【讨论】:

  • 嗯,这就是重点 - 现在我明白了,谢谢。
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2013-12-18
  • 2014-08-14
相关资源
最近更新 更多