命令は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 bpputs用に2バイトが最初のパラメータをに置きます[bp + 6]。procわかりやすくするために、デフォルトはproc near-あなたはそれを言いたいかもしれません。必要な場合は、proc farおそらく32ビットコード(または64ビット)に移行する時期です。16ビットコードはそのようなPITAです-私たちはそれを忘れて本当にうれしいです!:)