問題タブ [zero-extension]

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.

0 投票する
1 に答える
25221 参照

assembly - 署名付き/未署名のロードおよびストア命令 (MIPS) に関する明確化

Google の助けを借りて教科書を手にしても、これらの概念を理解できないようです。

フォーマット(opcode、rs、rt、offset)に従って...

  • アドレスの値に追加する前に、オフセットを符号拡張しますか? それとも拡張する前に追加しますか?
  • lblbuの場合、違いは何ですか? また、「符号なし」はオーバーフローを報告しないことを意味するという MIPS 算術定義にも従っていますか?
  • lwに署名されていないバージョンがないのはなぜですか? お店の説明書にも記載がない…
0 投票する
1 に答える
6147 参照

assembly - movzwl、%ax、および負の値による奇妙な結果

さて、私は次のコードスニペットを扱っています:

したがって、正の値を扱う場合、これは期待どおりに動作します。%edx にコピーされる値は、%eax (または %ax) の末尾の 16 ビットです。

ただし、負の数を入れると、すべてがおかしくなり始め、期待どおりに動作していないように見えます。

たとえば、%eax の値が -67043552 の場合、%edx にコピーされる値は 65312 です。

組み立て初心者ですので、私の勘違いでしたら申し訳ありません。どんな助けでも大歓迎です。

0 投票する
2 に答える
78588 参照

assembly - IA-32 AT&T 構文で MOVZBL 命令は何をしますか?

この指示は正確に何をしますか?

0 投票する
4 に答える
37207 参照

assembly - 32ビットレジスタのx86-64命令が、完全な64ビットレジスタの上部をゼロにするのはなぜですか?

インテルマニュアルのx86-64ツアーで、私は読んだ

おそらく最も驚くべき事実は、レジスタMOV EAX, EBXの上位32ビットを自動的にゼロにするなどの命令RAXです。

同じソースで引用されているIntelのドキュメント(手動の基本アーキテクチャの64ビットモードの3.4.1.1汎用レジスタ)には、次のように記載されています。

  • 64ビットのオペランドは、宛先の汎用レジスタに64ビットの結果を生成します。
  • 32ビットのオペランドは32ビットの結果を生成し、宛先の汎用レジスタで64ビットの結果にゼロ拡張されます。
  • 8ビットおよび16ビットのオペランドは、8ビットまたは16ビットの結果を生成します。宛先汎用レジスタの上位56ビットまたは48ビット(それぞれ)は、演算によって変更されません。8ビットまたは16ビット演算の結果が64ビットアドレスの計算を目的としている場合は、レジスタを完全な64ビットに明示的に符号拡張します。

x86-32およびx86-64アセンブリでは、次のような16ビット命令

eaxの上位ワードがゼロになるような「奇妙な」動作を示さないでください。

したがって、この動作が導入された理由は何ですか?一見、それは非論理的に見えます(しかし、その理由は、私がx86-32アセンブリの癖に慣れているためかもしれません)。

0 投票する
1 に答える
3019 参照

assembly - 「movrax、0x1」の代わりに「mov eax、0x1」を常に使用できますか?

このコードを次のようにアセンブルする場合nasm

私はこの出力を取得します:

mov eax, 0x1これは2回繰り返されるオペコードです。

これは、それをいつでも置き換えるmov rax, 0x1ことができるという意味ですか、それともこの場合だけですか?mov eax, 0x1

これが正しければ、以下よりも使用する方が良いでしょう。

アセンブルすると6バイトになりますmov eax, 0x1が、たった5バイトですか?

0 投票する
0 に答える
64 参照

x86 - 32ビットは64ビットレジスタの上位ビットをゼロにしますか?

重複の可能性:
ほとんどの x64 命令が 32 レジスタの上位部分をゼロにする理由

を実行してmovl something, %eax0x1234567812345678raxのようなものを含めた場合、上半分が自動的にゼロになりraxますか?

0 投票する
1 に答える
65177 参照

assembly - x86_64 レジスタ rax/eax/ax/al は完全なレジスタ内容を上書きします

