当前位置: 代码迷 >> 汇编语言 >> 依旧是中段例程的有关问题
  详细解决方案

依旧是中段例程的有关问题

热度:164   发布时间:2016-05-02 04:30:56.0
依旧是中段例程的问题
;提供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] 吧
  相关解决方案