3

Visual C の__asmで、レジスタに格納されている場所にジャンプしたいのですが、JAE などの条件付きジャンプではうまくいかないようです。通常、これは正常に機能します (ラベルを使用する場合)。

lea ecx, 0x0000001f[edx]
        ;jmp ecx        ;ok
        ;jae EXIT_LOOP  ;ok 
        jae ecx     ;   not ok  "improper operand type"

jaeVisual C __asm でレジスタ (またはスタック) 変数を使用する方法はありますか? この問題にアプローチする別の方法があるかもしれません (コンパイル時に既知のラベルではなく番号を使用して、条件付きでどこかにジャンプします)?

4

1 に答える 1

5

おそらく、x86 にはそのようなオペコードがないためです。ラベル以外への条件付きジャンプを使用することはできません。あなたはおそらくしたいでしょう:

...
jb  skip
jmp ecx
skip:...

【ラベルレス版追加編集】

これは見苦しく、ASM を使用する 1 つの目標 (つまり、パフォーマンス) を台無しにします。AE の場合にジャンプするアドレスを A、B の場合のアドレスを B とします。

...
sbb  eax,eax,0    // propagate carry flag into register; eax == 0 or -1
and  eax,B-A      // eax = 0 or B-A
add  eax,A        // eax = A or B
jmp  eax

行きたい場所の住所を把握する必要があります...

他のフラグを使用したい場合は、より複雑なトリック。フラグを処理可能な位置に配置するには、lahf または pushf 命令を使用する必要があります。

うーん。

于 2012-12-22T05:04:21.053 に答える