я пишу программу, основной находится в турбо с и функции находятся в сборке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 функции и продолжается до конца кода * * всякая помощь будет отличная спасибо.
Ничего себе, что такое ностальгическое сообщение :) – valdo
P.S. вы можете попробовать этот код на виртуальной машине с помощью отладчика и посмотреть, что происходит в файле elim_multiple_press. – valdo
Я обновил, что происходит в отладчике в elim_multiple_press ** Я не могу видеть в отладчике, что код перескакивает на функцию key_handler где угодно ** – aminhalloun