编写包含多个功能子程序的中断例程
来源:互联网 发布:诲女知之乎 编辑:程序博客网 时间:2024/05/16 14:35
安装一个新的int 7ch中断例程,为显示输出提供如下功能子程序:
(1)清屏 (2)设置前景色 (3)设置背景色 (4)向上滚动一行
贴上网上一段代码,写下自己的注释:
data segment
str1 db "First: You will can't look us!",'$'
str2 db "Second: Because we are in Row 1, now!",'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,str1 ;lea指令是将str1的偏移地址存放在dx寄存器中
mov ah,9 ;显示第一个字符串str1
int 21h
mov bh,0
mov dh,1
mov dl,0
mov ah,2
int 10h ;将光标置为第1行、第0列[行、列下标都从0开始]。
lea dx,str2
mov ah,9
int 21h ;显示第二个字符串str2
mov ah,1 ;从设置前景色开始进行循环
mov al,1 ; 颜色属性初始为1(1为蓝色)
func: push ax
cmp ah,3
ja quit
call setscreen
call delay ;延迟
pop ax
inc ah ;功能号加1
inc al ;颜色属性加1后变为绿色
jmp short func
quit: mov ah,0 ;跳出循环后则清屏
call setscreen
mov ax,4c00h
int 21h
setscreen proc near ;设置屏幕函数的子程序
jmp short set
table: dw sub1,sub2,sub3,sub4 ;存放四个功能子程序偏移地址的表结构
set: push ax
push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx] ;调用对应的功能子程序
sret: pop bx
pop ax
ret
setscreen endp
delay proc near ;延迟函数,让CPU执行15000000h次减法。
push ax
push dx
mov dx,1500h
mov ax,0
s1: sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
delay endp
sub1 proc near ;清屏的子过程定义
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s: mov byte ptr es:[bx],0
;mov byte ptr es:[bx+1],0 ;是否也清除屏幕的背景色(随便你)
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
sub1 endp
sub2 proc near ;设置前景色的子过程定义
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
sub2 endp
sub3 proc near ;设置背景色的子过程定义
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
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
ret
sub3 endp
sub4 proc near ;向上滚动一行的子过程定义
push cx
push di
push ds
push es
push si
mov si,0b800h
mov ds,si
mov es,si
mov si,160
mov di,0
cld
mov cx,24
sub4s: push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1: mov byte ptr [160*24+si],' '
add si,2
loop sub4s1
pop si
pop es
pop ds
pop di
pop cx
ret
sub4 endp
code ends
end start
str1 db "First: You will can't look us!",'$'
str2 db "Second: Because we are in Row 1, now!",'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,str1 ;lea指令是将str1的偏移地址存放在dx寄存器中
mov ah,9 ;显示第一个字符串str1
int 21h
mov bh,0
mov dh,1
mov dl,0
mov ah,2
int 10h ;将光标置为第1行、第0列[行、列下标都从0开始]。
lea dx,str2
mov ah,9
int 21h ;显示第二个字符串str2
mov ah,1 ;从设置前景色开始进行循环
mov al,1 ; 颜色属性初始为1(1为蓝色)
func: push ax
cmp ah,3
ja quit
call setscreen
call delay ;延迟
pop ax
inc ah ;功能号加1
inc al ;颜色属性加1后变为绿色
jmp short func
quit: mov ah,0 ;跳出循环后则清屏
call setscreen
mov ax,4c00h
int 21h
setscreen proc near ;设置屏幕函数的子程序
jmp short set
table: dw sub1,sub2,sub3,sub4 ;存放四个功能子程序偏移地址的表结构
set: push ax
push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx] ;调用对应的功能子程序
sret: pop bx
pop ax
ret
setscreen endp
delay proc near ;延迟函数,让CPU执行15000000h次减法。
push ax
push dx
mov dx,1500h
mov ax,0
s1: sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
delay endp
sub1 proc near ;清屏的子过程定义
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s: mov byte ptr es:[bx],0
;mov byte ptr es:[bx+1],0 ;是否也清除屏幕的背景色(随便你)
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
sub1 endp
sub2 proc near ;设置前景色的子过程定义
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
sub2 endp
sub3 proc near ;设置背景色的子过程定义
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
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
ret
sub3 endp
sub4 proc near ;向上滚动一行的子过程定义
push cx
push di
push ds
push es
push si
mov si,0b800h
mov ds,si
mov es,si
mov si,160
mov di,0
cld
mov cx,24
sub4s: push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1: mov byte ptr [160*24+si],' '
add si,2
loop sub4s1
pop si
pop es
pop ds
pop di
pop cx
ret
sub4 endp
code ends
end start
此程序通过循环[标号func处]来自动完成各功能号的调用。此程序实现的效果依次是:设置前景色[此时(ah)=1、(al)=1],设置背景色[此时(ah)=2、(al)=2],向上滚动一行[此时(ah)=3],清屏[此时(ah)=0]。程序之所以首先显示两个字符串,是为了辅助测试程序的四个子功能(尤其是向上滚
- 编写包含多个功能子程序的中断例程
- 编写包含多个功能子程序的中断例程
- 实验十六_编写包含多个功能子程序的中断例程
- 汇编语言----实验16--编写包含多个功能子程序的中断例程
- [Hb-XVI] 编写包含多个功能子程序的中断例程(直接定址表)
- 王爽 汇编 实验16 编写包含多个功能子程序的中断例程
- 王爽《汇编语言》实验16——编写包含多个功能子程序的中断例程
- 王爽《汇编语言》实验17——编写包含多个功能子程序的中断例程
- ***汇编语言 实验16 编写包含多个功能子程序的中断例程
- 实验16 编写包含多个功能子程序的中断例程
- 汇编实验16 编写包含多个功能子程序的中断例程——浅谈直接地址表
- 王爽《汇编语言》实验16:包含多个功能子程序的中断例程 解答
- 多个功能子程序的中断例程测试程序
- 编写并安装int7ch中断例程,功能为完成loop指令的功能
- 汇编,编写并安装int 7ch中断例程,功能为完成loop指令的功能
- ;编写安装中断7ch的中断例程
- 编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处
- 编写子程序的原则
- 怎样成为优秀的软件模型设计者?
- 统一建模语言UML轻松入门之基本概念
- WPF下实现控件的拖动操作
- JBoss Config GUI:简介
- QT中的SOCKET编程
- 编写包含多个功能子程序的中断例程
- java也可以来做黑客:端口扫描
- 如果可以拥有你
- UML 基础: 类图
- 删除RedHat Enterprise Linux的方法
- QT中的QSOCKET编程
- 缓冲区溢出的原理和实践
- Java学习笔记_身份验证机制
- 恋爱…女人永远不要主动