Nasm简单的bootloader。呼叫和返回无法正常工作

时间:2015-01-08 19:48:42

标签: assembly system nasm bootloader

我有这段代码:

;bootloader
[bits 16]
[org 0x7c00]

jmp main

print_char:
    mov ah,0x0e
    mov bh,0x00
    mov al,65
    int 0x10
ret

main:
    call print_char

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

因此,它应该跳转到main并调用print_char在屏幕上打印字母A,但它不起作用!我正在使用qemu + gdb进行测试。我在开始时在gdb中设置了sevreal断点,在调用print_char时设置了另一个断点,在ret上设置了最后一个断点。我发现在这段代码中没有调用print_char。我的代码出了什么问题?

我的调试会话:

(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in ?? ()
(gdb) br *0x7c00
Breakpoint 1 at 0x7c00
(gdb) br *0x7c00+0x3
Breakpoint 2 at 0x7c03
(gdb) br *0x7c00+0xb
Breakpoint 3 at 0x7c0b
(gdb) br *0x7c00+0xc
Breakpoint 4 at 0x7c0c
(gdb) stepi
0x0000e05b in ?? ()
(gdb) c
Continuing.

Breakpoint 1, 0x00007c00 in ?? ()
(gdb) stepi

Breakpoint 4, 0x00007c0c in ?? ()
(gdb) stepi
0x00007c0e in ?? ()
(gdb) stepi
0x00007c10 in ?? ()
(gdb) stepi
0x00007c12 in ?? ()
(gdb) stepi
0x00007c15 in ?? ()
(gdb)

lst file:

 1                                  ;bootloader
 2                                  [bits 16]
 3                                  [org 0x7c00]
 4                                  
 5                                  
 6 00000000 E90900                  jmp main
 7                                  
 8                                  print_char:
 9 00000003 B40E                        mov ah,0x0e
10 00000005 B700                        mov bh,0x00
11 00000007 B041                        mov al,65
12 00000009 CD10                        int 0x10
13 0000000B C3                      ret
14                                  
15                                  main:
16 0000000C E8F4FF                      call print_char
17                                      
18                                  
19 0000000F 00<rept>                times 510-($-$$) db 0
20         

21 000001FE 55AA                    dw 0xAA55

解决。

看起来很糟糕的软盘图像。修复了使用我的二进制文件qemu boot.bin

启动qemu

1 个答案:

答案 0 :(得分:0)

不是实际问题,而是在评论中提出的问题:

  

但如果我想写我的&#34; os&#34;到软盘,会有几个文件?

你是:
- 在Windows上?
使用Virtual Floppy Disk,一个免费工具。不知道它是如何工作的。
- 在Linux上? 使用ddmkfs.fat dd if=/dev/zero of=floppy.img bs=512 count=2880将为您制作1.44M的软盘 losetup /dev/loop0 floppy.img将图像连接到设备文件 mkfs.fat /dev/loop0将创建通常在软盘上使用的FAT12文件系统。 dd if=bootloader.bin of=floppy.img安装你的bootloader - 在OS X上?
使用hdiutil
hdiutil create -type UDIF -layout NONE -sectors 2880 -fs "MS-DOS FAT12" floppy.img创建格式化的软盘映像 dd if=bootloader.bin of=floppy.img安装引导加载程序。与Linux相同。

您应该设置BIOS parameter block,否则无法安装图像。

让项目继续进行!