ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

汇编王爽老师,编写int 9中断例程,用esc键改变字母颜色

2021-11-23 16:32:02  阅读:188  来源: 互联网

标签:例程 mov pop int esc push ax ds es


  第一点要注意的是原int 9例程用 iret 语句返回,从栈里弹出三个数据。我们用call 语句调用int 9 例程,需要也入栈一个寄存器值 pushf,保持对应。
  修改中断向量表时,用 cli 和 sti 语句禁用中断,和恢复中断。防止程序出错。

assume cs:code,ds:data,ss:stack
stack segment
	db 128 dup (0)
stack ends

data segment 
	db 4 dup (0)
data ends

code segment
main:
	mov ax,stack
	mov ss,ax
	mov sp,128;设置栈段
	
	mov ax,data
	mov ds,ax;设置数据段,保存原int9中断例程入口地址
	
	mov ax,0
	mov es,ax
	
	cli
	mov ax,es:[9 * 4];IP
	mov ds:[0],ax
	mov ax,es:[9 * 4 + 2];CS,保存原int9入口
	mov ds:[2],ax
	sti
	
	mov word ptr es:[9 * 4],offset int9
	mov word ptr es:[9 * 4 + 2],cs;int9 指向新段
	
	mov ax,0b800h
	mov es,ax
	mov ah,'a'
	show:
		mov es:[160 * 12 + 40 * 2],ah
		call delay
		inc ah
		cmp ah,'z'
	jna show
		
	mov ax,0
	mov es,ax
	
	cli
	push ds:[0]
	pop es:[9 * 4]
	push ds:[2]
	pop es:[9 * 4 + 2]
	sti
	
	mov ax,4c00h
	int 21h
	
	
	
	
	delay:
		push ax
		push dx
			
		mov dx,10h
		mov ax,0
		godelay:
			sub ax,1
			sbb dx,0
			cmp ax,0
		jne godelay
			cmp dx,0
		jne godelay
		
		pop dx
		pop ax
	ret
	
	int9:
		push ax
		push bx
		push es
		
		in al,60h
		
		pushf
		pushf
		pop bx
		and bh,11111100b
		push bx
		popf 
		call dword ptr ds:[0];以call调用,int9以iret返回
		
		cmp al,1
		jne int9ret
		mov ax,0b800h
		mov es,ax
		inc byte ptr es:[160 * 12 + 2 * 40 + 1]
		
		int9ret:
			pop es
			pop bx
			pop ax
	iret;重点,以iret返回中断掉用

code ends
end main

  测试效果如下:
在这里插入图片描述
谢谢阅读

标签:例程,mov,pop,int,esc,push,ax,ds,es
来源: https://blog.csdn.net/zhangzhangkeji/article/details/121496351

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有