質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

今、アセンブリを勉強するには?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 14K+

Kelvin

score 34

こんにちは
昨日アセンブラについて質問したものです。

MASMというアセンブラを進められたので使ってみようと思い、書籍に手を出す前にサイトで勉強してみようといろいろサイトを回ってみました。

しかし、古い情報や古い環境を前提とするものばかりで(32bit や 16bit ,8bitなどもありました)
当方の64bit環境で実行するのが難しいものばかりでした。

また、アセンブリは環境への依存が強い言語と聞いたのですが昔の情報で勉強しても今のCPUで動かせるかに不安が残ります。

ながなが書いてしまいましたがお聞きしたいことは、つです。

質問 1

アセンブリの環境ごとの違いというのはどれほどのものですか?

例えば8bitでアセンブリを勉強したとしてその知識はどの程度今の64bitCPUに生かせるでしょうか?

また、intelのCPUと、AMDのCPU等のようにメーカーが違うとどれほど違うのでしょうか?

質問 2

ここまで古い古い文句を言ってきましたが、今のアセンブリに即した内容の入門書,入門サイトはありますか?

当方きわめて初心者ですので(一番進んでいるC言語が入門書レベル)なるべく前提知識を必要としないものでお願いします。

わがままを言って申し訳ありませんが、よろしくお願いいたします。

結局最後やりたいこと

OSがどのように動いているかを理解したり、あわよくばOSを作れるようになりたいと思っています。

(なるべく広く意見を聞かせていただきたいのでベストアンサーを付けるのは少し遅くなると思います。申し訳ありません)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+5

うーん、難しい質問ですね。
なお、私は20年ぐらい前まで、アセンブリ言語で仕事をしてた者です。

質問1に、「環境ごとの違い」と書かれていますが、これは8bitや64bitという違いではなく、
CPU個別の仕様によって変わります。
32bitの中でも、x86(Intel)とARMでは全然違いますし、RenesasのSHもまた違い、他の
CPUもまた違います。
ただ、色々なルールが違うだけで本質的には同じと私は感じています。

そういう意味では、プログラミング言語自体が、本質的には、ノイマン型コンピュータの
場合、みなルールが多少違うだけ、同じという事にもなるかと思っています。
つまり、C言語もC++もC#もJavaもVisualBasicもアセンブラも、ある意味同じと言っています。

多分、2~3種類のCPUのアセンブラ言語が分かると、私の書いている意味が分かって
くると思います。

質問 2についてですが、正直では、誰も新たにアセンブラなんて習得しない
だろうと、思われているのか、入門書と実際にプログラムして、動かしてみる環境
が一般的ではなくなっていると思います。

各種CPUのマニュアルを読むと、アセンブラの説明がありますが、
ある意味、すでに複数のCPUのアセンブラが分かった人が読む前提で、
書かれている気もします。(また英語がほとんどです。)

本気で勉強したいのであれば、秋月電子通商あたりで、トレーニングボードを買って
そのボード上で実際に動かしてみるのが一番簡単かな?と思います。
(H8,RX,SH辺りなら日本語のマニュアルがあるかと)

逆に言うと、パソコンで動かすのならば、はっきり言ってOSやコンパイラを作る仕事を
しない限り、アセンブラ言語は不要となってきてます。

さらに、アセンブラはメンテナンス性、移植性が極端にが悪いので、プロの世界でも、
極力使わないようにしています。

MicrosoftのMASMで作ったコードをアセンブル、リンクして動かす環境も、
現時点では作るのが難しいのではないかと思います。

多分、Windows7 Pro の XP mode 上で、 FreeDOS (または本当のMS-DOSやPC-DOS)を
動かし、その中であれば、MASM で、作ったモジュール動かせると思いますが、
Win8 以降だと、実際の動かすことができないのではないかと思います。

どうしましょうかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 01:00

    全く同感です。
    車でたとえるとオートマチック車(高級言語)とF1(アセンブラー)位の差がありますからね。
    実用的には私の回答した”PIC"あたりから入るのが実用的と思います。
    逆にアセンブラーを吐き出す”C”言語の環境があって、それを”何をしている”から勉強するのが折角の時間を費やすには近道かと思います。
    またCPUの癖があります。
    ループを組むにしても、例えば”Z80"であれば、”DJNZ"で相対的に符号付の8ビット範囲で”Aレジスター”を用いてループするか?”JP”+フラッグで絶対番地にジャンプでループするか?
    あと技巧的に条件分岐で”A"レジスタの値を判断するのに”AND A,A"なんて出るとおそらく???でしょうし。
    先ずは現在もつかわれているPICもしくはARMでCPUの振る舞いを理解する事からいばらの道入口を入らないと。
    コメント失礼しました。

    キャンセル

  • 2016/10/20 17:50

    "パソコンで動かすのならば、はっきり言ってOSやコンパイラを作る仕事を
    しない限り、アセンブラ言語は不要となってきてます。"

    そうですか・・・必要なくなってきているのですね・・・

    PCがどのように動いているのを理解するためにはアセンブリの勉強が不可欠だと思ったので一度勉強してみたかったのですが・・・


    今の時代ではアセンブリは学ぶことができないということならばC言語か何かで我慢しなくてはいけないのかもしれませんね

    キャンセル

  • 2016/10/20 22:26

    あと、もう一つ質問なのですが
    bit数では言語に違いは出ないのですか?("8bitや64bitという違いではなく"と書かれているので)
    同じIntel製のx86CPUであれば32bitでも64bitでも変わらないということでよろしいですか?

    キャンセル

  • 2016/10/21 01:41

    cpuのbit数で違いが出てくるのは、変数の大きさとデータのアライメントかな。

    まず、変数の大きさですが、16bitのcpu用コンパイラである、MS-C 5.1 の場合、
    int のサイズが 16 bitで、longが32bit です。
    でも、32bitのcpu用のVisual Studio 2.0 の場合は、 int のサイズが 32 bit で、
    longのサイズも64bit です。
    32/64bitのcpu用の Visual Studio 2010 の場合、x86(32bit)モードの場合、
    intが32bitで、longも32bit、x64(64bit)モードの場合、intが32bitで、
    longが64bitです。
    つまり、intやlongに格納できるデータの範囲が、変わってきます。

    最近では、 stdint.h をインクルードした上で、
    int8_t 、int16_t、int32_tの様に、型にbit数を持たせて、移植性を
    高めるのが流行かと。

    次にアライメントの話です。
    「CPUのbit数とは何か?」についても、意見がありますが、
    アライメントを説明するため、データバスの幅として説明します。

    データバスが8bitの場合、16bitのデータをアクセスするためには、
    必ず2回アクセスが必要です。なので、どこにどんなサイズのデータを
    あっても構いません。

    ところが、16bitのデータバスを持つcpuの場合、16bitのデータへの
    アクセスは、1回で行う事ができますが、データを偶数のアドレスへ
    配置する必要があります。

    もし、奇数に配置したならば、2回アクセスしてしまうcpuと、
    例外を発行してしまうcpuに分かれます。

    どんなcpuでも問題が出ない様にするには、16bit(2byte)のデータは、
    2で割り切れるアドレスへ配置、32bit(4byte)のデータは、
    4で割り切れるアドレスへ配置とすれば通常、問題はありません。

    あとは、エンディアンの話も必要かな?
    16bit以上のデータをどの順番に配置するかが、cpuによって
    異なります。
    アドレスの小さい方に、下位8bit、大きい方に上位8bitを格納する、
    リトルエンディアンと、その逆のビックエンディアンがあります。
    リトルエンディアンの代表格は、Intelで、ビックエンディアンの
    代表格が、Motorolaです。
    最近では、エンディアンを選択できるcpuもあります。
    また、通信電文上に設定するデータのエンディアンの事を、
    ネットワークバイトオーダー等と呼んでいます。

    ここで、私の書いた、良く分からない言葉を、検索して、
    意味を理解する事も、ある意味、アセンブラの基礎へと
    つながるのではないかと思います。

    キャンセル

+1

