鱼C论坛

 找回密码
 立即注册
查看: 2256|回复: 4

[已解决]call跳转问题

[复制链接]
发表于 2019-7-13 18:01:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
最佳答案
2019-7-14 11:05:45
本帖最后由 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 文件体积稍小。

      我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-13 19:45:26 | 显示全部楼层
本帖最后由 jackz007 于 2019-7-13 19:47 编辑

      调用函数为什么要加个 "二传手",直接调用不可以吗?
   
call  table[bx]

      把上面这句改成下面这样试试
call  cls
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-13 21:10:17 | 显示全部楼层
本帖最后由 老坚果 于 2019-7-13 21:12 编辑
jackz007 发表于 2019-7-13 19:45
调用函数为什么要加个 "二传手",直接调用不可以吗?
   


因为我这个是用直接定址表写中断,总共四个,就是汇编的实验16,我想先实现一个再做后面的,但是跳转总有错,报错以后 我试过您的方法,这样是没错的,但是毕竟是实验。。。。如果可以,还烦请看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-14 11:05:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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 文件体积稍小。

      我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-14 14:28:38 | 显示全部楼层
jackz007 发表于 2019-7-14 11:05
一切问题的根源都是由于 int 7c 的代码被平移并以 0000:200 为新的入口来运行,也就是说,程序实际 ...

嘿嘿,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表