用于在汇编中读取和打印字符的宏
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
我正在学习汇编中的宏,但我被困在某个地方。我试图在宏文件中只读取和打印一个字符,如下所示。 (我想学习如何使用函数 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