MASMですかぁ。懐かしいなあ。アセンブラはズバリ機械語であるから、CPUの振る舞いを勉強するには一番とは思いますが、それより上位のシステム全体を知らないと何も出来ません。
もしどうしても”アセンブラ”が勉強したいと思われるなら、おすすめは”PIC”から始めるとわかりやすいと思います。多少勉強代はかかりますが秋葉原の秋月電子辺りでPICの書き込み機や組み立てボードを入手して、”レジスター”や”I/O”を理解され、簡単なアセンブラーから始められた方が良いかと。なお”PIC”であれば情報が豊富だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 18:03

    なるほど
    PCで動かすのではなくマイコン? みたいなので動かして勉強する手もあるんですね
    ありがとうございます

    キャンセル

+1

前回の質問の続きという前提とします。
https://teratail.com/questions/51745

回答1
依存性は強いです。が、現行MSが公式でサポートしている一般向けWidowsで動作するようなものについては、32bitプログラムに限ればある程度互換性があります(IntelとAMDの違いはあってもOSに区別はないですよね?)。もちろん、メーカ個別の専用機能とか使うのはナシという話で。とりあえず勉強目的であれば、簡単な四則演算とかメモリ使用、条件分岐とかの共通機能から学ぶはずですのでこの辺りからならば違いが出ることはないと思います。

回答2(Webページや図書についての回答ではありませんが、ご参考に)
まるごとアセンブリだけでプログラムを作ることは難しいですが、勉強目的ならばVSのインラインアセンブリ機能を使う方法があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 18:16

    VS2015のC++での"__asm"のような感じでしょうか?

    キャンセル

  • 2016/10/22 09:08

    はい。最低限の勉強はそこからできるはずです。デバッガと組み合わせて動作確認から始められます。もちろん、必要ならば、単独でプログラムを作っていくというのもアリですね。

    キャンセル

+1

アセンブラですか。しかもMASMとは、懐かしい。
大昔(笑)は、それしかやってなかったですが、今は、SH CPUを使った組み込みボードで部分的に使っているくらいですね。
CPUが直接理解できる命令で直接書いていくので、CPUにバリバリ依存します。なので、ターゲットのCPUの理解が欠かせません。
MASMだといわゆる86系と呼ぶCPUになります。命令をまず覚えないといけませんが、基本は大雑把ですが、

  • レジスタとメモリ間のデータ転送
  • レジスタを使った演算

しかありません。
8086だとセグメントというちょっとわかりにくいアドレッシング・モードがありますが、セグメントを勉強するのは今更必要はないと思います。

Z80などの8ビットの場合は、メモリーの制限や速度制限もあってアセンブラで組んでましたが、今は特殊な処理を除いてC言語を使っています。(割り込み処理もC言語で組んでいます)。それだけ、CPUの性能が上がっているわけで、アセンブラを使うのは余程特殊な用途に限られるんじゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 18:32

    よほどのことがない限りCで大丈夫ということですか?

    あとよろしければお手数ですが"結局最後やりたいこと"をお読みください。
    追記しました。

    キャンセル

  • 2016/10/21 08:14

    OSも殆どはCなどの高級言語で作られていますね。生産性から言ってアセンブラは生産性が低い。ちょっとしたことをやろうとしても何行も命令を連ねていく必要があります。
    プリミティブな言語を知識として持っておくことは良いことだと思いますが、Cなどの便利で効率性の高い言語がすでにあるわけですから、実践の場ではアセンブラを使う選択肢は限られてくると思います。
    最初に、「部分的に使ってる」と書きましたが、組み込みボードである言語処理を行っている部分に使用しています。プログラマブル可能な仕組みを組み込んであるのですが、インタープリター的な処理では速度的に使用を満足することが出来ないので、仮想言語を機械語に展開するところで使っています。仮想言語の命令を単純に機械語に置き換えているだけですが、置き換える機械語を作らないといけないのでその部分だけアセンブラを使用しています。
    なので、コンパイラー(この組み込んである言語はそんな高級なものではないですが)を作るのであれば、アセンブラのお世話になることになると思います。

    キャンセル

+1

結局最後やりたいこと

OSがどのように動いているかを理解したり、あわよくばOSを作れるようになりたいと思っています。

という事なら
30日でできる! OS自作入門
等の書籍でOSの作り方そのものを学ぶというアプローチもありかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 19:23

    ほかの回答でもアセンブラはもう使われない・・・と言われているので
    ゴールへ一直線でも良いのかもしれませんね。

    ただそれだと本当に中身が理解できるかどうか不安です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る