我有这段代码:
;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
答案 0 :(得分:0)
不是实际问题,而是在评论中提出的问题:
但如果我想写我的&#34; os&#34;到软盘,会有几个文件?
你是:
- 在Windows上?
使用Virtual Floppy Disk,一个免费工具。不知道它是如何工作的。
- 在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
安装你的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,否则无法安装图像。
让项目继续进行!