我在DOS中创建简单的多模块程序时遇到了麻烦。
我想要的是创建用5增加ax的程序并从主程序调用它。但每次我开始调试时,我都会遇到无限的一个指令周期的奇怪问题:
add [bx:si], al
这是我的第一个档案:
;(tmp1.bat)
.model small
.386
extrn mytmp
.code
org 100h
start:
mov ax, 5
push ax
call mytmp
pop ax
mov dl, al
mov ah, 06h
int 21h
ret
end start
end
第二个文件:
;(tmp2.bat)
.model small
.386
public mytmp
.code
mytmp:
pop ax
add ax, 5
push ax
ret
END
我做错了什么? 附:从DOS编译:
tasm tmp1.bat
tasm tmp2.bat
tlink /t tmp1.obj tmp2.obj
答案 0 :(得分:2)
此代码:
pop ax
add ax, 5
push ax
ret
完全没有意义并导致崩溃。您正在从堆栈中弹出返回地址,向其中添加5,将其放回堆栈中,然后返回。因此,该函数返回到原始的预期返回地址加上五,这是在应该返回调用的位置之后五个字节的任意位置。
显然,这是在一些指令的中间,所以反汇编程序会混淆,并且它向您显示您将要执行add [bx:si], al
这是一个荒谬的,不存在的指令。
所以,无论你认为你试图用你的mytmp:
函数中的那3条指令来实现它,这是错误的,你不应该这样做。
答案 1 :(得分:2)
根据call mytmp
中的值,TASM将mytmp
组合为间接呼叫。它不知道mytmp
是一个程序。
更改
extrn mytmp
到
extrn mytmp:PROC