gpt4 book ai didi

c - 替换键盘中断(中断 9)时,scanf 似乎不接受输入

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:42 25 4
gpt4 key购买 nike

<分区>

我正在用 Turbo-C 编写主程序,函数在汇编中。我的代码如下:

lastc.c:

#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;
}

lasta.asm:

.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

此代码的目标是消除键盘上的多次(重复)按键操作。如果我输入这个字符序列:

334ffffghjjjj of my keyboard

屏幕上的输出应该是

34fghj


问题

当我运行程序 lastc.exe 时,它卡在 printf("enter a string:\n"); 处。我想我在将 Interrupt 9h 中断服务例程更改为我的新函数 key_handler

时遇到了问题

函数 key_handler 不完整,但至少它应该结束函数并继续到代码的末尾

为什么调用 scanf 时我的程序似乎什么也没做?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com