当前位置: 首页 > ops >正文

《汇编语言》第16章 直接定址表——实验16 编写包含多个功能子程序的中断例程

安装一个新的int 7ch中断例程,为显示输出提供如下功能子程序。

(1)清屏;

(2)设置前景色;

(3)设置背景色;

(4) 向上滚动一行。

入口参数说明如下。

(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;

(2)对于1、2号功能,用al传送颜色值,(al)={0,1,2,3,4,5,6,7}。

中断程序源代码

;sy16_1.asm    任务:安装一个新的int 7ch中断例程 
;功能:为显示输出提供功能子程序
;参数:ah传递功能号;0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行,对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}assume cs:code
code segment 
;新的 int 7ch中断例程
s:		jmp short set 
table dw sub1,sub2,sub3,sub4 
set:	push bx cmp ah,3 							;判断ah中的功能号是否大于3 je sret mov bl,ah mov bh,0add bx,bx							;计算对应子程序在table表中的偏移call word ptr table[bx] 		;调用对应的功能子程序
sret:	pop bx iret 
;功能:清屏
sub1:	push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000
sub1s:	mov byte ptr es:[bx],' '	add bx,2 loop sub1s pop es pop cx pop bx ret 
;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub2:	push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000
sub2s:	and byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx ret 
;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub3:	push ax push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000
sub3s:	and byte ptr es:[bx],10001111b or es:[bx],al add bx,2 loop sub3s pop es pop cx pop bx pop ax ret 
;向上滚动一行
sub4:	push cx push si push di push es push ds mov si,0b800h mov es,si mov ds,si mov si,160 						;ds:si指向第N+1行mov di,0							;es:di指向第N行cld mov cx,24						;共复制24行
sub4s:	push cx mov cx,160rep movsb 						;复制pop cx loop sub4s mov cx,80
sub4s1: mov byte ptr [160*24+si],' ' ;最后一行清空add bx,2 loop sub4s1 pop ds pop es pop di pop si pop cx ret 
send:	nop 
start:	mov ax,csmov ds,ax mov si,offset s 						;设置ds:si指向原地址mov ax,0 mov es,ax mov di,200h 						;设置es:di指向目标地址mov cx,offset send-offset s 	;设置cx为传输长度cld										;设置传输方向为正rep movsb 
;在中断向量表中设置新的int 7ch中断例程的入口地址cli 										;设置IF=0屏蔽中断;table[bx]默认的段存器为cs,所以在安装程序中设置中断向量表时,应设:cs=200h,ip=0,而不是cs=0,ip=200h mov word ptr es:[7ch*4],0					;IP=0mov word ptr es:[7ch*4+2],20h				;cs=20h * 10h 转换成代码段地址时会是200h  CS*16 : IP 
;结束mov ax,4c00h int 21h code ends 
end start 

测试程序源码

;sy16.asm    实验16 应用举例测试程序
assume cs:code 
code segment 
start:	mov ax,202h 		;高8位为功能号,低8位为颜色值===》2号功能,颜色设置为02h(绿色)int 7ch mov ax,4c00h int 21h code ends 
end start 

运行结果:

http://www.xdnf.cn/news/12824.html

相关文章:

  • 【时时三省】(C语言基础)局部变量和全局变量例题
  • 贝叶斯定理与医学分析(t检验场景)
  • 【量化】策略交易 - 均线策略(Moving Average Strategy)
  • 如何在Redhat Linux7.9下安装配置MySQL
  • 历史数据分析——辽港股份
  • Java高频面试之并发编程-24
  • Semantic-SAM: Segment and Recognize Anything at Any Granularity
  • 大模型如何选型?嵌入模型如何选型?
  • 【PhysUnits】17.2 配套变量结构体 Var(variable.rs)
  • 一套个人知识储备库构建方案
  • UE的AI行为树Selector和Sequence如何理解
  • 数据结构——D/串
  • comfyui 工作流中 图生视频 如何增加视频的长度到5秒
  • C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
  • Vivado软件开发流程操作详解
  • 五年级数学知识边界总结思考-下册
  • 【会员专享数据】1980—2022年中国逐日月年潜在蒸散发栅格数据
  • JavaScript 数组学习总结
  • Spyglass:跨时钟域同步(时钟门控单元)
  • eBPF系列--BCC中提供的BPF maps高级抽象如何映射到内核的BPF maps?
  • 【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化
  • 比较一组结构之间的变换
  • Python爬虫实战:研究PySocks库相关技术
  • Halcon案例(三):C#联合Halcon识别排线
  • 【整数逐位除法求余补〇完整版】2022-4-11
  • 1 Studying《Linux Media Documentation》
  • 深度学习模块缝合
  • 【redis】线程IO模型
  • 第16届蓝桥杯青少Stema11月 Scratch编程——初/中级组真题——行走的图形
  • GD图像处理与SESSiON