如何从汇编中的寄存器打印?

时间:2018-09-26 19:49:55

标签: assembly x86-16 bios

首先,我必须声明我是ASM的新手。

我有一个将字符移动到AL并将其打印到屏幕上的示例:

mov al, 041h
int 10h                 
mov al, 042h
int 10h
mov al, 043h
int 10h
ret

这会将ABC打印到屏幕上。

如何将这3个字符移到另一个寄存器中,我该怎么做?例如DL。

2 个答案:

答案 0 :(得分:1)

  

如何将这3个字符移到另一个寄存器中,我该怎么做?例如DL。

你不能。

int 10h函数具有固定的调用约定。您可以在需要它们的寄存器中传递参数。 mov al,dl

https://en.wikipedia.org/wiki/INT_10H。您需要先在AH中设置功能代码,例如“ {type}输出”功能的mov ah, 0Eh / int 10h。 (在文本模式下,它仅查看AL。文档中还提到了BX中的页码和颜色,但您没有使用它。)

答案 1 :(得分:1)

  

这会将ABC打印到屏幕上。

仅当我们假设client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname, username = user, password = pw) channel = client.get_transport().open_session() command = "cd c:\;dir" channel.exec_command(command) out = channel.makefile().read() err = channel.makefile_stderr().read() returncode = channel.recv_exit_status() channel.close() # channel is closed, but not the client 是BIOS Teletype功能的标识号时,您显示的代码才能执行此操作。

  

如何通过将这3个字符移动到另一个寄存器来类似的操作?例如DL。

可以!

除了BIOS API(AH=0Eh)外,还有DOS API(int 10h)。
如果将字符(一次一个)放入int 21h寄存器中,则DOS Character Output function 02h还将在屏幕上打印它们,并且还有其他好处,您不必担心DisplayPage号DL中的字符或BH中的CharacterColor。

BL

彼得·科德斯(Peter Cordes)的答案显然仍然正确。

  

“您不能自由选择用于请求任何API函数的寄存器。”

关于十六进制数字的注释。

在类似mov ah, 02h ;DOS Character Output mov dl, 41h int 21h mov dl, 42h int 21h mov dl, 43h int 21h 的指令中,将十六进制数字加 0 作为前缀是多余的,至少对我来说,这会降低可读性。
您只应将以字母开头的十六进制数字零前缀,所以以'A'...'F'开头的十六进制数字。