簡體   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