CH364-ISL测试卡在采用汇编编写中断时INT 1CH,如: MOV WORD PTR ES:[1CH*4],OFFSET MAIN_ENTRY2 MOV WORD PTR ES:[1CH*4+2], SEG MAIN_ENTRY2 结果却不执行 MAIN_ENTRY2 标号相应的程序,而是系统直接死机。 请问 1、如何处理?是否能提供详细的代码及说明。 2、在MAIN_ENTRY2 最后采用IRET是否能退出相应中断? 谢谢。
把整个代码结构说清楚,你的代码是以什么方式启动,如果是以扩展ROM方式启动,要确定,定时中断INT 1CH这个时候是否已经初始化好了,一般INT 8这个时候是初始化好的,在DOS系统里我记的是INT8里面调用了INT 1C.还有MAIN_ENTRY2里面执行完了,最好JMP 到原INT1CH处,要注意代码有没有放在压缩的段里。
该代码是扩展ROM方式启动的,通过在MAIN_ENTRY2前增加: ORG 0100H MAIN_ENTRY2: NOP pusha ;略每16次执行一下两条代码一次 MOV BX,OFFSET STR_ROM_INIT3 CALL _PUT_TEXT popa IRET
后,相应中断入口修改为 MOV WORD PTR ES:[1CH*4],0100H MOV AX,CS MOV WORD PTR ES:[1CH*4+2],AX 系统可进入中断并打印提示信息,但无法退出INT 1C 中断执行后续的代码。如果保存1CH的内容为INT1C_IP_OLD,并通过将IRET 替换为 JMP INT1C_IP_OLD 也无法退出, 请问该中断如何退出。谢谢
INT1C_IP_OLD 应该定义成4字节变量
;ORG 0100H这个去掉,放在SYSTEM段,你为什么要用ORG 0100H呢? MAIN_ENTRY2: NOP pushf pusha push ds push cs pop ds sti ;略每16次执行一下两条代码一次 MOV BX,OFFSET STR_ROM_INIT3 CALL _PUT_TEXT cli pop ds popa popf IRET ;或JMP INT1C_IP_OLD
相应中断入口修改为 MOV AX,OFFSET MAIN_ENTRY2 MOV WORD PTR ES:[1CH*4],AX MOV AX,CS MOV WORD PTR ES:[1CH*4+2],AX
1、采用ORG 0100H或不采用均可进入1CH中断; 2、但无论采用IRET ;或JMP INT1C_IP_OLD,中断均无法退出继续执行后续代码(启动WINDOW,直接黑屏,键盘Ctrl+ALT+Del也无法重启),不知是否漏了其它部分吗?
在进入MAIN_ENTRY之后最好把中断1C取消,启动操作系统时很可能会破坏你的扩展ROM代码。
该程序的目的主要是1C中断在WINODOWS运行时必须保持,是不能取消的,请问如何处理才能解决。
你这样做是比较复杂的,可能行不通!WIN 2K以上是不会调用你的INT 1C的,WIN 2K以上系统运行时是不依赖与BIOS。
给你发个网上的一个相似的例子,没有测试过! UploadImages/201063014292180.rar