【问题标题】:Taking input from the Keyboard in Assembly (TASM)从键盘输入(TASM)
【发布时间】:2012-09-16 14:29:48
【问题描述】:

我已经有了从键盘获取输入并将其打印在屏幕上的程序,但我无法理解几行代码,

这里是代码,

     MOV DS, AX
      MOV ES, AX        ;Why Move AX content to ES ???

      MOV DX, OFFSET PNAME      ; PRINT NAME: 
      MOV AH, 09H               
      INT 21H                   


      MOV BYTE PTR SNAME, 21    

      MOV DX, OFFSET SNAME      
      MOV AH, 0AH
      INT 21H

      MOV SI, 0002              

      LEA DX, SNAME[SI]         ; PRINT NAME ENTERED
      MOV AH, 09H
      INT 21H

为什么我们首先将大小为 21 的字节移动到 SNAME ???? 键盘输入中断服务的结果如何自动存储在 SNAME 中而不是 AL 中???

【问题讨论】:

  • 如果您调用 1H(从输入设备读取一个字符),您会期望 AL 中的输入。在这里,您正在将一个字符串打印到标准输出设备 (9H),然后您正在从标准输入设备 (0AH) 读取一个字符串,然后您正在打印接收到的输入。
  • 为什么我们首先将 21 字节的大小移动到 SNAME 中??

标签: assembly dos x86-16


【解决方案1】:

查看您最喜欢的 MSDOS 函数参考。

你可以在那里找到this:

Format of DOS input buffer:

Offset  Size    Description     (Table 01344)
00h    BYTE    maximum characters buffer can hold
01h    BYTE    (call) number of chars from last input which may be recalled
(ret) number of characters actually read, excluding CR
02h  N BYTEs   actual characters read, including the final carriage return

因此,21 设置了您可以从键盘读取到缓冲区的最大字符数。

至于“How Result of Keyboard input interrupt service automatically stored in SNAME instead of AL ???”,问题不清楚。

【讨论】:

  • 我的意思是说dos如何知道键盘必须分配给变量SNAME,如果有多个变量将分配给谁?
  • 你的意思是什么?你给 DOS 一个 SNAME 的地址,它用它来写,不出所料,SNAME。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2011-02-10
相关资源
最近更新 更多