繁体   English   中英

多模块汇编程序

[英]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

我究竟做错了什么? 从DOS进行PS编译:

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

这段代码:

pop ax
add ax, 5
push ax
ret

是完全荒谬的,并导致崩溃。 您正在从堆栈中弹出返回地址,向其添加5,然后将其放回堆栈中,然后返回。 因此,该函数返回到原始预期的返回地址加5,这是调用应返回的位置之后五个字节的任意位置。

显然,这是在某些指令的中间,因此反汇编程序会感到困惑,并且向您显示您将要执行add [bx:si], al这是一个毫无意义,不存在的指令。

因此,无论您认为要使用mytmp:函数中的这3条指令来实现什么,它都是错误的,并且您不应该这样做。

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

更改

extrn mytmp

extrn mytmp:PROC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM