我試圖重新編程指令向量表。下面是我的代碼使用方法:C(DOS)中的嵌入式彙編 - 非法指令
#include <stdio.h>
int a=1;
void func();
void keyboard()
{
printf("\n\nkeyboard!!!\n");
a=0;
asm{iret}
}
int main()
{
printf("starting...");
func();
return 0;
}
int vectorcs = 0;
int vectorip = 0;
void func()
{
printf("\n*****\n");
asm{
cli
mov ax,0
mov es,ax
mov bx,36
mov ax,word ptr es:[bx]
mov vectorip,ax
push ax
mov ax,word ptr es:[bx+2]
mov vectorcs,ax
push ax
mov ax,cs
mov word ptr es:[bx],offset keyboard
mov es:[bx+2],ax
sti
}
printf("\n%d %d\n",vectorip,vectorcs);
while (a) {
}
asm {
cli
mov es,bx
mov bx,36
pop ax
mov word ptr es:[bx+2],ax
}
asm{
pop ax
mov word ptr es:[bx],ax
sti
}
}
我用的Turbo C++ 3.0 當我嘗試運行此程序,「16位MS-DOS子系統:該NTVDM CPU遇到非法指令。」出現。然後顯示CS,OP和IP寄存器的內容。我無法繼續該計劃。有什麼建議麼?
不使用dos.h怎麼辦?通過getvect和setvect我瞭解您的代碼,您可以在代碼段之後調用原始鍵盤功能。如果我不能使用getvect-setvect,你有什麼建議嗎? – Mikael
查看我答案中的最後一個鏈接。有足夠的asm代碼讓你開始使用中斷處理程序。 –
我再次看到,但我要求內聯彙編。我無法設法解決C中的函數或中斷向量表,我在兩天內得到相同的錯誤。我用函數中斷關鍵字,將函數添加到函數結尾(再次),但仍然是同樣的事情。 – Mikael