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

Macros to read and print a character in assembly

我正在学习汇编中的宏,但我被困在某个地方。我试图在宏文件中只读取和打印一个字符,如下所示。 (我想学习如何使用函数 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, but INT 21H / AH = 02H expects the character to be written in the DL register.

所以在两次调用之间尝试 MOV DL, AL

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

你程序中的EMPTYCHAR结构符合你说你不想使用(这次)的。但是,它对您今天打算使用的功能没有任何作用。

READCHAR 宏根本不需要参数。 DOS.GetCharacter函数01h将returnAL寄存器中按下的键的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(输出回车符 return)和 PRINTCHAR "-"(输出连字符),甚至是 PRINTCHAR [Char] 中的内存引用。

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

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