陷入QEmu的无限循环

时间:2015-03-08 17:27:16

标签: c assembly x86 gdb

我有以下代码,我试图为x86的16位模式添加新的中断(int 0x21):

void main()
{
char* str = "Enter the string!\n\r";
makeInterrupt21();
interrupt(0x21,0,str,0,0);
}

中断和makeInterrupt21函数是用汇编语言编写的。中断函数只调用第一个参数给出的中断号,其余参数分别确定ax,bx,cx和dx寄存器的值。
makeInterrupt21函数设置中断0x21的跳转地址的条目。

.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

.global _makeInterrupt21
_makeInterrupt21:
push bp
mov bp, sp
push es
mov ax, #0x0
mov es, ax
mov bx, #0x84
mov ax, #interrupt21ServiceHandler
eseg
mov [bx], ax
eseg
mov [bx + 0x2], ds
pop es
pop bp
ret

.extern _handleInterrupt21
interrupt21ServiceHandler:
push dx
push cx
push bx
push ax
call _handleInterrupt21
ret

handleInterrupt21是中断0x21的中断处理函数,用C:

写入
void handleInterrupt21(int ax, int bx, int cx, int dx)
{
  char* line;
  line = bx;
  switch (ax)
    {
     case 0x0:
       printString(line);
       break;
     default:
       printString("Error invalid arguments!");
       break;
    }
}

printString函数打印从给定参数给出的地址开始的字符串:

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;
}

当我在QEmu上运行此代码时,我进入一个无限循环,打印出来:

Enter the string!
Enter the string!
Enter the string!

当我在QEmu上运行时,我收到以下错误:

Program received signal SIGTRAP, Trace/breakpoint trap.

有人可以解释我为什么陷入循环?

编辑: 另请解释断点陷阱的含义以及为什么会出现此错误。我读了一个相关的问题,但我无法理解答案。

0 个答案:

没有答案