問題タブ [register-allocation]
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.
x86 - レジスターの割り当て --- 呼び出し元が保存したレジスターを利用してスピルする方法
いずれかが呼び出し先によって使用されている場合は、呼び出し元による指示caller saved registers (rax rdx rcx rsi rdi r8 r9 r10 r11)の前に保存し、後で復元する必要があることを学びました。call
以下の例を通して、
ノート
変数
a - gはすべてcallee saved registers (rbp rsp rbx r12 r13 r14 r15). また、スタック メモリのアドレス指定にはどちらかを使用する必要があるため、rbpまたはの両方を使用することはできません。rspreadとprintは、外部のコンパイル ユニットからのものです。したがって、現在のコンパイル単位をコンパイルするとき、具体的には関数のレジスタ割り当て中に、呼び出し元の保存レジスタの使用について実際にはわかりませんmain。
Godboltでは、-O3次のようにコンパイルされます
ノート
変数
aは にスピルされ12(%rsp)ます。これらはまったく使用されないため、スピルを行う必要はありません
caller saved registers。これは、ここではより効率的であることが判明しています。
私の質問
caller saved registers使用しない場合は、をこぼすことに対処する必要がないように見えます。したがって、いつ使用する必要がありcaller saved registersますか?のような呼び出し先の場合、レジスタの使用法がわからないため、 ? の流出をどのように行う必要があり
readますか?printcaller saved registers
ありがとう
assembly - GCCインラインasmのメモリオペランドのアドレス指定モードに影響を与える早期クロバーの誤った動作の具体例?
以下は、 GCC マニュアルの Extended Asm docsからの抜粋で、asmキーワードを使用して C にアセンブリ命令を埋め込む方法について説明しています。
1 つの出力パラメーター ( a ) がレジスター制約を許可し、別の出力パラメーター ( b ) がメモリー制約を許可する場合、同じ問題が発生する可能性があります。bのメモリ アドレスにアクセスするために GCC によって生成されたコードには、 a によって共有される可能性のあるレジスタが含まれている場合があり、GCC はそれらのレジスタを asm への入力と見なします。上記のように、GCC は、出力が書き込まれる前にそのような入力レジスタが消費されることを想定しています。この仮定により、asm ステートメントが b を使用する前に a に書き込むと、正しくない動作になる可能性があります。「&」を組み合わせる aのレジスタ制約を伴う修飾子により、aの変更がbによって参照されるアドレスに影響しないことが保証されます。. それ以外の場合、 bを使用する前にaが変更された場合、 bの場所は未定義です 。
aイタリック体の文は、 asm ステートメントが を使用する前に書き込むと、「不正な動作」が発生する可能性があることを示していbます。
このような「誤った動作」がどのように発生したのかわかりません。そのため、この段落を深く理解できるように、「誤った動作」を示す具体的な asm コードの例が必要です。
このような 2 つの asm コードが並行して実行されている場合に問題を認識できますが、上記の段落ではマルチプロセッシング シナリオについて言及していません。
1 つのコアに 1 つの CPU しかない場合、そのような誤った動作を引き起こす可能性のある asm コードを示していただけaますbかb。
私がよく知っているアセンブリ言語は Intel x86 アセンブリだけなので、そのプラットフォームをターゲットにした例を作成してください。
timer - stm32 マイクロコントローラで TIMx CNT レジスタを読み取る方法: 等号の問題
私はnucleoボードf411RE、特に汎用タイマーTIM9、TIM10、TIM11をいじっています。TIM10(16ビットタイマー)を使用して、有効にして実行するだけで時間を測定し、TIM10-> CNTに保存されている値を使用して、if条件を使用して決定(LEDをオンにするかどうか)を決定したかった.
<、>、<=、>= 演算子を使用しているときに、カウンター (TIM10->CNT) の値を他の数値と比較すると、次のようになります。
あるいは:
すべてが期待どおりに機能し、関数は思いどおりに動作します。
この投稿の主人公と同じように、次のステートメントのように等号を使用してタイマー カウンター レジスタをゼロ以外の数値 (「任意の値」として表される) と比較しようとすると、常に問題が発生します。
上記のコメントで述べたように、等号 ( == ) をゼロ以外の数値で明示的に使用すると、その条件で定義されたブロックは実行されません。TIM10カウンターを使用して比較できる唯一の方法は、不等式演算子(>、<、=>、> =)を使用するとき、または明示的にゼロと比較するときのようです。
これが私を悩ませている唯一の部分であるため、この時点まで実際のコードを投稿していません。他のすべてのコンポーネントは魅力的に機能しています。とにかく、ここに私のコードを垣間見ることができます:
疑似コード:
--- プログラム開始 ---
--- TIM10 -> ゼロに初期化された CNT ---
---while ループ開始 ---
---TIM10→CNTレジスタを読み込み、その値を変数に格納---
---ボタンを押すだけで使えるTIM10---
---カウンターがすでに実行されている間にもう一度ボタンが押された場合、タイマーカウンターを停止し、その値を変数に保存して次の関数で使用します---
---経過時間TIM10→CNTの値に応じてLEDをON/OFFする機能---
実際の C++ コードは次のとおりです。
「==」演算子をタイマーカウンターレジスタと組み合わせて使用できない理由についてのヘルプとコメントをいただければ幸いです。
pd: どんなコメントでも実際に高く評価されます。
pd2: 遅延が何らかの形で最後の if 条件をバグらせていると思うかもしれませんが、実際にはそこにどの命令が配置されているかは関係ありません。そのブロックは「==」の使用法のために実行されません。
pd3: 前に言ったように、問題は明示的に "==" の使用にあるようです。なぜなら、コードの他のすべての部分を試してみたところ、問題なく動作するからです (クロック構成、タイマー構成、GPIO 構成、および対応する各ピンへの書き込みと読み取りの方法)