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