48296


自分は将来アセンブリも読めるようになりたいので色々勉強をしているのですがよく要領がつかめません。というのは、コンパイラが吐き出したアセンブリコードはCPUを中心とした機械側(コンピュータアーキテクチャ)にとっては飽くまで仕様みたいなものであって、実際は全然違う(ディテール部分はマシンに因る)ということなんでしょうか？

このサイトで色々いじってはみるのですが、どうも挙動が読めません。(特にIPがどこから出てきたのかわかりません…)  
<http://schweigi.github.io/assembler-simulator/>

もしアセンブリコードが人間側の仕様みたいなものだとするのなら、レジスタやらメモリやらは人間側がそういう風にいじったことにしただけ、というような気がします。  
自分が知りたいのは、だとするとCPUの特性を知り尽くさないとあまりパフォーマンスが出せないことになるのでは？ということや、アセンブリを書くことに意味があるのか？といったことについてです。さらにアセンブルした機械語も、実際のRAM上では正しく値がセットされていない、ということになりませんか？だとするとデバッガやシミュレータとはなんだったのか？という気がしてしまいます。本当にレジスタの値は読めているんでしょうか？

どうも透過性という概念と何か関係がありそうなのですが…  
あまりにも分からないことだらけです。よろしくお願いいたします。

追記  
たくさん回答してくださって皆さんありがとうございました。  
とても参考になりました。言われてみれば確かにCPUごとにアセンブリが対応していることを失念しておりました。自分の中では結局のところ現代のCPUではとても理解が及ばないかもしれない、ということを思いました。
レイヤーの話もありましたが、自分は精々アセンブリレベルのことが知りたいだけだったので、なんとなく腑に落ちました。


CC BY-SA 4.0
2018-09-12T00:22:44.483
48290
2018-09-12T08:58:50.063
2018-09-12T08:58:50.063
28320
28320
question
assembly
アセンブリについて教えてください(初歩的な質問)


>
> コンパイラが吐き出したアセンブリコードはCPUを中心とした機械側(コンピュータアーキテクチャ)にとっては飽くまで仕様みたいなものであって、実際は全然違う(ディテール部分はマシンに因る)ということなんでしょうか？

誤解されています。C言語など多くの言語はCPUに対して中立です。しかしアセンブリ言語はCPUの解釈する機械語と密接に関係しています。具体的にはアセンブリ言語は機械語とほぼ１：１で対応しています。  
ですので、CPU毎に固有のアセンブリ言語が存在することを理解してください。

> 特にIPがどこから出てきたのかわかりません…

件のサイトは **x86 like cpu** と説明されています。`IP`もx86
CPUに固有のレジスターです。他のCPUでは`PC`と呼ばれることの方が多いかもしれません。

ともあれ、大前提として **x86 like cpu**
に対するアセンブリ言語を試していることを自覚し、概念としてアセンブリ言語を理解したいのか、特定CPUに対して理解したいのか、その部分をご自身で明確にしてください。


CC BY-SA 4.0
2018-09-12T02:17:48.957
48295
2018-09-12T02:17:48.957
4236
48290
answer


ちょっと何を言いたいのかが伝わって来てないんですが...

IPはPC(プログラムカウンタ)ですね。RAM上の現在の実行している処理のアドレスが入ってます。  
IPのアドレスにある値を読めば命令が分かります。命令がわかれば全体の長さも分かるので、次実行するべきアドレスは全体の長さを足せば算出できますよね？

紹介されてるサイトって結構親切ですね。  
行毎に青く塗ってあるのでわかりやすいです。  
動作を1Hzに変えたら、もっと分かりやすくなると思いますよ。

例えば、RAMの1行目の末尾の`06`が`start:`の次の行にある`MOV`ですね。  
3行目の後ろの方にある`27`が`JNZ`で`.loop (1F)`に飛ばしてるから`27 1F`ってなってますね。  
IPの値がそのように変わって行くのが分かると思います。

アセンブラでは、メモリ上のどのアドレスをどうするとか、レジスタをどうするとかってレベルの話になります。  
命令した値が命令したレジスタに入ります。それが所望の値でなかったら書いた人のほうが間違ってるんですね。  
一応エラッタがあって所望の動作にならないという事はありますが、市販されているレベルの製品ではレアケースですね。有名所ではPentium時代の電卓ですかね。ｗ