広く宣伝されているように、最新の x86_64 プロセッサには、32 ビット レジスタ、16 ビット レジスタ、さらには 8 ビット レジスタとして下位互換性のある方法で使用できる 64 ビット レジスタがあります。次に例を示します。

このようなスキームは、文字どおりに解釈できます。つまり、指定された名前を使用して、読み取りまたは書き込みの目的で常にレジスタの一部のみにアクセスでき、非常に論理的です。実際、これは 32 ビットまでのすべてに当てはまります。

ただし、64 ビットのものになるとすぐに、かなり厄介なことがわかります。

そのような行動は、私には非常にばかげており、非論理的であるように思えます。何らかの方法で何かを書き込もうとすると、レジスタeaxの上位 32 ビットが消去されるようraxです。

だから、私は2つの質問があります:

  1. この厄介な動作はどこかに文書化する必要があると思いますが、詳細な説明 (64 ビットレジスタの上位 32 ビットがどのように消去されるか) がどこにも見つからないようです。eax常にワイプに書いているraxのは正しいですか、それとももっと複雑ですか?すべての 64 ビット レジスタに適用されますか、それともいくつかの例外がありますか?

    強く関連する質問で同じ動作について言及されていますが、残念ながら、ドキュメントへの正確な参照はありません。

    つまり、この動作を指定するドキュメントへのリンクが必要です。

  2. それは私だけですか、それともこの全体が本当に奇妙で非論理的であるように思われますか (つまり、eax-ax-ah-al、rax-ax-ah-al には 1 つの動作があり、rax-eax には別の動作があります)? なぜそのように実装されたのかについて、ここである種の重要な点が欠けているのではないでしょうか?

    「なぜ」についての説明をいただければ幸いです。

0 投票する
2 に答える
6586 参照

assembly - MIPS では、いつ符号付き拡張を使用し、いつゼロ拡張を使用するのですか?

私は個人的なプロジェクトとして MIPS プロセッサを設計していますが、今では非常に混乱した質問に遭遇しました。MIPSでsigned-extendをいつ使用し、いつzero-extendを使用するかを要約することはできません。

私は多くのリソースを検索しましたが、主に次のように述べています。

1) ADDI、ADDIU は両方とも符号付き拡張を使用します。
2) ANDI、ORI、XORI は両方ともゼロ拡張を使用します。

ただし、これらの 2 つの命令では、混乱し始めています。

SLTIU/SLTI

Imagination の「MIPS Architecture for Programmers Volume II-A: The MIPS instruction set Manual」ページ 368 には、次のように記載されています。 写真1

16ビットの即値は符号付き拡張であると明確に述べられていますが、次のステートメントがわかりません。

[0, 32767] または符号なし範囲の最大 [max_unsigned-32767, max_unsigned] の終わり。

また、次のように、16 ビットの即値はゼロ拡張であると言う人もいます。

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/pseudojump.html

さて、MIPS における符号付き命令と符号なし命令の正確な違いを説明できる人はいますか?

0 投票する
4 に答える
6982 参照

assembly - MASM アセンブリは、8 ビット レジスタを 16 ビット レジスタに移動します (つまり、mov cx, ch)

アセンブリプログラミング言語を学ぶことにしました。この 8086 チュートリアルを使用しています。一番下の演習は、いくつかの命令のエラーを見つけることであり、そのうちの 1 つは次のとおりです。

SO について、このトピックでそれを達成する方法を説明する同様の質問を見つけましたが、この操作が禁止されている理由を知りたいですか?

CHに10d = 00001010bがあり、それをCLに入れ、同時にCHを消去したいとしましょう。mov cx, ch10d を 16bit 00000000 00001010 と表示し、CH と CL にそれぞれ入れる (CX 全体) のでそうするようです。

何が問題なのですか? また、チュートリアルでこの式のエラーを見つけるよう求められるのはなぜですか?

0 投票する
1 に答える
80 参照

c++ - アセンブリ命令を c++ に変換する

以下のアセンブリを C++ に変換するのに問題があります

EDX は 32 ビット レジスタです。最下位の 16 ビット (DX) を取得する必要があります。

私は次のことを試しました:

dx に保存されている BCDE の値を取得することを期待していますが、少し間違っています。

どんな助けでも大歓迎です。