|
主题 : : 实验16中复制安装中断例程后,无法正确定位调用子程序的原因。请看中间的一段注释 [已解决] |
回复[ 2次 ]
点击[ 280次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-10-29 21:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38 |
;*mov word ptr es:[7ch*4],0;;;;;;;;;;;;;;;;;;;;
;*mov word ptr es:[7ch*4+2],20h
assume cs:code,ds:data
data segment
str1 db 'loveChina','$'
str2 db '2love','$'
data ends
code segment
set_screen: jmp set
table dw sub1+200h,sub2+200h,sub3+200h,sub4+200h;
;table dw sub1,sub2,sub3,sub4;
set: push bx
cmp ah,3
ja set_end
mov bl,ah
mov bh,0
add bx,bx
;*编译器是将编译后的指令复制安装到0:200处,故一些偏移地址是照搬不动地复制过去
;*假设table dw sub1+200h这里没有加200h,编译安装后table处的值是该代码段中sub1的偏移地址
;*并非复制安装后的sub1的偏移地址,因为该代码段的set_screen的偏移地址为0,而复制安装后的set_screen的
;*偏移地址为200h故table处定值表中每个子程序入口地址都应加200h
;*故安装后的table处的值应该为sub1+200h,sub2+200h,sub3+200h,sub4+200h;
;*同理,call word ptr table[bx+200h]如果仅是table[bx]的话,那么执行call指令则会使IP=cs:[bx]
;*复制安装后的中断例程起始地址为200h,即table定址表中的子程序入口地址比原来多了200h,故call时应加多200h
call word ptr table[bx+200h]
set_end:
pop bx
iret
sub1: push ax
push es
push si
push cx
mov ax,0b800h
mov es,ax
mov si,0
mov cx,2000
sub1s: mov es:[si],' '
add si,2
loop sub1s
pop cx
pop si
pop es
pop ax
ret
sub2: push ax
push bx
push es
push si
mov bx,0b800h
mov es,bx
mov cx,2000
mov si,1
sub2s: and byte ptr es:[si],11111000b
or es:[si],al
add si,2
loop sub2s
pop si
pop es
pop bx
pop ax
ret
sub3: push bx
push ax
push es
push si
push cx
mov bx,0b800h
mov es,bx
mov si,1
mov cl,4
shl al,cl
mov cx,2000
sub3s: and byte ptr es:[si],10001111b
or es:[si],al
add si,2
loop sub3s
pop cx
pop si
pop es
pop ax
pop bx
ret
sub4: push cx
push es
push si
push ds
push ax
mov ax,0b800h
mov ds,ax
mov si,160
mov es,ax
mov di,0
mov cx,24*160
cld
rep movsb
mov cx,80
clr24: mov es:[di],' '
add di,2
loop clr24
pop ax
pop ds
pop si
pop es
pop cx
ret
set_nop:nop
start:
mov ax,cs
mov ds,ax
mov si,offset set_screen
mov ax,0
mov es,ax
mov di,200h
mov cx,offset set_nop - offset set_screen
cld
rep movsb
cli
;mov word ptr es:[7ch*4],0;;;;;;;;;;;;;;;;;;;;
;mov word ptr es:[7ch*4+2],20h;;;;;;;;;;
mov word ptr es:[7ch*4],200h;;;;;;;;;;;;;;;;;;;;
mov word ptr es:[7ch*4+2],0;;;;;;;;;;
sti
mov ax,set_screen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,data
mov ds,ax
lea dx, str1 ;;;;;
mov ah,9
int 21h;显示第一个字符串
mov ah,02
mov bh,0
mov dh,1
mov dl,0
int 10h;光标移至第二行
mov ax,data
mov ds,ax
lea dx,str2 ;;;;;
mov ah,9
int 21h
mov ah,2
mov al,100b
int 7ch
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-10-30 22:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38 |
......... ;*编译器是将编译后的指令复制安装到0:200处,故一些偏移地址是照搬不动地复制过去
;*假设table dw sub1+200h这里没有加200h,编译安装后table处的值是该代码段中sub1的偏移地址
;*并非复制安装后的sub1的偏移地址,因为该代码段的set_screen的偏移地址为0,而复制安装后的set_screen的
;*偏移地址为200h故table处定值表中每个子程序入口地址都应加200h
;*故安装后的table处的值应该为sub1+200h,sub2+200h,sub3+200h,sub4+200h;
;*同理,call word ptr table[bx+200h]如果仅是table[bx]的话,那么执行call指令则会使IP=cs:[bx]
;*复制安装后的中断例程起始地址为200h,即table定址表中的子程序入口地址比原来多了200h,故call时应加多200h
call word ptr table[bx+200h] | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-10-30 22:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38 |
此贴由 贴主 于 [ 2010-10-30 22:13 ] 结贴。 结贴原因:问题已解决 | | |
|