【问题标题】:Calling Assembly Functions in Nasm在 Nasm 中调用汇编函数
【发布时间】:2013-04-13 22:53:15
【问题描述】:

我目前正在从头开始构建一个简单的操作系统,因此我正在测试一些引导扇区代码并使用 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 行之前...

标签: function assembly x86 nasm bios


【解决方案1】:

您必须在其末尾有引导扇区的签名。我说的是这部分:

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

现在您的 my_print_function 不在引导扇区范围内,甚至没有被 BIOS 加载。

你需要把这个函数移到签名之前。

【讨论】:

  • 你能告诉我如何获得相同的函数来打印字符串而不是单个字符吗?
  • @bhargav 你的问题在这里无关紧要。做一个单独的问题。或者更好的是谷歌上组装教程并先学习它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多