【汇编语言】中断
2021/5/10 1:26:38
本文主要是介绍【汇编语言】中断,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
中断的定义就不再叙述了,自行百度
中断向量号:
中断向量:
中断向量表:
中断服务程序:
sti,cli的作用以及什么时候用?
中断的过程,到底干了什么事?
(理解)中断向量的存放的内存地址在哪里、中断向量的值、中断向量值的含义。
中断向量存放在地址为0000:0000h~0000:03ffh的内存空间中。
中断向量号为n,则中断向量就存放在地址为0000:4n,0000:4n+1,0000:4n+2,0000:4n+3中。
中断向量就是cs:ip的值,
中断向量号为n,则中断向量的ip = 0000:[4n],cs = 0000:[4n+2]
每个中断都有自己的作用,所以要明确int n的作用就好了。
内部中断服务程序:
①获取原来中断向量号n的对应的中断向量的值,并保存
第一种方法:
INTNO EQU 1CH ;设中断向量号为1CH DATA SEGMENT OLDISR DW ?,? DATA ENDS ;代码段 MOV AL, INTNO MOV AH,35H INT 21H ;ES:BX MOV OLDISR[0], BX MOV AX,ES MOV OLDISR[2], AX
第二种方法:
INTNO EQU 1CH ;设中断向量号为1CH DATA SEGMENT OLDISR DW ?,? DATA ENDS ;代码段 MOV AX,0 MOV ES,AX CLI MOV AX, ES:[INTNO*4] MOV OLDISR[0],AX MOV AX,ES:[INTNO*4+2] MOV OLDISR[2], AX STI
②将你写好的子程序的段地址:偏移地址赋值给原中断向量
③调用新中断向量,int n
④将现在中断向量的值修改为刚开始保存原中断向量的值。
int 1ch作用:每秒18.2次时钟中断所调用的子程序,没修改之前,它只有iret这样一句。
理解下面两个程序,中断就学会了!。
INTNO EQU 1CH USEINT = 0 DATA SEGMENT STRING DB ' 1CH IS HOOKED!',0DH,0AH,'$' OLDISR DW ?,? TIMER DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV ES,AX ;PROTECT IF USEINT MOV AL, INTNO MOV AH,35H INT 21H ;ES:BX MOV OLDISR[0], BX MOV AX,ES MOV OLDISR[2], AX ELSE CLI MOV AX, ES:[INTNO*4] MOV OLDISR[0],AX MOV AX,ES:[INTNO*4+2] MOV OLDISR[2], AX STI ENDIF ;SET NEW ISR IF USEINT PUSH DS MOV AX, SEG ISR MOV DS,AX MOV DX, OFFSET ISR MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV WORD PTR ES:[INTNO*4], OFFSET ISR MOV WORD PTR ES:[INTNO*4+2],SEG ISR STI ENDIF ;COUNT HERE AGAIN: CMP TIMER, 10 JAE EXIT JMP AGAIN EXIT: ;RESTORE IF USEINT PUSH DS MOV DX,OLDISR[0] MOV AX,OLDISR[2] MOV DS,AX MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV AX,OLDISR[0] MOV ES:[INTNO*4],AX MOV AX,OLDISR[2] MOV ES:[INTNO*4+2],AX STI ENDIF MOV AX,4C00H INT 21H ISR PROC FAR PUSH DX PUSH AX MOV AX,DATA MOV DS,AX STI ;便于中断嵌套 MOV AH,2 MOV DL,TIMER ADD DL,30H INT 21H LEA DX,STRING MOV AH,9 INT 21H INC TIMER DONE: PUSHF CALL DWORD PTR OLDISR CLI POP AX POP DX IRET ;中断返回 ISR ENDP CODE ENDS END START
INTNO EQU 1CH USEINT = 1 DATA SEGMENT OLDISR DW ?,? TIMER DB 100 COUNTER DW 30 ISDONE DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV ES,AX ;PROTECT IF USEINT MOV AL, INTNO MOV AH,35H INT 21H ;ES:BX MOV OLDISR[0], BX MOV AX,ES MOV OLDISR[2], AX ELSE CLI MOV AX, ES:[INTNO*4] MOV OLDISR[0],AX MOV AX,ES:[INTNO*4+2] MOV OLDISR[2], AX STI ENDIF ;SET NEW ISR IF USEINT PUSH DS MOV AX, SEG ISR MOV DS,AX MOV DX, OFFSET ISR MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV WORD PTR ES:[INTNO*4], OFFSET ISR MOV WORD PTR ES:[INTNO*4+2],SEG ISR STI ENDIF ;WAIT HERE WAITHERE: CMP ISDONE,1 JNZ WAITHERE EXIT: ;RESTORE IF USEINT PUSH DS MOV DX,OLDISR[0] MOV AX,OLDISR[2] MOV DS,AX MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV AX,OLDISR[0] MOV ES:[INTNO*4],AX MOV AX,OLDISR[2] MOV ES:[INTNO*4+2],AX STI ENDIF MOV AX,4C00H INT 21H ISR PROC FAR PUSH DX PUSH AX MOV AX,DATA MOV DS,AX STI ;便于中断嵌套 ;COUNT HERE INC TIMER AGAIN: CMP TIMER, 1000/55 ;18 JB DONE MOV TIMER,0 ;carriage MOV AH,2 MOV DL,13 INT 21H ;print time MOV AX,COUNTER MOV DL,10 DIV DL MOV DH,AH MOV DL,AL MOV AH,2 ADD DL,30H INT 21H MOV DL,DH ADD DL,30H INT 21H DEC COUNTER JGE DONE MOV ISDONE,1 DONE: PUSHF CALL DWORD PTR OLDISR CLI POP AX POP DX IRET ;中断返回 ISR ENDP CODE ENDS END START
这篇关于【汇编语言】中断的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-20测试人员都是画画大神,让我看看谁还不会用代码图?
- 2024-05-20年薪百万的程序员都在用的摸鱼方式……
- 2024-05-19永别了,微服务架构!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了