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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

5回答

19444閲覧

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

Kelvin

総合スコア34

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

2クリップ

投稿2016/10/19 13:16

編集2016/10/20 09:28

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

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

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

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

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

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

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

また、intelのCPUと、AMDのCPU等のようにメーカーが違うとどれほど違うのでしょうか?
###質問 2
ここまで古い古い文句を言ってきましたが、今のアセンブリに即した内容の入門書,入門サイトはありますか?

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

うーん、難しい質問ですね。
なお、私は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/19 15:43

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/10/19 16:00

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

2016/10/20 08:50

"パソコンで動かすのならば、はっきり言ってOSやコンパイラを作る仕事を しない限り、アセンブラ言語は不要となってきてます。" そうですか・・・必要なくなってきているのですね・・・ PCがどのように動いているのを理解するためにはアセンブリの勉強が不可欠だと思ったので一度勉強してみたかったのですが・・・ 今の時代ではアセンブリは学ぶことができないということならばC言語か何かで我慢しなくてはいけないのかもしれませんね
Kelvin

2016/10/20 13:26

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

2016/10/20 16: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もあります。 また、通信電文上に設定するデータのエンディアンの事を、 ネットワークバイトオーダー等と呼んでいます。 ここで、私の書いた、良く分からない言葉を、検索して、 意味を理解する事も、ある意味、アセンブラの基礎へと つながるのではないかと思います。
guest

0

結局最後やりたいこと

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

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

投稿2016/10/20 10:21

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kelvin

2016/10/20 10:23

ほかの回答でもアセンブラはもう使われない・・・と言われているので ゴールへ一直線でも良いのかもしれませんね。 ただそれだと本当に中身が理解できるかどうか不安です。
guest

0

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

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

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

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

投稿2016/10/20 09:17

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kelvin

2016/10/20 09:32

よほどのことがない限りCで大丈夫ということですか? あとよろしければお手数ですが"結局最後やりたいこと"をお読みください。 追記しました。
PineMatsu

2016/10/20 23:14

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

0

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

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

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

投稿2016/10/19 21:18

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kelvin

2016/10/20 09:16

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

2016/10/22 00:08

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

0

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

投稿2016/10/19 15:32

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kelvin

2016/10/20 09:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問