我刚开始学习汇编,我对DL(数据寄存器)和AL(累积寄存器)有一点困惑。
mov dl,35h mov ah,2 int 21h
运行后,值35h将首先移动到AL,然后显示。而在取输入输出程序时:
mov ah, 1 int 21h mov dl,al mov ah,2 int 21h
首先使用mov将值复制到DL,但是为什么不能直接从AL显示它,因为它已经输入到AL中了?
mov
5m1hhzi41#
运行后,值35 h将首先移动到AL,然后显示。一开始我以为你指的是这个DOS函数确实把DL复制到AL作为它正常操作的一部分。这个函数返回的是AL寄存器中输入的字符。也许这就是你困惑的地方吧?您可能想看一下Displaying characters with DOS or BIOS。DOS.KeyboardInputWithEcho函数01 h提供给您的是AL寄存器中的字符,而DOS.DisplayCharacter函数02 h要求您提供的是DL寄存器中的字符。这就是为什么您需要额外的put in mov dl, al指令的原因。为什么我们不能直接从AL中显示它,因为它已经输入到AL中了?如果您选择了BIOS.Teletype函数0 Eh来显示字符,那么您就不必将AL复制到DL,因为该BIOS函数确实需要AL寄存器中的字符。无论是BIOS还是DOS,对于每个API调用,您都必须找出哪些寄存器需要哪些信息,以及哪些寄存器将包含结果。无需猜测!最终,是api的设计者选择了寄存器,我们只能跟随。
mov dl, al
1条答案
按热度按时间5m1hhzi41#
运行后,值35 h将首先移动到AL,然后显示。
一开始我以为你指的是这个DOS函数确实把DL复制到AL作为它正常操作的一部分。这个函数返回的是AL寄存器中输入的字符。也许这就是你困惑的地方吧?
您可能想看一下Displaying characters with DOS or BIOS。
DOS.KeyboardInputWithEcho函数01 h提供给您的是AL寄存器中的字符,而DOS.DisplayCharacter函数02 h要求您提供的是DL寄存器中的字符。这就是为什么您需要额外的put in
mov dl, al
指令的原因。为什么我们不能直接从AL中显示它,因为它已经输入到AL中了?
如果您选择了BIOS.Teletype函数0 Eh来显示字符,那么您就不必将AL复制到DL,因为该BIOS函数确实需要AL寄存器中的字符。
无论是BIOS还是DOS,对于每个API调用,您都必须找出哪些寄存器需要哪些信息,以及哪些寄存器将包含结果。无需猜测!
最终,是api的设计者选择了寄存器,我们只能跟随。