2014-01-16 5 views
1

я пишу программу, основной находится в турбо с и функции находятся в сборкеx86 ассемблере прерывание 9 код

это главное в турбо с

#include <stdio.h> 
#include <dos.h> 
#include <string.h> 
extern void eliminate_multiple_press(); // save old function adress in 32bit  pointer 
            // setvect , add new function to inturupt 9 
extern void uneliminate_multiple_press(); // restore old function to inturupt 9 
int main() 
{ 
char *str; 
eliminate_multiple_press(); 
printf("Enter a string:\n"); 
scanf("%s",str); 
printf("the string you entered:\n"); 
printf("%s\n",str); 

uneliminate_multiple_press(); 

return 0; 
} 

и это функции в сборке

.MODEL LARGE 
PUBLIC _eliminate_multiple_press 
PUBLIC _uneliminate_multiple_press 

.STACK 100H 
.DATA 
INT9SAVE DD ? 
hexa_code db 0 
scan_code db 0 
.CODE 

KEY_HANDLER PROC FAR 
PUSH AX 

MOV AH,0 
int 16h 
mov scan_code,ah 
mov hexa_code,al 
POP AX 
iRET 
KEY_HANDLER ENDP 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
_eliminate_multiple_press PROC FAR 

PUSH AX  
PUSH ES 
MOV AX,0 
MOV ES,AX 

;INT9SAVE = GETVECT(9); 
MOV AX,ES:[9*4] ; **ax=c1 hex =193 dec** 
MOV WORD PTR INT9SAVE,AX 
MOV AX,ES:[9*4+2] **ax=15c7 hex = 5575 dec** 
MOV WORD PTR INT9SAVE+2,AX 

;SETVECT(9,KEY_HANDLER); 
CLI 
MOV WORD PTR ES:[9*4],OFFSET KEY_HANDLER ; **ES stays 0** 
MOV WORD PTR ES:[9*4+2],SEG KEY_HANDLER ; **ES stays 0** 
STI 
POP ES  
POP AX 
RET 
_eliminate_multiple_press ENDP 

;SETVECT(9,INT9SAVE); 
_uneliminate_multiple_press PROC FAR 
PUSH ES 
PUSH AX 
MOV AX,0 
MOV ES,AX 
CLI 
MOV AX,WORD PTR INT9SAVE 
MOV ES:[9*4],AX 
MOV AX,WORD PTR INT9SAVE+2 
MOV ES:[9*4+2],AX 
STI 
POP AX 
POP ES 
RET 
_uneliminate_multiple_press ENDP 



END 

, когда я скомпилировать файлы, используя эту команду: TCC -ML -r- lastc.c lasta.asm компилирует ре rfecly без проблем

цель этого кода для устранения умножения нажмите на клавиатуре так, если я нажимаю: 334ffffghjjjj моей клавиатуры мой выход на экране будет 34fghj

проблема когда Я запускаю программу lastc.exe, она застревает в printf («введите строку: \ n»); поэтому я предполагаю, что у меня есть проблемы с изменением исходной функции INT 9 к моей новой функции (key_handler)

* * Функция key_handler не является полной, но по крайней мере он должен END функции и продолжается до конца кода * * всякая помощь будет отличная спасибо.

+3

Ничего себе, что такое ностальгическое сообщение :) – valdo

+0

P.S. вы можете попробовать этот код на виртуальной машине с помощью отладчика и посмотреть, что происходит в файле elim_multiple_press. – valdo

+0

Я обновил, что происходит в отладчике в elim_multiple_press ** Я не могу видеть в отладчике, что код перескакивает на функцию key_handler где угодно ** – aminhalloun

ответ

2

Почему eliminate_multiple_press и uneliminate_multiple_press заявлены как обработчики прерываний? Они должны быть нормальными функциями с возвратом RET. Они называются функциями и не предназначены для ответа на прерывание.

В вашей C программы, то:

extern void eliminate_multiple_press(); // save old function adress in 32bit  pointer 
            // setvect , add new function to inturupt 9 
extern void uneliminate_multiple_press(); // restore old function to inturupt 9 

И сборку, RET вместо IRET. И вам не нужно, чтобы сохранить так много регистров:

_eliminate_multiple_press PROC FAR 
    push ES 
    push AX 

    MOV AX,0 
    MOV ES,AX 

    ;INT9SAVE = GETVECT(9); 
    MOV AX,ES:[9*4] ; **ax=c1 hex =193 dec** 
    MOV WORD PTR INT9SAVE,AX 
    MOV AX,ES:[9*4+2] **ax=15c7 hex = 5575 dec** 
    MOV WORD PTR INT9SAVE+2,AX 

    ;SETVECT(9,KEY_HANDLER); 
    CLI 
    MOV WORD PTR ES:[9*4],OFFSET KEY_HANDLER ; **ES stays 0** 
    MOV WORD PTR ES:[9*4+2],SEG KEY_HANDLER ; **ES stays 0** 
    STI 

    POP AX 
    POP ES 
    RET 
_eliminate_multiple_press ENDP 


;SETVECT(9,INT9SAVE); 
_uneliminate_multiple_press PROC FAR 
    PUSH ES 
    PUSH AX 

    MOV AX,0 
    MOV ES,AX 

    CLI 
    MOV AX,WORD PTR INT9SAVE 
    MOV ES:[9*4],AX 
    MOV AX,WORD PTR INT9SAVE+2 
    MOV ES:[9*4+2],AX ; Was "[27*4+2]" which is incorrect. 
    STI 

    POP AX 
    POP ES 
    RET 

_uneliminate_multiple_press ENDP 
+0

, так что если я правильно понимаю ... мой key_handler должен быть завершен iret Я прямо на этом? , потому что это функция, которая была заменена старой функцией прерывания 9 @mbratch – aminhalloun

+0

@aminhalloun да.'KEY_HANDLER' - ваш обработчик прерываний, который заменит старый, поэтому ему нужно« IRET »и сохранить регистры (я рекомендую' pusha' и 'popa', если вы не уверены, что регистрирует изменения' int 16h'). Функции, которые вы вызываете с C, не являются обработчиками прерываний. – lurker

+0

i обновил мой код там..бо еще мой exe flie застрял в функции printf !! Я не могу понять, в чем проблема? – aminhalloun

-2

Конец прерывания (ВЗ) представляет собой сигнал, посылаемый программируемый контроллер прерываний (PIC) для указывают на завершение обработки прерывания для данного прерывания ,

mov al,020h ; =EOI 
out 020h,al 
Смежные вопросы