多模块汇编程序

时间:2017-04-29 11:46:35

标签: assembly dos tasm multi-module

我在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

2 个答案:

答案 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