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:47 编辑
调用函数为什么要加个 "二传手",直接调用不可以吗?
calltable
把上面这句改成下面这样试试
callcls 本帖最后由 老坚果 于 2019-7-13 21:12 编辑
jackz007 发表于 2019-7-13 19:45
调用函数为什么要加个 "二传手",直接调用不可以吗?
因为我这个是用直接定址表写中断,总共四个,就是汇编的实验16,我想先实现一个再做后面的,但是跳转总有错,报错以后 我试过您的方法,这样是没错的,但是毕竟是实验。。。。如果可以,还烦请看看 本帖最后由 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 文件体积稍小。
我不得不说,楼主类似这样的奇葩想法还是少一些为好,本来可以简单,却非要这么折腾,幸亏只有一个函数需要处理! jackz007 发表于 2019-7-14 11:05
一切问题的根源都是由于 int 7c 的代码被平移并以 0000:200 为新的入口来运行,也就是说,程序实际 ...
嘿嘿,谢谢谢谢
页:
[1]