명령 벡터 테이블을 다시 프로그램하려고합니다. 여기에 코드를 내가 사용된다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
}
}
내가이 프로그램을 실행하려고하면 3.0 는, 터보 C++를 사용하고 "16 비트 MS-DOS 하위 시스템 :. NTVDM CPU가 불법 지시가 발생했습니다" 나타납니다. CS, OP 및 IP 레지스터의 내용을 보여줍니다. 나는 프로그램을 계속할 수 없다. 어떤 제안? 당신이 무슨 일을하는지
dos.h를 사용하지 않는 것은 어떻습니까? getvect 및 setvect에 의해 귀하의 코드를 이해, 당신은 코드 세그먼트 후 원래의 키보드 함수를 호출합니다. getvect-setvect를 사용할 수 없다면 어떤 제안이 있습니까? – Mikael
내 대답의 마지막 링크를 참조하십시오. 인터럽트 처리기로 시작할 수있는 충분한 asm 코드가 있습니다. –
다시 보지만 인라인 어셈블리를 묻습니다. C 또는 인터럽트 벡터 테이블의 함수를 처리 할 수 없어서 이틀 동안 같은 오류가 발생합니다. 나는 함수에 인터럽트 키워드를 사용하고, 함수의 끝 (다시)에 덧붙인 iret를 사용했다. 그러나 여전히 똑같은 것이다. – Mikael