;提供ah选择功能,0-3,提供al以设置前景色背景色
;7ch号中断例程安装程序
assume cs:code
code segment
subject: jmp short set ; 1:table dw sub1……中SUB1存放的应该是子程序的偏移地址,这个偏移地址是相对于中断程序入口的,
;而此时Sub1中存放的是相对于安装程序入口的地址。所以应该将被安装代码放到code段标号Start前边。
select dw sub1+200h,sub2+200h,sub3+200h,sub4+200h
;select: dw offset sub1,offset sub2,offset sub3,offset sub4
set:push bx
cmp ah,3
ja subend
mov bh,0h
mov bl,ah
add bl,bl
adc bh,0
call word ptr select[bx]
;call word ptr [offset select + bx]
subend:pop bx
iret
sub1:push cx ;清屏
push si
push ds
mov si,0b800h
mov ds,si
mov si,1
mov cx,2000
sub1_1: mov byte ptr ds:[si],' '
add si,2
loop sub1_1
pop ds
pop si
pop cx
ret
sub2:push cx;设置前景色,需要提供0,1,2位的颜色数据,保存在al中
push si
push ds
mov si,0b800h
mov ds,si
mov si,1
mov cx,2000
sub2_1:and byte ptr ds:[si],11111000B
or byte ptr ds:[si],al
add si,2
loop sub2_1
pop ds
pop si
pop cx
ret
sub3:push cx;设置背景色,需要提供4,5,6位颜色数据,保存在al中
push si
push ds
mov si,0b800h
mov ds,si
mov si,1
mov cx,2000
sub3_1:and byte ptr ds:[si],10001111B
or byte ptr ds:[si],al
add si,2
loop sub3_1
pop ds
pop si
pop cx
ret
sub4:push cx ;向上滚动一行
push si
push di
push ds
push es
mov si,0b800h
mov ds,si
mov es,si
mov si,160
mov di,0
mov cx,24
sub4_1:push cx
mov cx,160
rep movsb
pop cx
loop sub4_1
mov cx,80
mov si,0
sub4_2:mov byte ptr [160*24+si],' '
add si,2
loop sub4_2
pop es
pop ds
pop di
pop si
pop cx
ret
subjectend:nop
start: mov ax,cs
mov ds,ax
mov si,offset subject
mov ax,0
mov es,ax
mov di,200h
mov cx,offset subjectend - offset subject
cld
rep movsb
cli
mov ax,0
mov es,ax
mov word ptr es:[7ch*4+2],0
mov word ptr es:[7ch*4],200h
mov ax,4c00h
int 21h
code ends
end start
测试程序
;测试16i的程序
assume cs:code
code segment
start: mov ah,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
这个中断例程在用上面的程序测试的时候出现了问题,在中断例程call word ptr select[bx] 这句时出现了问题,不能正确的使用目标内存的地址,而使用了其他内存中的数据
这是内存中的数据,与执行那条指令的情况
请问是我的这条指令写的有问题嘛?
------解决思路----------------------
call word ptr select[bx] 应该是 call word ptr cs:select[bx][200h] 吧