在引导扇区文件中放置汇编子程序的位置
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
我在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