我有以下代码,我试图为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.
有人可以解释我为什么陷入循环?
编辑: 另请解释断点陷阱的含义以及为什么会出现此错误。我读了一个相关的问题,但我无法理解答案。