Assembly Nasm简单引导加载程序。Call和ret不能正常工作

Assembly Nasm简单引导加载程序。Call和ret不能正常工作,assembly,system,nasm,bootloader,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进行测试

我有以下代码:

;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中设置了几个真正的断点,一个在开头,另一个在调用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文件:

 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的问题。不是实际的问题,而是评论中提出的问题:

但是如果我想把我的操作系统写在软盘上,并且会有几个文件

你是: -在窗户上? 使用虚拟软盘,一个免费的工具。但不知道它是如何工作的。 -在Linux上? 使用dd和mkfs.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安装引导程序。 -在OSX上? 使用hdiutil。 hdiutil create-type UDIF-layout NONE-sectors 2880-fs MS-DOS FAT12 floppy.img创建格式化的软盘映像。 dd if=bootloader.bin of=floppy.img安装引导加载程序。和Linux一样

您应该设置一个,否则无法安装映像


继续这个项目

我能看到的唯一问题是,在调用之后您没有代码。为无止境循环添加一个JMP$并在qemu中运行确实会在屏幕上生成预期的字母a。我想你可能看到了gdb bug。它不太擅长调试16位实模式代码。在调用print_char后添加jmp$不会改变任何东西。Gdb只是忽略它。但只是运行它,你不打印A吗?它应该可以正常工作,这只是一个调试问题。不,只有从软盘引导。。。并将光标移到新行上。这就是全部。问题仍然存在于call指令中——它根本不起作用。即使使用gdb,它在这里也能正常工作。