在引导扇区文件中放置汇编子程序的位置

Where to put assembly subroutines in boot sector file

我在nasm中写入了以下引导扇区:

[org 0x7c00]

my_print_function:
    mov ah, 0x0e
    int 0x10
    ret

_start:
    mov al, 'A'
    call my_print_function
    call my_print_function

_boot:
    jmp $
    times 510-($-$$) db 0
    dw 0xaa55

我用nasm -f bin boot.asm -o boot.bin编译,然后用运行qemu boot.bin编译,我只看到一个字符被打印出来,是乱码'U',不是[=14] =].如果我更改 my_print_function_start 的顺序,它会按预期工作,但子例程也会 运行 自己执行一次,而无需我调用它,因此它会打印 'A' 三遍.

通常如果我在写汇编,我会在我的 section .text 之前定义 my_print_function,然后在我的 section .text 中放一个 global _start,但它没有这似乎在这里没有任何作用。我怎样才能定义和使用这样的子例程,而不会因为我定义它而额外花费 运行 时间?

我在尝试做其他事情时想通了,并且意识到自己做错了什么。子程序需要在无限跳转之后,例如:

[org 0x7c00]

mov al, 'A'
call my_print_function
mov al, 'B'
call my_print_function

jmp $
my_print_function:
    mov ah, 0x0e
    int 0x10
    ret

times 510-($-$$) db 0
dw 0xaa55