最初にポップせずに、レジスタをスタックの一番上にあるアイテムと比較することは可能ですか?
EG この方法で実行できますが、最初に値をポップする必要があります。
push 1
pop ax
cmp ax,1
jz equal
スタックを変更せずにそれを行うことは可能ですか?
特に (x86 ファミリではなく) 8086 について話しているのであれば、いいえ、スタック ポインターを使用する非直接レジスタ モードがあったとは思いません。
基本的なオプションは次のとおりです。
[BX] [SI]
<displacement> or or
[BP] [DI]
もちろん、スタック ポインタを他に使用していない場合は、スタック ポインタを転送して、それを使用することもできます。BP
mov bp, sp
mov ax, [bp]
; now check ax
または、非常に短い時間スタックが変更されることを気にしない場合 (ただし、割り込みによって問題が発生する可能性がある場合は、pop
との間で発生する可能性があることに注意してくださいpush
):
pop ax
push ax
; now check ax
x86 ファミリ プロセッサ (80386 以降) を 32 ビット プロテクト モードで使用する場合、すべての汎用レジスタをベース インデックスとして使用できるため、PUSH または POP を使用せずにスタックのトップを AX と比較するのは非常に簡単です。
CMP AX, [ESP] ; compare top of stack with AX
CMP EAX, [ESP] ; compare top of stack with EAX
IA32 命令セット リファレンス マニュアルの「表 2-1. ModR/M バイトを使用した 16 ビット アドレッシング フォーム」から、次の組み合わせが使用できます。
[BX] + displacment
[BP] + displacement
[SI] + displacement
[DI] + displacement
[BX + SI] + displacement
[BX + DI] + displacement
[BP + SI] + displacement
[BP + DI] + displacement
残念ながら、スタック レジスタの使用は、16 ビット モード (8086 など) ではそれらの 1 つではありません。つまり、PUSH または POP を使用せずにスタックの最上部にアクセスするには、最初に SP レジスタの内容を BX、BP、SI、または DI のいずれかに移動してから、それらのレジスタのいずれかを使用してスタックの最上部の要素にアクセスする必要があります。 .
注意しなければならない落とし穴がいくつかあります。レジスタのデフォルト セグメント レジスタがスタック セグメント レジスタ SS と一致していることを確認するか、レジスタで特定のセグメント レジスタの使用を明示的に強制する必要があります。16 ビット コーディングを行ってからかなりの時間が経過しているため、現時点では、これらのルールの一部を回避できます。マニュアルには間違いなくそれらが含まれます。
BP レジスタは、デフォルトでスタック セグメント SS を使用します。また、ルーチン内でスタック フレームを作成したり、ローカル スタック変数だけでなくスタック上で渡されるパラメーターを取得するためのインデックス作成にも使用されます。
PUSH BP ; These two lines are often used to create the stack
MOV BP, SP ; at the start of a routine
SUB SP, # ; Carve space on the stack for local stack variables
典型的なスタック フレームは次のようになります。
[BP + 6] ; 16-bit parameter
[BP + 4] ; 16-bit parameter
[BP + 2] ; return address IP saved on stack
[BP + 0] ; saved BP on stack
[BP - 2] ; 16-bit local variable on the stack
[BP - 4] ; 16-bit local variable on the stack
お役に立てれば。
asm exe の開始時に、スタックの先頭を記録するメモリ ブロックを宣言します。
STAK dw[0]
bx を使用して、スタックの一番上にある sp を格納します。
mov bx,STAK
mov [bx],sp
次に、比較が必要な場合は bx を使用して任意のレジスタと比較します。bx はポインティング レジスタです。
mov bx,[STAK]
cmp ax,[bx]
必要に応じて、bx の代わりに bp を使用できます