命令はcall
リターンアドレスをスタックに置くのでpop ax
、プロシージャに入ると、プッシュした7ではなく、リターンアドレスを取得します。も機能しません(ret
そこに差出人住所が見つかることを期待しています!)次のようなものを試してください...
FOOBAR proc
push bp ; save caller's reg
mov bp, sp
mov ax, [bp + 4]
; do something with it
; leave - equivalent to:
mov sp, bp
pop bp
ret
ここに「落とし穴」の可能性があります。「far」プロシージャには、スタック上にセグメント(cs)とオフセットの両方があるため、リターンアドレス用に4バイト、push bp
puts用に2バイトが最初のパラメータをに置きます[bp + 6]
。proc
わかりやすくするために、デフォルトはproc near
-あなたはそれを言いたいかもしれません。必要な場合は、proc far
おそらく32ビットコード(または64ビット)に移行する時期です。16ビットコードはそのようなPITAです-私たちはそれを忘れて本当にうれしいです!:)