在Nasm中调用汇编函数

3
我目前正在从头开始构建一个简单的操作系统,所以我正在测试一些引导扇区代码,并使用Qemu进行模拟。
我的引导扇区代码应该在操作系统启动时打印出“A”。
以下是第一版引导扇区代码(不使用函数调用):
[org 0x7c00]

mov al,'A'
mov ah,0x0e  ; int 10/ ah = 0eh -> scrolling teletype BIOS routine
int 0x10

jmp $

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

执行nasm生成的二进制文件后,使用以下命令:
qemu-system-i386 test.bin

结果是正确的,字符“A”出现在它应该出现的地方。

但是,在尝试使用一个打印存储在al中的字符的函数后,屏幕上没有任何输出。

这里是test.asm文件的第二个版本(包括此次调用函数)。

[org 0x7c00]

mov al,'A'

call my_print_function

jmp $

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


my_print_function:
    pusha  ; push all registers

    ; same code as the first version to print a character stored in al
    mov ah,0x0e  
    int 0x10

    popa ; pop all registers
    ret

所以为什么它不能正常运行呢?任何帮助都将不胜感激。谢谢。

你将函数放在程序结尾(BIOS将加载的512字节)之后了!请将其移到times行之前... - Frank Kotler
1个回答

7
你必须在启动扇区的末尾拥有签名。我说的是这部分内容:
times 510 -( $ - $$ ) db 0
dw 0xaa55

你的 my_print_function 目前不在引导扇区内,甚至连 BIOS 都没有加载它。

你需要将这个函数移动到标志之前。


你能展示给我如何让相同的函数打印一个字符串而不是单个字符吗? - goodbytes
1
@bhargav 你的问题与此无关,请提出一个单独的问题。或者最好先在Google上搜索汇编教程并学习它们。 - Alexey Frunze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接