在汇编中读取和打印字符的宏

问题描述

我正在学习汇编中的宏,但被困在某个地方。我试图在宏文件中仅读取和打印一个字符,如下所示。 (我想学习如何使用函数 01h 和 02h,因为现在我知道如何使用函数 09h 和 0Ah):

READCHAR MACRO INPUT2
MOV AH,01H
INT 21H
ENDM

PRINTCHAR MACRO INPUT2
MOV AH,02H
INT 21H
ENDM

我在 .ASM 文件中这样称呼它们:

.data
EMPTYCHAR DB 1,?,1 DUP (‘$’)
.code
READCHAR EMPTYCHAR 
PRINTCHAR EMPTYCHAR

它失败了,我不知道为什么。任何想法都会有所帮助。

解决方法

INT 21H / AH = 01H puts the character read into the AL register,但是 INT 21H / AH = 02H expects the character to be written in the DL register

因此尝试在两次调用之间使用 MOV DL,AL

请注意,就目前而言,您的 EMPTYCHAR 缓冲区根本没有做任何事情;这些调用不使用内存缓冲区,实际上您的宏甚至不使用它们的 INPUT2 参数。我不确定你打算做什么;如果你想把角色存入内存,你必须自己把它存储在那里。

,

您程序中的 EMPTYCHAR 结构适合您说不想使用的 DOS.BufferedInput function 0Ah(这次)。但是,它对您今天打算使用的功能没有任何作用。

READCHAR 宏根本不需要参数。 DOS.GetCharacter 函数 01h 将返回 AL 寄存器中按下的键的 ASCII 码。
另一方面,PRINTCHAR 宏确实需要一个有任何用途的参数。毕竟 DOS.PrintCharacter 函数 02h 期望在 DL 寄存器中接收一个 ASCII 代码。

你的宏应该这样写:

READCHAR MACRO
  mov ah,01h    ; DOS.GetCharacter
  int 21h        ; -> AL
ENDM

PRINTCHAR MACRO TheArg
  mov dl,TheArg
  mov ah,02h    ; DOS.PrintCharacter
  int 21h
ENDM

以及如何使用它们:

.data
Char DB 0
.code
READCHAR         ; -> AL
mov [Char],al   ; Only in case you desire to save a copy in memory,else strike this line!
PRINTCHAR al

PRINTCHAR 宏指定参数不仅限于 AL 寄存器。您还可以提供像 PRINTCHAR 13(输出回车)和 PRINTCHAR "-"(输出连字符)那样的立即数,甚至像 PRINTCHAR [Char] 那样的内存引用。

另请注意,有时保留如下所示的一些寄存器可能会很有用:

PRINTCHAR MACRO TheArg
  push dx
  mov  dl,TheArg
  mov  ah,02h    ; DOS.PrintCharacter
  int  21h
  pop  dx
ENDM

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...