老坚果 发表于 2019-7-13 18:01:23

call跳转问题

本帖最后由 老坚果 于 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:,word ptr 200h
                                mov ES:,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
                                calltable                                //这里跳转会到一个不知道为什么的地方,我这是哪里有错了跪求大佬指教
                               
                                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:,byte ptr 20h
                                inc bx
                                mov es:,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-13 19:45:26

本帖最后由 jackz007 于 2019-7-13 19:47 编辑

      调用函数为什么要加个 "二传手",直接调用不可以吗?
   
calltable

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

callcls

老坚果 发表于 2019-7-13 21:10:17

本帖最后由 老坚果 于 2019-7-13 21:12 编辑

jackz007 发表于 2019-7-13 19:45
调用函数为什么要加个 "二传手",直接调用不可以吗?
   



因为我这个是用直接定址表写中断,总共四个,就是汇编的实验16,我想先实现一个再做后面的,但是跳转总有错,报错以后 我试过您的方法,这样是没错的,但是毕竟是实验。。。。如果可以,还烦请看看

jackz007 发表于 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
      修改成这样
table                           dw      cls + 200h - offset int7c                      ; 修改此句

                              call cs:word ptr            ; 修改此句

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

      我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理!

老坚果 发表于 2019-7-14 14:28:38

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

嘿嘿,谢谢谢谢
页: [1]
查看完整版本: call跳转问题