0

最初にポップせずに、レジスタをスタックの一番上にあるアイテムと比較することは可能ですか?

EG この方法で実行できますが、最初に値をポップする必要があります。

push 1
pop ax
cmp ax,1
jz equal

スタックを変更せずにそれを行うことは可能ですか?

4

3 に答える 3

1

特に (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
于 2013-06-25T03:48:38.580 に答える
0

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

お役に立てれば。

于 2013-06-25T12:59:28.317 に答える
0

asm exe の開始時に、スタックの先頭を記録するメモリ ブロックを宣言します。

 STAK dw[0]

bx を使用して、スタックの一番上にある sp を格納します。

 mov bx,STAK
 mov [bx],sp

次に、比較が必要な場合は bx を使用して任意のレジスタと比較します。bx はポインティング レジスタです。

 mov bx,[STAK]
 cmp ax,[bx]

必要に応じて、bx の代わりに bp を使用できます

于 2013-06-25T09:29:06.060 に答える