問題タブ [instruction-encoding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - x86命令の長さを知る方法は?
アセンブリのさまざまな命令を見ていましたが、さまざまなオペランドとオペコードの長さがどのように決定されるかについて混乱しています。
それはあなたが経験から知っておくべきことですか、それともどのオペランド/演算子の組み合わせが何バイトを占めるかを知る方法がありますか?
例:
したがって、問題は次のとおりです。
与えられた命令を見て、そのオペコードが必要とするバイト数をどのように推測できますか?
x86 - x86は、16進マシンコードのみが与えられた場合の命令のオペランドサイズを調べますか?
たとえば、16進数の場合: 83 E4 F0
インテルの開発者向けマニュアルを見ると、それが83
意味することand
とFO
意味することがわかり-16
ます。を見るとE4
、送信元/宛先レジスタがSPまたはESPのいずれかであることがデコードできます。
and $-16, %ESP
したがって、16進数はまたはのいずれかを意味すると結論付けることができますand $-16, %SP
。ただし、マニュアルでは、両方ともとしてリストされてい83 /4 ib
ます。
これら2つをどのように区別できますか?
assembly - リアルモードのオフセットとアドレス指定に基づいて x86 マシンのオペコード値を決定する方法は?
生のマシン コード バイトを 0 と 1 としてテキスト ファイルに書き込み、BIOS を介してそれを実行しようとしています。
ただし、アドレッシング、乗算、オフセット、アドレッシング、オペランド、および命令が組み合わせの配置でどのように機能するか、つまり と の違いを理解するのに問題がMOV AL, 07
ありMOV BL, AL
ます。
つまり、アセンブリでは意味がありますが、マシン コードではパラメーターの概念を理解するのが非常に難しくなります。
だから私が知りたいのはこれです:どうすればこれをよりよく理解できますか?私が見つけたチュートリアルでは、組み合わせ相関の命令からの 0 と 1 を正確に説明/記述しているチュートリアルはありません。
このサイトhttp://ref.x86asm.net/coder32.html#x00で試してみましたが、これがわかりません。
例: 5 を AL に移動したいとします... AL/MOV 命令でチェーンされたバイナリ プレフィックスのオペコードの一部としてバイナリでリテラル '5' を指定しますか、それともそれぞれに 1 つの固定バイナリ コードを使用しますか?命令、値に関係なく?それが私が知りたいことです...機械語がどのように書かれているかを理解する方法。
assembly - ASM スペースの最適化: EAX と EBX の比較
x86 アセンブリ コードのゴルフ パズルに取り組んでいます。NASM を使用してソース ファイルを組み立てています。
を使用して-O0
、すべての最適化をオフにする必要があります。目標は、ELF バイナリのサイズを縮小することです。
パズルの「リファレンス実装」に取り組んでいるときに、奇妙な動作に出くわしました。これは縮小されたコード サンプルです。
バイナリは 264 バイトです。
eax
ここで、read_stdin
セクション内のすべての出現箇所を単にebx
,ecx
またはに置き換えるとedx
、バイナリが大きくなります:
オブジェクト ファイルのサイズを比較すると、その差はさらに大きくなります (480 バイトと 496 バイト)。eax
これが起こるレジスターの何が特別なのですか?NASM は指定されていますが、何らかの最適化を行っ-O0
ていますか?
assembly - x86 MOV命令に困惑
Intel64 & IA-32 マニュアル vol 2a から、命令には多くの可能な使用方法がありますmov
。そのような:
テストするコードを書きました(ガス、インテル構文):
アセンブリ、リンク、および objdump の後、関連するアセンブリを取得しました。
明らかに、私が書いた 2 番目の指示は、マニュアルとして期待される指示ではありません。マニュアルのフォーマットの指示は何ですか?
assembly - pc 相対 LDR などのロード用の ARM 命令から 16 進数へ
たとえば、PCレジスタを含むarm命令を16進数に変換しようとしています
「ARM アーキテクチャ リファレンス マニュアル」を確認したところ、LDR 命令の説明は次のとおりです。
質問が表示されました。1. cond 値、命令フォーマットを参照してください。LDR 命令の対応する cond 値は 0101(PLUS) ですか? 2、Rd は PC レジスタで、PC の記述方法は [15:12] の 4 ビットを使用します。
assembly - x86-64 の jmpq が 32 ビット長のアドレスしか必要としないのはなぜですか?
objdump -D
バイナリを逆アセンブルするために使用するように、 の典型的なコードjmpq
は のようなものe9 7f fe ff ff
で、負のオフセットを表すために使用されます。ただし、x86-64 のアドレスは (私の知る限り) 64(48) ビットなので、この 32 ビット アドレスはどのよう7f fe ff ff
にして 64 ビット絶対アドレスの負のオフセットを表すのでしょうか?
jmp
さらに、やのような他の命令はありますjmpq
が、64 ビットのアドレス置換がありますか? Intel または AMD のマニュアルで手順を見つけるにはどうすればよいですか (検索してjmpq
も何も見つかりませんでした)。
調べてみると、RIP相対アドレッシングと呼ばれているようです。そして、すべての命令がこれを行うわけではないようです。64 ビット相対アドレッシングはありますか? 間接ジャンプなら64ビットの絶対アドレスはレジスタかメモリにあるでしょ?