問題タブ [immediate-operand]
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 - ARMv8 A64 アセンブリの即値の範囲
私の理解では、ARMv8 A64 アセンブリの即時パラメーターは 12 ビット長になる可能性があります。その場合、なぜこのアセンブリ コード行は次のようになりますか。
このエラーを生成します (gcc でコンパイルした場合)
興味深いことに、次のアセンブリ コード行は正常にコンパイルされます。
aarch64-linux-gnu-gcc (Linaro GCC 2014.11) 4.9.3 (プレリリース) を使用しています
assembly - 特定の数値がARMで32ビット即値として表現できることを知る方法は?
数値 x が与えられた場合、それが 32 ビットの即値として表現できることをどのように判断できますか。何らかの式は存在しますか?はいの場合、その式は網羅的ですか、つまり、考えられるすべてのケースをカバーしていますか? ARM は、命令セットの右端の 12 ビットを 4 ビットのローテート ビットと 8 ビットの値ビットに分解します。
assembly - addi の代わりに addiu を使用するのはなぜですか?
MIPS アセンブリでは、addiu
overを使用する利点は何addi
ですか? 署名されていませんaddiu
(そして、計算が台無しになりますか?)
assembly - MIPS アセンブリの「addi」命令で、16 進数の即値はどのように解釈されますか?
addi
16 進数の即値が使用されている場合、アセンブリで命令 (およびその他) を解釈する方法に関する標準または推奨事項はありますか?
例:
これは、プロセッサによって行われるように、符号が に拡張されるのと同じ意味になると予想していましaddi $t0, $zero, -1
たが、火星シミュレータのアセンブラが 16 進数を 32 ビットの符号なし数値として解釈し、疑似数値として実行しようとするという事実に驚きました。命令 (疑似命令が有効な場合)。0xffff
0xffffffff
addi $t0, $zero, 0x0000ffff
明確にするために、MARS のアセンブラーはそのaddi $t0, $zero, 0xffff
疑似命令を複数のマシン命令にアセンブルし、疑似命令が有効になっている場合は、その定数 (65535 = 0xffff) をレジスタに作成し、それを追加します。MARS のシミュレーターは( ) のような命令を正しくシミュレートします。0x2008ffff
addi $t0, $zero, -1
SPIM アセンブラは、エラーで中断します。
私が知りたいのは、アセンブラーが常にこのように解釈するかどうか、および何も見つからないので、これが記述または説明されている場所があるかどうかです。
assembly - アーム アセンブリのレジスタに 32 ビット値をロードする
アーム アセンブリを使用して、1 つの 32 ビット 16 進数をレジスタに直接ロードしたいと考えています。
この命令からロードできるのは 8 ビット値のみであるため、これは使用できません。そのため、メモリから直接 32 ビット値をロードしました。では、32 ビット値をメモリに格納し、アーム アセンブリを使用してレジスタに直接ロードするにはどうすればよいでしょうか?
このコードを試しました。
しかし、次のエラーが発生します。
assembly - 負の即値定数を持つ MIPS の andi 命令と addi 命令
$t2= と仮定0x55555550
して、次の命令を実行します。
$t2 は0x0005550
これは MIPS エミュレーター1で確認されています。
しかし、それは私が期待したものではありません。答えは 0x55555550 & 0xFFFFFFFF = 0x55555550 であるべきだと思います。and ロジックの前に、定数 -1 が 0xFFFFFFFF に符号拡張されたと思います。しかし、答えは 0x55555550 & 0x0000FFFF だったようです
-1 が 0xFFFFFFFF ではなく 0x0000FFFF に符号拡張される理由
脚注 1: 編集者注: 「拡張疑似命令」が有効になっている MARS は、これを複数の命令に展開し0xffffffff
て tmp レジスタに生成するため、変更され$t2
ません。そうしないと、MARS と SPIM の両方が、エンコードできないとしてエラーで拒否します。他のアセンブラは異なる場合があります。
assembly - x86-64 での movq と movabsq の違い
私はここの初心者で、アセンブリ言語の勉強を始めたばかりです。間違っている場合は訂正してください。または、この投稿が意味をなさない場合は削除します。
x86-64 Intel アーキテクチャのデータ移動命令について話しています。通常のmovq
命令は、32 ビットの 2 の補数として表すことができる即値ソース オペランドのみを持つことができますが、movabsq
命令は任意の 64 ビット即値をソース オペランドとして持つことができ、宛先としてレジスタのみを持つことができることを読みました。 .
これについて詳しく教えてください。movabsq
命令だけで64ビットの即値を移動できるということですか?そして、即値からレジスターまでのみですか?64 ビットの即値をメモリに移動する方法がわかりません。それとも、ここで何か重要なことを間違えたのかもしれません。
assembly - 次の機械語コード (0x2237FFF1) を MIPS アセンブリに変換します。
私はこれまでこのコードを翻訳しましたが、理解していないのは、16 ビットの即値アドレスの量を把握 (計算) する方法です。
バイナリへ
今、私はオペコード (001000) を読んでいて、それが I タイプで
addi
命令であることを知っています。
今、バイナリを I タイプの命令にグループ化しています
MIPSリファレンスシートを見て、命令が
私はここでスタックしていますが、一般的に16ビットの即値アドレスを決定する方法がわかりません。