鱼C论坛

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

[已解决]call跳转问题

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

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

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

x
本帖最后由 老坚果 于 2019-7-13 19:03 编辑
  1. assume cs:code
  2. code segment
  3. start:
  4.                                 push cs
  5.                                 pop ds
  6.                                
  7.                                 mov ax,0
  8.                                 mov es,ax
  9.                                
  10.                                 mov si,int7c
  11.                                 mov di,200h
  12.                                 mov cx,offset int7cend - offset int7c
  13.                                 cld
  14.                                 rep movsb
  15.                                
  16.                                 mov ES:[7ch*4],word ptr 200h
  17.                                 mov ES:[7ch*4+2],word ptr 0h
  18.                                
  19.                                 mov ax,4c00h
  20.                                 int 21h
  21.                                
  22. int7c:
  23.                                
  24.                                
  25.                                 jmp short s
  26.                                
  27. table                dw        cls

  28. s:
  29.                                 push ax
  30.                                 push bx
  31.                                 push cx
  32.                                 push es
  33.                                
  34.                                 mov bl,al
  35.                                 mov bh,0
  36.                                 call  table[bx]                                //这里跳转会到一个不知道为什么的地方,我这是哪里有错了跪求大佬指教
  37.                                
  38.                                 pop es
  39.                                 pop cx
  40.                                 pop bx
  41.                                 pop ax
  42.                                 iret
  43.                                
  44. cls:                               
  45.                                 mov ax,0b800h
  46.                                 mov es,ax
  47.                                 mov bx,0
  48.                                 mov cx,2000
  49. s1:                                mov es:[bx],byte ptr 20h
  50.                                 inc bx
  51.                                 mov es:[bx],byte ptr 0
  52.                                 inc bx
  53.                                 loop s1
  54.                                 ret
  55.                                
  56.                                
  57.                                
  58.                                
  59.                                
  60.                                
  61.                                
  62. int7cend:                nop                               
  63.                                
  64. code ends
  65. end start                               
复制代码



以及下面是我的测试代码
  1. assume cs:code
  2. code segment
  3. start:
  4.                                 mov al,0
  5.                                 int 7ch
  6.                                
  7.                                 mov ax,4c00h
  8.                                 int 21h
  9. code ends
  10. end start
复制代码
最佳答案
2019-7-14 11:05:45
本帖最后由 jackz007 于 2019-7-14 11:19 编辑

      一切问题的根源都是由于 int 7c 的代码被平移并以 0000:200 为新的入口来运行,也就是说,程序实际运行时的代码偏移值已经与编译时完全不同了。而在 int 7c 中断服务程序中,楼主又安排了两处需要用到绝对地址,所以导致错位。

      给楼主建议两种方案

      方案一:
  1.                                 mov ax,4c00h
  2.                                 int 21h
  3.                                 org 200h             ; 添加此句,强制规定 int7c 代码起始的偏移为运行时偏移                                
  4. int7c:
  5.                                 jmp short s
复制代码


      此方案的缺点是会导致 exe 文件体积会稍大;

      方案二:
      把下面两条指令
  1. table                           dw        cls

  2.                                 call table[bx]
复制代码

      修改成这样
  1. table                           dw        cls + 200h - offset int7c                      ; 修改此句

  2.                                 call cs:word ptr[table + 200h - offset int7c]            ; 修改此句
复制代码


      此方案的唯一优点是 exe 文件体积稍小。

      我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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


      把上面这句改成下面这样试试

  1. call  cls
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

发表于 2019-7-14 11:05:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-7-14 11:19 编辑

      一切问题的根源都是由于 int 7c 的代码被平移并以 0000:200 为新的入口来运行,也就是说,程序实际运行时的代码偏移值已经与编译时完全不同了。而在 int 7c 中断服务程序中,楼主又安排了两处需要用到绝对地址,所以导致错位。

      给楼主建议两种方案

      方案一:
  1.                                 mov ax,4c00h
  2.                                 int 21h
  3.                                 org 200h             ; 添加此句,强制规定 int7c 代码起始的偏移为运行时偏移                                
  4. int7c:
  5.                                 jmp short s
复制代码


      此方案的缺点是会导致 exe 文件体积会稍大;

      方案二:
      把下面两条指令
  1. table                           dw        cls

  2.                                 call table[bx]
复制代码

      修改成这样
  1. table                           dw        cls + 200h - offset int7c                      ; 修改此句

  2.                                 call cs:word ptr[table + 200h - offset int7c]            ; 修改此句
复制代码


      此方案的唯一优点是 exe 文件体积稍小。

      我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嘿嘿,谢谢谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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