問題タブ [program-counter]
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.
c - C またはアセンブリでスタックのリターン アドレスを変更する方法
ご存知のように、サブルーチンが呼び出されると、現在の PC (プログラム カウンター) の値がスタックに格納されます。以下のように、サブルーチン内で変更したいと思います。gcc コンパイラを使用して Intel Core-i7 3632QM でこれを実行したいと考えています。
memory-management - スタックポインタの値は?
バイト アドレス指定可能なメモリを備えたプロセッサを考えてみましょう。プログラム カウンター (PC) とプログラム ステータス ワード (PSW) を含むすべてのレジスターのサイズが 2 バイトであると仮定します。メイン メモリのスタックは、メモリ位置 (0100)hex から実装され、上方向に成長します。スタック ポインター (SP) は、スタックの一番上の要素を指します。SP の現在の値は (016E)hex です。CALL 命令は 2 ワードで構成され、最初のワードはオペコードで、2 番目のワードはサブルーチンの開始アドレスです (1 ワード = 2 バイト)。CALL 命令は次のように実装されます。
- PC の現在の値をスタックに格納する
- PSWレジスタの値をスタックに格納
- サブルーチンの開始アドレスをPCにロード
CALL 命令のフェッチ直前の PC の内容は (5FA0)hex です。CALL命令実行後のスタックポインタの値は、
A.016A
B.016C
C.0170
D.0172
この質問は、GATE 2015 コンピューター サイエンスで出題されました。
D を回答としてマークしました。回答が正しいかどうかわからないため、回答を確認するのを手伝ってください。
前もって感謝します。
assembly - ARM アーキテクチャの下にコマンドを追加し、カウンターをプログラムします。
add
コマンドが使用されているARMアセンブリのスニペットに焦点を当てています。以下のスニペットは、単純に次のように述べています。 プログラム カウンタのアドレスに、 に格納されている文字列の位置を見つけるために計算されたオフセットを追加しL._str
ますL._str
。
最初の 2 つの命令 (movw
およびmovt
) は、その文字列のアドレスを表す 32 ビットの数値をロードします。私は親指モードですよね?わかりました、そう言ったので、全体的なメモリ レイアウトを把握する方法がわかりません。以下は、メモリのコード セグメントの正しい表現ですか? またLPC1_0
、L._str
ベースアドレスは文字列add r0, pc
のアドレスですか?A simple string
各箱の寸法は?アーキテクチャに応じて 32 ビットまたは 64 ビット。
pc
もしそうなら、差分を使用してオフセット (に追加される) を取得できますL_.str-LPC1_0
。しかし、ここ+4
でも考慮されます。
ADD Rd、Rp、#expr
Rp が pc の場合、使用される値は (現在の命令のアドレス + 4) AND &FFFFFFFC です。
そのため、オフセット オフセットのバイト数も考慮する必要があるようpc
です。Ok。それで、これらのバイトはどこに追加されますか?これらの 4 バイトが、コマンドの前ではなく、命令で考慮されるのはなぜですか? これはコンパイラによって導入された最適化機能ですか?Rp
+4
mov
add
operating-system - プログラム カウンターの変更が特権命令ではないのはなぜですか?
プログラムカウンターはPCBに保存され、それはカーネルスペースにあります。ただし、プログラム カウンターの変更は特権命令ではありません。何故ですか?