第16章
检测点16.1
下面的程序将code段中a处的8个数据累加,结果存储到b处的双字中,补全程序。
assume cs:code
code segment
a dw 1,2,3,4,5,6,7,8
b dd 0
start:mov si,0 ;使用si访问a段数据
mov cx,8 ;传输8次
s:mov ax,a[si] ;将a[si]中的数据取出放入ax中
add word ptr b[0],ax ;将ax加到b中
adc word ptr b[2],0 ;加上进位
add si,2 ;si+2访问下一个数据(字型数据)
loop s
mov ax,4c00h
int 21h
code ends
end start
检测点16.2
下面的程序将data段中a处的8个数据累加,结果存储到b处的字中,补全程序。
assume cs:code,es:data
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends
code segment
start:mov ax,data
mov es,ax ;es指向数据段
mov si,0 ;使用si访问a段数据
mov cx,8 ;传输8次
s:mov al,a[si] ;将a[si]中的数据取出放入al中
mov ah,0 ;将0送入ah
add b,ax ;将ax中的数据加到b中(字型数据)
inc si ;si+1指向下一个数据
loop s
mov ax,4c00h
int 21h
code ends
end start
实验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}。
assume cs:code
code segment
start:;中断处理程序安装
mov ax,cs
mov ds,ax ;ds指向当前程序段
mov si,offset int7ch ;将中断处理程序的偏移地址放入si中
mov ax,0
mov es,ax ;es指向内存单元地址0处
mov di,200h ;将内存单元偏移地址200h放入di中
mov cx,offset int7chend-offset int7ch ;获取中断处理程序的长度
cld ;设置正方向传输
rep movsb ;安装中断处理程序
mov ax,0
mov es,ax ;es指向中断向量表
mov word ptr es:[7ch*4],200h ;将新的中断处理程序入口地址放入中断向量表(偏移地址)
mov word ptr es:[7ch*4+2],0 ;将新的中断处理程序入口地址放入中断向量表(段地址)
;中断测试
mov ah,1 ;设置前景色
mov al,4 ;红色
int 7ch ;调用中断程序
mov ax,4c00h
int 21h
int7ch:cmp ah,0
je do1
cmp ah,1
je do2
cmp ah,2
je do3
cmp ah,3
je do4
do1:call sub1
jmp sret
do2:call sub2
jmp sret
do3:call sub3
jmp sret
do4:call sub4
jmp sret
;清屏
sub1:push bx ;寄存器内容入栈保存
push cx
push es
mov bx,0b800h
mov es,bx ;es指向显存空间
mov bx,0 ;后面使用es:[bx]访问显存空间
mov cx,2000 ;一共2000个字符
sub1s:mov byte ptr es:[bx],' ' ;将' '写入显存空间
add bx,2 ;bx+2指向下一个显存空间
loop sub1s ;转移到sub1s
pop es ;寄存器内容出栈恢复
pop cx
pop bx
ret ;子程序返回
;设置前景色
sub2:push bx ;寄存器内容入栈保存
push cx
push es
mov bx,0b800h
mov es,bx ;es指向显存空间
mov bx,1 ;将1送入bx(指向第一个字符的颜色属性)
mov cx,2000 ;一共2000个字符
sub2s:and byte ptr es:[bx],11111000b ;清除显存空间字符属性的低3位(前景色)
or es:[bx],al ;将al中的颜色属性写入显存空间字符属性
add bx,2 ;bx+2指向下一个字符属性
loop sub2s ;转移到sub2s
pop es ;寄存器内容出栈恢复
pop cx
pop bx
ret ;子程序返回
;设置背景色
sub3:push bx ;寄存器内容入栈保存
push cx
push es
mov cl,4 ;将4送入cl
shl al,cl ;将al中数据左移4位
mov bx,0b800h
mov es,bx ;es指向显存空间
mov bx,1 ;将1送入bx(指向第一个字符的颜色属性)
mov cx,2000 ;一共2000个字符
sub3s:and byte ptr es:[bx],10001111b ;清除显存空间字符属性的6、5、4位(背景色)
or es:[bx],al ;将al中的颜色属性写入显存空间字符属性
add bx,2 ;bx+2指向下一个字符属性
loop sub3s ;转移到sub3s
pop es ;寄存器内容出栈恢复
pop cx
pop bx
ret ;子程序返回
;向上滚动一行
sub4:push cx ;寄存器内容入栈保存
push si
push di
push es
push ds
mov si,0b800h
mov es,si ;es指向显存空间
mov ds,si ;ds指向显存空间
mov si,160 ;si指向下一行
mov di,0 ;di指向第一行
cld ;设置正方向传输
mov cx,24
sub4s:push cx ;cx内容入栈保存
mov cx,160 ;一行160字节
rep movsb ;传输一行
pop cx ;cx内容出栈恢复
loop sub4s
mov cx,80 ;将80送入cx
mov si,0 ;将0送入si
sub4s1:mov byte ptr [160*24+si],' ' ;将' '写入最后一行
add si,2 ;si+2指向下一个字符
loop sub4s1 ;转移到sub4s1
pop ds ;寄存器内容出栈恢复
pop es
pop di
pop si
pop cx
ret ;子程序返回
sret:iret ;中断返回
int7chend:nop
code ends
end start