|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 文件体积稍小。
我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
|
-
|