問題タブ [stack-pointer]
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 アーキテクチャでハーフワード値をスタック メモリに保存中にバス エラーが発生しましたか?
スタックに保存したい 2 つのレジスタ w1 と w2 があります。完全な単語 w1 と w2 の半分をスタックに格納したいと考えています。これが私の実装です:
コンパイル時に、最初の命令は正常に実行されますが、2 番目の命令はバス エラーをスローします。これは配置の問題であることはわかっていますが、なぜこれが起こっているのかを正しく理解できませんか?
ARMv8 (64 ビット) アーキテクチャ用にコンパイルしています。
c - POSIX C スレッドでのコンテキスト切り替え前に格納されている現在のスタック ポインター レジスタの値はどこにありますか
POSIX 環境で pthreads を使用し、コンテキスト スイッチが発生しようとしている場合、レジスタの現在の値をどこかに保存する必要があるため、レジスタの値は次のようになるためesp
、このスレッドにコンテキスト スイッチを戻すときにそれを取得できます。esp
別のスレッドの保存された SP 値によって上書きされます。スレッドごとに別々のレジスターを持つことは不可能だと思いesp
ます (間違っていたら訂正してください)。そうは言っても、コンテキスト切り替えがヒットする直前に、現在のスレッドの SP 値がどのデータ構造に格納されているか知りたいですか?
struct pthread*
の値からキャストされた の値を調べてみましたpthread_t
が、たとえば、特定の関数を呼び出してテスト中のスレッドの現在の SP を変更しても何も変化しませんでした (つまり、テスト関数を呼び出す前後を比較します)。
c - アセンブリにローカル変数用のスペースを作る
そのため、extern C 関数を呼び出すアセンブリ プログラムを作成する必要があります。そこで、単純なpow
関数を作成し、この C コードでアセンブリ プログラムをコンパイルしました。すべてが機能します。-S
しかし、 のコマンドから見たようgcc
に、コンパイラはローカル変数用のスペースを作成します。私はそれが次のようになると思いました:
3 つのローカル変数があるため、コンパイラはsubl $12, %esp
. しかし、それはうまくいきsubl $16, %esp
ます。ここに数字を 1 つだけ残したとしても、 だけ減少し16
ます。今、私は自分のコードを持っています:
main.s
:
func.c
:
期待どおりに動作し、./main
出力され25
ます。subl
しかし今、私はから何もしません%esp
。つまり、この行を追加できますが、何も変わりません。私はインターネットを検索しましたが、私のコードが偶然に機能する可能性があり、通常はデクリメントする必要があることがわかりました%esp
。ここでの私の質問は次のとおり%esp
ですmain
。それはあるべきですか、12
それとも多分16
ですか?