※ 引述《ericwang1017 (Eric)》之铭言:
: 各位版大好
: 我使用 QEMU -fda os.img -s -S + GDB remote 去 debug 我自己很简单的 asm
: 在使用 target remote localhost:1234 之后很顺利的连线到了qemu
: 下断点 b *0x7c00 也可以顺利地停在 eip 0x7c00
: 我第一个指令是
: ljmp $0x7C00, $_start
: 但遇到个一个问题, ljmp 虽然可以把 CS:IP 设为 0x7c00:0, 但是之后的int 10使用 si 或是ni 就一去不回头了
: 对int 10之后下断点也没用(例如对fin下断点, 并不会在那边中断)
: 但是如果ld使用 -Ttext = 0x7c00 , 并且注解掉ljmp $0x7C00, $_start的话
: cs = 0 , eip = 0x7c00 时, 似乎GDB 就可以让我使用int 10
: 而且这两种写法, qemu 都可以正常模拟, 只是CS:IP 设为 0x7c00:0这种情况的 gdb 不给debug
: 是我 gdb 的参数没有设好吗, 我也设过 set architecture i8086 似乎也没用
: code 如下
: .code16
: ljmp $0x07C0, $_start
: _start:
: mov %cs,%ax
: mov %ax,%ds
: mov %ax,%es
: mov $0xFF00, %sp
: mov $12,%cx
: mov $MsgMove, %ax
: mov %ax, %bp
: mov $0x1301,%ax
: mov $0x00c,%bx
: int $0x10
: fin:
: hlt
: jmp fin
: MsgMove:.ascii "Hello World!"
: .org 510
: .word 0xaa55
小弟也只是x86新手
最近也在阅读自己写作业系统的书籍
所以不保证我所说的是100%正确的
纯粹就我的理解来跟大家分享...
以下节录自《Orange's 一个作业系统的实现》的书籍内容: