[英]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上? 使用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
将安装您的引导程序。
-在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.