我有下面的代碼,在這裏我想實現,使用BIOS功能打印字符串的函數:如何在16位模式下使用GDB?
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中斷,由第一個參數作爲給定的,具有包含用於斧頭,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中?
你不能在'gdb'運行的目標文件,無論有多少位。您需要製作可執行文件,如錯誤消息所述。對於16位代碼,您還需要16位環境,例如'qemu'。 – Jester 2015-03-02 14:15:13
@Jester但它在32位模式下使用gcc。命令'gcc -g program.c -o programname'用於生成一個目標代碼,並使用'gdb programname'運行。 – sarthak 2015-03-02 15:07:19
是的,現在用兩條命令行來「發現差異」。請注意''gcc'沒有**具有'-c'並生成可執行文件(也被缺少的'.o'擴展名所暗示),但是''bcc''確實**具有'-c'(這意味着編譯爲對象)並且輸出具有'.o'擴展名。 – Jester 2015-03-02 15:08:06