簡體   English   中英

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

[英]How to use GDB in 16-bit mode?

我有以下代碼,我試圖在其中實現一個使用 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.img引導扇區

  • break *0x7c00 :第一條指令不是你的引導扇區,而是0x0000fff0進行 BIOS 設置, 另見 所以我們使用它從引導扇區加載到的位置開始。
  • set architecture i8086 :對於常規 ELF 可執行文件,GDB 可以從頭文件中決定架構。 但是對於原始引導扇區,沒有這樣的元數據,所以我們必須告訴它。

也可以看看:

正如 Jester 在評論中所說,您不能使用gdb運行目標文件。

並且您不能使用gdb運行 16 位可執行文件或 16 位匯編代碼。 您必須使用qemu東西在模擬 CPU 上運行代碼並使用gdb連接到它,或者您可以使用dosbox來運行代碼並在 DOS 上使用調試程序。 請記住,在現代操作系統(如 Linux)上使用 BIOS 中斷是錯誤的,因為這些操作系統在啟動時會禁用 BIOS 中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM