問題タブ [carryflag]
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.
arm - 結果がメモリに書き戻されるときに、プロセッサ(特にARM)は実行の後の段階でオーバーフロー結果をどのように解釈しますか
プロセッサは数値を 2 の補数として表現する慣例に従っているため、2 つの正の数値を加算した結果の数値が依然として正であり、負ではないかどうかをどのように知るのでしょうか。
たとえば、2 つの 32 ビット数値を追加すると、次のようになります。
r2に値0x50192E32が含まれているとします
サンプルコード:
ここでは、オーバーフロー フラグが設定されます。メモリから保存された結果を後の命令で使用したい場合 (コードのどこかで...そして、今では異なる命令のために、プロセッサのcpsrが変更されています)。
最初の加算命令の結果の MSB は1です。つまり、r5のMSBは1です。プロセッサはどのように値を解釈しますか。2 つの正の数を足した正しい結果は正なので。MSB に 1があるだけで、負の数として解釈されますか? その場合、予想とは異なる結果が得られます。
たとえば、4 ビット マシンでは次のようになります。
2 の補数: 4=0100 および 5=0101; -4=1100 および -5=1011
現在4+5=9であり、それが1001 としてレジスタ/メモリに格納されている場合、後で別の命令によってアクセスされ、プロセッサが数値を 2 の補数形式で格納し、MSBをチェックし、それが負であると判断した場合7。
それがすべてプログラマーに依存している場合、正しい結果をreg/memに保存するにはどうすればよいですか。正しい結果を保存するためにコードにできることはありますか?
verilog - 4 ビットのキャリー ルック アヘッド (CLA) からの 16 ビットの加算器 - ブロックの生成および伝搬からのカウント
私はVerilogが初めてです。これが私がこれまでに行ったことであり、4ビットのCLAが機能しています。ただし、16 ビット (4 ビット CLA のインスタンスを使用) はそうではありません。問題は、間違いなく、ブロックの伝播 ( ) とブロックの生成 ( )Cout_itermedからの (中間キャリー) 値の設定にあります。これに対処するモジュールを作成しました。BPBGcarries
ザイリンクス ISE では、出力波形は次のように表示されます (波形は表示されません)。
4 ビット CLA のテスト ベンチを実行すると、波形が (そして正しく) 表示されます。carriesまたはCLA_16bitモジュールのどこに問題があるのか 誰か説明できますか?
assembly - 1 番目と 2 番目のオペランドと同じレジスタを持つ x86 sbb
一連のx86命令を分析していて、次のコードと混同してしまいました。
sbbが に等しいdes = des - (src + CF)、つまり に何らかの形で最初に入れ-CFられた命令であることを理解していedxます。それからnegtive -CF、CFそしてゼロに等しいtestかどうか??CF
ただし、jzチェック フラグZFではなくCF! では、基本的に上記のコード シーケンスは何をしようとしているのでしょうか。これは、バージョンx86によって生成される正当な命令シーケンスです。g++4.6.3
C++コードは実際にはbotanプロジェクトからのものです。全体的なアセンブリ コード (Botan RSA 復号化の例) は、こちらにあります。逆アセンブルされたコードには、このような命令シーケンスが非常に多くあります。
assembly - x86で乗算を計算するためにキャリーフラグとオーバーフローフラグがどのように使用されていますか
乗算された 2 つの数値がレジスタをオーバーフローしたときに、答えを正しく計算するために 2 つのフラグはどのように使用されますか?
たとえば、alが保持され、0xffが乗算され0x2、 へのオーバーフローが発生したax場合、フラグはこれにどのように役立つのでしょうか?
assembly - ARM の一部の命令を理解できません: SBC、RSC
わからないSBCARMRSC命令
どちらもキャリーフラグを扱うことを知っています(C)
次のように結果をキャリー()で追加するのは理にかなっていると思いますADC:
しかし、キャリーを使用した減算/逆減算...何が起こっているのか理解できません:(
SBCandを使った例を教えてくださいRSC。
assembly - AT&T アセンブリ キャリー フラグ
AT&T アセンブリで再び助けが必要です。以下のようなデータをメモリにロードしました (16 進数と 10 進数)。
最初のバイト = 数値カウント、2 番目 = 各数値の長さ (バイト単位)、そして (最初の * 2 番目の) バイトの数値を取得したとしましょう。この例では、3 つの数字、それぞれ 2 バイト、最初の数字は 16 39 というように 1 です。各数値を追加したいので、この場合は 0x10 + 0xe8 (下位バイト) を結果 [0] に追加し、次に 0x27 + 0x03 を結果 [1] に追加し、再び結果 [0] = 結果 [0] を追加します。 + 0x64 そして最後に 結果[1] = 結果[1] + 0x00.
すでに 0xf8 が含まれている result[0] に 0x64 を追加すると、CF (キャリー フラグ) が設定されます。もちろん、このキャリーを次の結果[1] の追加で使用したいので、これは素晴らしいことです。しかし問題は、次の CMP 命令 (以下のコードでマークします) の後、このキャリー フラグがクリアされるため、最終結果は 0x5C2A (結果の 2 バイトを結合したとき) であり、0x5C2B になるはずです (ただし、キャリー フラグは影響しませんでした)。 cmp 命令による追加)。
%eax - 合計する数値の量
%ecx - 各数値の長さ (バイト単位)
%esi - ループ開始前は、「実際の」データの最初のバイト (この場合は 0x10) を指しています。
