如何解决在汇编中读取和打印字符的宏
我正在学习汇编中的宏,但被困在某个地方。我试图在宏文件中仅读取和打印一个字符,如下所示。 (我想学习如何使用函数 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。