* * *

CPUの仕組みを知り尽くさないと...というのは、一からアセンブラで記述するんならそうでしょうね。  
でもアセンブラは、部分的にコンパイラが出す結果と違うcodeにしたかったり、アセンブラで書くしかない(レジスタの値使いたいとか...)という所に、部分的に用いることが多いかと思います。  
なので、基本的に、コンパイラに任せた方が良いバイナリが出力できます。

また、アセンブラはCPU毎に変わるので、現在どんな命令系のCPU使ってるかによってかなり変わります。`x86`とか`AMD64`とか聞いたことがありますよね？それです。  
なので、動作させたい命令系に合わせてコンパイラは変えてあげないとダメです。Windows用にコンパイルしたバイナリをiPhoneやAndroidに持って行っても動きませんよね？

明確な目的が無いんだけど、勉強したいというなら簡単なもののアセンブラを勉強することをオススメします。`x86`は、読めないことは無いけど難しかったような記憶があります。


CC BY-SA 4.0
2018-09-12T02:18:00.303
48296
2018-09-12T04:30:02.163
2018-09-12T04:30:02.163
2383
2383
48290
answer


IPはインストラクションポインタです。CPUのレジスタの一種でプログラムカウンタ（PC）とか、シーケンシャルコントロールカウンタ（SCC）と呼ばれることもあります。アセンブラは機械語を人間が読みやすい形式にしただけなのと、機械語はCPUを動かす命令のことなので、CPUアーキテクチャの仕様を勉強すればいいと思いますよ。

リンクのシミュレーターはx86アセンブラのシミュレーターだと思いますが、CPU仕様についてはblogに書かれているので読んでみてください。  
[Make your own assembler simulator in JavaScript (Part
1)](https://www.mschweighauser.com/make-your-own-assembler-simulator-in-
javascript-part1/)

x86の命令セットについてはインテルのマニュアルがダウンロードできるので確認してみてください。  
[IA32 デベロッパーズ マニュアル - Google
検索](https://www.google.com/search?client=firefox-b&q=IA32+%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%BA+%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB&spell=1&sa=X&ved=0ahUKEwi9g8DetrTdAhWGBIgKHd7fDwMQBQgkKAA&biw=2039&bih=1209)


CC BY-SA 4.0
2018-09-12T02:34:46.607
48297
2018-09-12T02:34:46.607
5008
48290
answer


アセンブラ／アセンブリ言語／機械語に関して学習するには、現代のCPUは高機能すぎるため、あまり向いていないと思います。昔からある8ビットCPUを使ってみて基礎体力を付けてから、より最近のCPUにステップアップしていくのがいいでしょう。

Microchip社のPICシリーズという、組み込み向けのマイコン（マイクロコントローラ）があります。ラインナップの中には若干規模の大きなものもありますが、昔から定番のPIC16F84やPIC16F877あたりで初めてみるのが良さそうです。

「PIC はじめて 入門」や「PIC アセンブラ
入門」などのキーワードで、良さそうな本を探してみてはいかがでしょうか。同様のキーワードで、入門用のキットも見つかると思います。

その後、興味が続くようでしたら、AVRやZ80やH8などに挑戦してみると、組み込み系のスキルが付く上に、C言語のポインタの理解も深まります。

もっとも、あらゆるCPUのアセンブリ言語を習得することにはあまり意味が無いかもしれません。最近は、人間よりコンパイラの方が賢いので、多くの場合、コンパイラの方が効率的な機械語を生成します。しかも、人間が思いも付かないようなトリッキーで珍妙な機械語を生成することさえあります。アセンブラを習得するのは良いと思いますが、コンパイラに勝とうとは思わないでください。

組み込み用マイコンのような低レベルのアセンブリ言語に慣れておけば、x86のC言語のコンパイラが生成したコードを読むのが多少楽になります。今時の統合開発環境なら、C言語のソースとアセンブリを混合表示する機能が備わっていることが多いので、見比べながら学習していくといいでしょう。


CC BY-SA 4.0
2018-09-12T08:40:40.477
48311
2018-09-12T08:40:40.477
3337
48290
answer