多模块汇编程序

Multimodule assembler program

我在 DOS 中创建简单的多模块程序时遇到了问题。

我想要的是创建将 ax 递增 5 的过程,并从主过程中调用它。但是每次我开始调试时,我都会遇到无限单指令循环的奇怪问题:

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

我做错了什么? P.S。从 DOS 编译:

tasm tmp1.bat
tasm tmp2.bat
tlink /t tmp1.obj tmp2.obj

此代码:

pop ax
add ax, 5
push ax
ret

完全没有意义并导致崩溃。您正在从堆栈中弹出 return 地址,向其添加 5,将其放回堆栈中,然后 returning。因此,函数 returns 将原始预期的 return 地址加五,这是调用应该 return.

的位置之后的任意位置五个字节

显然,那是在一些指令的中间,所以反汇编器变得混乱,它告诉你你将要执行 add [bx:si], al 这是一个荒谬的、不存在的指令。

因此,无论您认为自己试图通过 mytmp: 函数中的那 3 条指令实现什么,都是错误的,您不应该这样做。

TASM 根据 mytmp 中的值将 call mytmp 汇编为间接调用。它不知道 mytmp 是一个过程。

改变

extrn mytmp

extrn mytmp:PROC