gpt4 book ai didi

c - 如何在 16 位模式下使用 GDB?

转载 作者:太空狗 更新时间:2023-10-29 15:19:32 25 4
gpt4 key购买 nike

我有以下代码,我试图在其中实现一个使用 BIOS 函数打印字符串的函数:

int printString(char* string)
{
int i = 0;
while (*(string + i) != '\0')
{
char al = *(string + i);
char ah = 0xe;
int ax = ah * 256 + al;
interrupt(0x10,ax,0,0,0);
i++;
}
return i;
}

函数中断是在汇编中实现的。它调用适当的 BIOS 中断,由第一个参数给出,其余参数分别包含 ax、bx、cx 和 dx 寄存器的内容:

.global _interrupt
_interrupt:
push bp
mov bp, sp
push si
push ds
mov ax, #0x100
mov ds, ax
mov ax, [bp + 0x4]
mov si, #intr
mov [si + 1], al
pop ds
mov ax, [bp + 0x6]
mov bx, [bp + 0x8]
mov cx, [bp + 0xa]
mov dx, [bp + 0xc]
intr: int #0x0
pop si
pop bp
ret

因为我使用 BIOS 中断,所以我使用 16 位模式来编译这段代码。我使用了以下命令:

bcc -ansi -c -o printString.o printString.c

我想在 GDB 中测试此代码,但是当我尝试使用以下命令将此 printString.o 文件加载到 gdb 中时:

gdb printString.o

我收到以下错误:

“/home/kern/printString.o”:不是可执行格式:无法识别文件格式

我还尝试使用以下方法将 GDB 更改为 16 位格式:

set architecture i8086

但是这个错误还是来了。如何将 16 位代码加载到 GDB 中?

最佳答案

最小的 QEMU 示例

qemu-system-i386 -hda main.img -S -s &
gdb -ex 'target remote localhost:1234' \
-ex 'set architecture i8086' \
-ex 'break *0x7c00' \
-ex 'continue'

其中 main.imgboot sector .

  • break *0x7c00:第一条指令不是您的引导扇区,而是执行 BIOS 设置的 0x0000fff0see also .因此,我们使用它从引导扇区加载到的位置开始。
  • set architecture i8086:对于常规的 ELF 可执行文件,GDB 可以根据 header 确定架构。但是对于原始引导扇区,没有这样的元数据,所以我们必须告诉它。

另见:

关于c - 如何在 16 位模式下使用 GDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com