、ラベルの付いた例は次のようになります。x64 asmのRIPに相対的なジャンプで1命令だけをスキップするにはどうすればよいですか?私はラベルを使用せずに、正確に1命令をスキップしようとしている
cmp r12, r13
je dest ; skip the jmp
jmp whatever
dest:
nop
しかし、私の制限は、私がラベルを使用することができないということですので、私は、私はジャンプを作成する必要がありますと仮定RIPレジスタを基準にして例えば(擬似):
cmp r12, r13
je rip+0x05 ; this would obviously depend on the length of the next instruction
jmp whatever
nop
しかし、私が働いて何かを作るための知識が不足している、また、私の知る限りでは、それは読んですることはできません/ハックすることなく、RIPレジスタを記述します。
編集:私はIntelの構文に精通しており、私はアセンブラとしてKeystoneを使用しています。私はバイトをアセンブリから取り出し、実行可能なメモリの場所にロードします。アセンブリからバイトを取得するために私自身のウェブサイトを使用していますが、itを見ればそのアイデアを得るかもしれません。
EDIT 2:しかし、私は両方のキーストーンでは動作しないことを確認することができます
je .+0x05
; or
je $+0x05
:私が使用することをお勧めジェスターズとマーガレット・ブルームのコメントを、試してみました!幸いにも、私はキーストーンは、このコードを処理することが可能であることに気づい:
je +0x05
は、これが機能することを確認することができ、誰ですか?
EDIT 3:私はNASMで試してみましたが、$プレフィックスはテストされたコードで正常に動作します。私はそれをテストするために使用した:
section .text
global [email protected]
[email protected]:
jmp $+2+2 ; skip this jmp and the next jmp (each 2 bytes)
jmp $
ret 16
期待どおりに動作します。また、defuseはキーストーンと同じ出力を生成します。唯一の違いは、デフューザーは$接頭語を使用し、キーストーンはまったく必要ないということです! キーストーンと同等である:
jmp +4
jmp .
ret 16
'je。+ 5'またはアセンブラ(指定しなかったもの)が現在のアドレスをサポートしています。また、ラベルには何が問題なのですか? – Jester
次の命令の長さを知っているなら、これはJesterの言う通りに行うことができます。しかし、あなたが次の指導の長さを知らないなら、チャンスはありません! –
@ Jester、アセンブラはアセンブルしません。 – ioncodes