马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 老坚果 于 2019-7-13 19:03 编辑 assume cs:code
code segment
start:
push cs
pop ds
mov ax,0
mov es,ax
mov si,int7c
mov di,200h
mov cx,offset int7cend - offset int7c
cld
rep movsb
mov ES:[7ch*4],word ptr 200h
mov ES:[7ch*4+2],word ptr 0h
mov ax,4c00h
int 21h
int7c:
jmp short s
table dw cls
s:
push ax
push bx
push cx
push es
mov bl,al
mov bh,0
call table[bx] //这里跳转会到一个不知道为什么的地方,我这是哪里有错了跪求大佬指教
pop es
pop cx
pop bx
pop ax
iret
cls:
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s1: mov es:[bx],byte ptr 20h
inc bx
mov es:[bx],byte ptr 0
inc bx
loop s1
ret
int7cend: nop
code ends
end start
以及下面是我的测试代码assume cs:code
code segment
start:
mov al,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
本帖最后由 jackz007 于 2019-7-14 11:19 编辑
一切问题的根源都是由于 int 7c 的代码被平移并以 0000:200 为新的入口来运行,也就是说,程序实际运行时的代码偏移值已经与编译时完全不同了。而在 int 7c 中断服务程序中,楼主又安排了两处需要用到绝对地址,所以导致错位。
给楼主建议两种方案
方案一: mov ax,4c00h
int 21h
org 200h ; 添加此句,强制规定 int7c 代码起始的偏移为运行时偏移
int7c:
jmp short s
此方案的缺点是会导致 exe 文件体积会稍大;
方案二:
把下面两条指令 table dw cls
call table[bx]
修改成这样 table dw cls + 200h - offset int7c ; 修改此句
call cs:word ptr[table + 200h - offset int7c] ; 修改此句
此方案的唯一优点是 exe 文件体积稍小。
我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
|