teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

16進数…

2020/03/20 06:44

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -55,7 +55,7 @@
55
55
 
56
56
  スタックポインタというのがでてきました。これは最初の`sub sp, sp, #16`によって16個後ろになっており、この16個分の領域が関数内で色々操作できる領域となり、ローカル自動変数`a`と`b`の保存領域として使われます。
57
57
 
58
- 関数内でのスタックポインタを0とすると次のようなイメージになります。
58
+ 関数内でのスタックポインタを00(16進数)とすると次のようなイメージになります。
59
59
 
60
60
  ```
61
61
  0000 0000 0000 0000 11...
@@ -63,7 +63,7 @@
63
63
  S <b > <a > R
64
64
  ```
65
65
 
66
- Rは関数が呼び出される前のスタックポインタで、Sは関数内で処理されている最中のスタックポインタです。スタックは後ろから使われるため、`a`用に0C-0F、`b`用に`08-0B`が確保されます。今回の関数では00-07は使用されません。ローカル変数がもっと多ければスタックが埋まっていきますが、ARM64では16バイト毎に確保するようになっているようで、`int`が5つ以上になると32になったりします。どの区切りで確保されるかや、スタックポインタの扱い方はCPUのアーキテクチャによって異なります。あくまで、これはARM64の話であることに注意して下さい。
66
+ Rは関数が呼び出される前のスタックポインタで、Sは関数内で処理されている最中のスタックポインタです。スタックは後ろから使われるため、`a`用に0C-0F、`b`用に08-0Bが確保されます。今回の関数では00-07は使用されません。ローカル変数がもっと多ければスタックが埋まっていきますが、ARM64では16バイト毎に確保するようになっているようで、`int`が5つ以上になると32になったりします。どの区切りで確保されるかや、スタックポインタの扱い方はCPUのアーキテクチャによって異なります。あくまで、これはARM64の話であることに注意して下さい。
67
67
 
68
68
  さて、話は戻って`b=a;`です。
69
69
 

1

ARM64を選んだのはRISCだから

2020/03/20 06:44

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  まず、CPUは大きく分けるとCISCとRISCにわかれます。例えばx86(およびその拡張であるx86_64)はCISCですが、SPARCやPowerPCはRISCです。RISCは非常に単純な命令しか用意されていませんが、CISCはより複雑な命令が用意されています。と言ってもRISCがCISCより劣るというわけではなく、RISCで複数の命令になるようなものをCISCでは一つにまとめた便利命令みたいな感じで用意しているだけです。CISCでのアセンブリを見た場合、RISCで複数の命令になるようなものが一つ命令にまとめられてしまっている場合があります。しかし、実際の所一つの命令でもCPU内部では二つ以上の処理を行っている場合もあるため、命令の一つをCPUの原始的な動作としてしまうには問題があると思います。なお、現在のCPUは、CISCであっても中身がRISCだったり、RISCであってもCISC並の命令が用意されていたりと、その垣根は曖昧になりつつあります。
13
13
 
14
- 今回は、コンパイル環境の構築が容易であり、また、後述の確認サイトで使えるARM64(64bit版のARM)をターゲットにしたいと思います。ARM64のアセンブリを調べるには[ARM® コンパイラ armasm ユーザガイド バージョン 6.02](http://infocenter.arm.com/help/topic/com.arm.doc.dui0801cj/index.html)を参考にしました(でも、微妙に違うような…コンパイラがGCCだから?)。日本語版があってよかったです。
14
+ 今回は、コンパイル環境の構築が容易であり、また、後述の確認サイトで使えて、一般的にRISCに分類されCPUの一つであるARM64(64bit版のARM)をターゲットにしたいと思います。ARM64のアセンブリを調べるには[ARM® コンパイラ armasm ユーザガイド バージョン 6.02](http://infocenter.arm.com/help/topic/com.arm.doc.dui0801cj/index.html)を参考にしました(でも、微妙に違うような…コンパイラがGCCだから?)。日本語版があってよかったです。
15
15
 
16
16
  つぎに、最適化についてですが、Cでは最適化によって結果が同じになる場合は、処理が省略されたり、まとめられてしまうことはよくあることです。とくに、使用されない変数は、そもそも消される場合が多いです。最適化による省略などを防ごうとするのであれば、次のように使用されることを強制する方法もあります。
17
17