多模块汇编程序
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
我在 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