|
主题 : : 实验16 调用子程序时出错(子程序及装载程序应该没问题) [待解决] |
回复[ 2次 ]
点击[ 567次 ] | |
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17 |
assume cs:code
code segment
start: ;装载中断例程
mov ax,cs
mov ds,ax
mov si,offset do7ch
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7chend- offset do7ch
cld
rep movsb
;设置中断向量表
mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti
mov ax,4c00h
int 21h
;do7ch-------------------------------------------------------------------------
do7ch: ;名称:7ch号中断程序
;参数:ah 传递功能号,al传递颜色值,(AL)={0~7}
;功能:(0):清屏;
; (1):设置前景色
; (2):设置背景色
; (3):向上滚动一行
;返回值:无
a:
push ds
push bx
push dx
push si
jmp short dstart
b: ;表单 存储各个子程序相对于标号DO7CH的偏移地址
dw offset cls - offset do7ch,offset pcolor - offset do7ch
dw offset bcolor - offset do7ch,offset roll - offset do7ch
dstart:
cmp ah,3 ;大于3的输入无效
ja do7chover1
mov dx,0
mov ds,dx
mov dx,[7ch*4] ;取中断入口偏移地址
mov bx,[7ch*4+2]
mov ds,bx ;中断入口段地址
mov si,offset b- offset a
add dx,si ;入口到表单的位移
mov bl,ah ;具体的功能号在表单中对应的位置
mov bh,0
add bx,bx
mov bx,0
add bx,dx ;(bx)=所选子程序相对DO7CH偏移地址存放位置
mov dx,[7ch*4] ;修改相对偏移地址为绝对偏移地址
add dx,[bx] ;dx中存放的是中断向量表中存储的(IP)+表单中存放的偏移地址
;便是子程序的绝对的偏移地址了
call word ptr dx
do7chover1: jmp do7chover
cls: ;清屏函数
push ax
push es
push bx
push cx
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
cls_s: mov byte ptr es:[bx],' '
add bx,2
loop cls_s
pop cx
pop bx
pop es
pop ax
ret
pcolor: ;显示前景色
push ax
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
pcolor_s: and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop pcolor_s
pop cx
pop es
pop bx
pop ax
ret
bcolor: ;显示背景色
push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
shl al,1
shl al,1
shl al,1
shl al,1
mov cx,2000
bcolor_s: and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop bcolor_s
pop es
pop cx
pop bx
pop ax
ret
roll: ;向上滚动一行
push ax
push cx
push es
push si
push ds
push di
mov ax,0b800h
mov es,ax
mov di,0
mov ds,ax
mov si,160
mov cx,24
roll_s: push cx
mov cx,160
cld
rep movsb
pop cx
loop roll_s
mov cx,80
roll_s2:
mov byte ptr es:[si+2],' '
add si,2
loop roll_s2
pop si
pop ds
pop di
pop es
pop cx
pop ax
ret
do7chover:
pop si
pop dx
pop bx
pop ds
iret
do7chend: nop
;----------------------------------------------------------------------------------------
code ends
end start | | |