繁体   English   中英

nasm简单的引导程序。 通话和重拨无法正常工作

[英]Nasm simple bootloader. Call and ret do not work properly

我有以下代码:

;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)

第一个文件:

 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进行了修复

不是实际的问题,而是评论中的一个问题:

但是,如果我想将“ os”写到软盘上,将会有几个文件?

你是:
-在Windows上?
使用免费的虚拟软盘。 不确定如何运作。
-在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将安装您的引导程序。
-在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参数块 ,否则无法挂载映像。

继续进行下去!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM