命令ベクトルテーブルを再プログラムしようとしています。ここで私が使用したコードは次のとおりです。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
}
}
私はこのプログラムを実行しようとすると、ターボC++ 3.0 を使用しています「16ビットMS-DOSサブシステム:NTVDM CPUは不正命令を検出しました」表示されます。 CS、OP、IPレジスタの内容を表示します。私はプログラムを続行できません。助言がありますか?何をやっている
dos.hを使用しないのはどうですか? getvectとsetvectによって私はあなたのコードを理解し、コードセグメントの後に元のキーボード関数を呼び出します。私がgetvect-setvectを使用できない場合は、それについて何か提案がありますか? – Mikael
私の答えの最後のリンクを参照してください。割り込みハンドラを使い始めるのに十分なasmコードがあります。 –
私は再び見るが、私はインラインアセンブリを求めている。私はCまたは割り込みベクトルテーブルの関数を扱うことができなかった、私は2日間同じエラーが発生します。関数に割り込みキーワードを使用し、関数の最後にiretを追加しましたが(やはり同じことですが) – Mikael