Assembly nasm:编写一个简单的打印函数

Assembly nasm:编写一个简单的打印函数,assembly,nasm,bootloader,bare-metal,Assembly,Nasm,Bootloader,Bare Metal,鉴于以下代码,我正在尝试在外部文件中实现打印功能: [ org 0x7c00 ] mov bx , HELLO_MSG call print_string mov bx , GOODBYE_MSG call print_string jmp $ %include "print_string.asm" HELLO_MSG: db "Hello , World !" , 0 ; GOODBYE_MSG: db "Goodbye !", 0 times 510 -( $ - $$ ) d

鉴于以下代码,我正在尝试在外部文件中实现打印功能:

[ org 0x7c00 ]

mov bx , HELLO_MSG
call print_string

mov bx , GOODBYE_MSG
call print_string

jmp $

%include "print_string.asm"

HELLO_MSG:
db "Hello , World !" , 0 ;

GOODBYE_MSG:
db "Goodbye !", 0

times 510 -( $ - $$ ) db 0
dw 0xaa55
我编写的函数如下所示:

print_string :
pusha
mov ax, bx
mov ah , 0x0e
int 0x10
popa
ret
但它不起作用。我猜是因为我用错了寄存器。。。但我有点困惑,因为在本教程前面的示例中,要打印的字符首先被移动到al,而在打印函数中,仅使用此选项:

mov ah , 0x0e
int 0x10
ret
但既然这里使用了bx,我就不能只打印al中的内容,对吗


非常感谢您的帮助

虽然我不知道赋值是什么,但我可以根据代码猜测,以前的赋值/练习让您在屏幕int 0x10/ah=0x0e上打印一个字符,但它只打印一个字符。现在似乎需要在bx中传递地址的位置显示一个字符串。字符串可能无法放入寄存器,因此您需要传递地址。要打印字符串,您必须循环使用以nul 0结尾的字符串,并在打印过程中逐个打印每个字符,将每个字符移动到al。如果您要为80286或更高版本编写代码,则还有另一个选项,即使用int 0x10/ah=13h。更多关于视频中断的信息可以找到。不过我怀疑,如果这是教授让你手动遍历内存中的字符串打印每个字符的作业。如果你正在编写引导加载程序,我强烈建议你将DS寄存器甚至ES设置为0,因为你使用的是7c00h的ORG。虽然它可以在模拟器上工作,但您使用它可能无法在真正的硬件或其他模拟器和虚拟机上工作。我在这篇文章中写了一些编写引导加载程序的一般技巧。特别是,这可能是您要查看的代码类型。