2016-03-30 4 views
1

トラップフラグ= 1を設定したいが、ポップアルゴリズムを使用しない。私はそれが可能であることを知っていますが、私はそれを理解することができません。ポップ命令を使用せずにトラップフラグを設定する方法

+0

なぜPOPFを避けたいですか?これはちょうどパズルか、いくつかの特定の制約がありますか?つまり、IRETを乱用してスタックからフラグをロードすることもできますが、これは不正行為のようです。 –

+0

それはパズルです、私は答えを得ました、それはLAHFとSAHFの指示を使用しています。 – Clarskon

+0

私は 'SAHF'について考えましたが、うまくいきません。 FLAGの下位バイト、すなわちビット0-7にAHをロードする。トラップフラグはビット8で、 'SAHF'によっては触られません。 –

答えて

1

FLAGSは、割り込みが発生したときにスタックにプッシュされ、IRETによってスタックからポップされます。

42hは、いくつかはそうされていない割り込みベクタである
handler: 
    push bp 
    mov bp, sp 
    or word ptr [bp+6], 100h 
    pop bp 
    iret 
set_trap_flag: 
    push 0 
    pop es 
    mov [es:42h*4], offset handler 
    mov [es:42h*4+2], segment handler 
    int 42h 

:あなたはまだPUSHF許可されているのであれば、あなたはPUSHFが許可されていない場合は、割り込みハンドラをインストールすることができ

pushf 
    pop ax 
    or ax, 100h 
    push ax 
    call far do_iret 
    ... 

do_iret: 
    iret 

ような何かを行うことができます中古。

(注:コードはテストされていないため、構文エラーやバグがある可能性があります)

+0

あなたの答えには複数の問題があります! __(1)__ TFを設定するために間違ったマスクを使用しています。 __(2)__ IVTでは、セグメントの前にオフセットがあります。 – Fifoernik

+0

@Fifoernik:ありがとう、修正済み。とにかく、私は本当に答えが何よりも疑似コードであることを意味しましたが、とにかく感謝しています。 –

関連する問題