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

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

ただいまの
回答率

89.96%

アセンブリ言語を使うメリットについて。

解決済

回答 11

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 7,400

carnage0216

score 131

アセンブリ言語を使っている方にお聞きしたいのですが、使用しているCPUあるいはGPUの構造を細かい部分(メモリ、レジスタ、演算回路など)を把握したうえでアセンブリ言語を扱っているのでしょうか?
逆にハードウェアの知識が浅いとアセンブリ言語は理解できないのでしょうか?

C言語において勉強中なのですが、CPUなどを使いこなすのにアセンブリ言語を勉強している人などがいるなどの記述があったので気になりました。
個人でも調べると確かにハードウェアを理解したうえでアセンブリ言語などの低級言語から高級言語のプログラムを作るなどありました。またファイル操作などのアセンブリコードなども書いてありました。
アセンブリ言語でここまで制御できるのは流石だと感動しました。

ただ、アセンブリ言語を使っている方が使っているCPUのハードを理解してからアセンブリ言語を使うのか、C言語をアセンブリ言語の出力にしてCPUの動作などから構造を把握して、アセンブリ言語でプログラムを作っているのか気になりました。
そしてどちらにしてもなぜアセンブリ言語を使っているのか教えていただけると勉強になります。

もしかしたら編集などして質問が増えたりするかもしれませんがどうかよろしくお願いいたします。

(編集した内容です)

(NASMで作成)

; ----- スタート(ファイル読込)
ASSEMBLE:
ORG 0X0100 ; セグメント指定
MOV AX,0X3D00 ; AH:0X3D->ファイルオープン、AL:0X00->読込指定
MOV DX,FILENAME ; DX:ファイルパスのメモリアドレス
INT 0X21 ; システムコール(戻り値:AX->ファイルハンドル)
JC ASM_END ; 読込失敗
; ----- 読込成功
FILE_OK
MOV SI,AX ; ファイルハンドル保存
MOV BX,AX ; ファイルハンドル
MOV AX,0X3F00 ; AH:0X3F->読込
MOV CX,64-1 ; CX:読込バイト数
MOV DX,BUFFER ; 読込データ展開番地
INT 0X21 ; システムコール(戻り値:AX->実際に読み込んだバイト数)
; ----- 終了
ASM_END:
MOV AH,0X3E ; AH:0X3E->ファイルクローズ
MOV BX,SI ; ファイルハンドル
INT 0X21 ; システムコール(戻り値なし)
MOV AH,0X4C ; AH:0X4C->プログラム終了
INT 0X21 ; システムコール(戻り値なし)
; ----- メモリ
FILENAME:
DB 'TEXT.TXT' ; ファイルパス
BUFFER:
RESB 64 ; メモリ確保
***** ***** ***** ***** *****
; ----- スタート(ファイル書込)
ASSEMBLE:
ORG 0X0100 ; セグメント指定
MOV AX,0X3D01 ; AH:0X3D->ファイルオープン、AL:0X01->書込指定
MOV DX,FILENAME ; DX:ファイルパスのメモリアドレス
INT 0X21 ; システムコール(戻り値:AX->ファイルハンドル)
JC ASM_END ; 読込失敗
; ----- 書込成功
FILE_OK
PUSH AX ; ファイルハンドル待避
MOV BYTE[BUFFER],0X41 ; [ A ]と出力
POP BX ; ファイルハンドル回帰
MOV AX,0X4000 ; AH:0X40->ファイル書込
MOV CX,0X01 ; 書込バイト数
MOV DX,BUFFER ; 書込データの番地
INT 0X21 ; システムコール(戻り値:AX->書込バイト数)
; ----- 終了
ASM_END:
MOV AH,0X3E ; AH:0X3E->ファイルクローズ
MOV BX,SI ; ファイルハンドル
INT 0X21 ; システムコール(戻り値:なし)
MOV AH,0X4C ; AH:0X4C->プログラム終了
INT 0X21 ; システムコール(戻り値:なし)
; ----- メモリ
FILENAME:
DB 'TEXT.TXT' ; ファイルパス
BUFFER:
RESB 64 ; メモリ確保
***** ***** ***** ***** *****
; ----- スタート(ファイル作成)
ASSEMBLE:
ORG 0X0100 ; セグメント指定
MOV AH,0X3C ; AH:ファイル作成時→0X3C:ファイル上書、0X5B:エラー
MOV DX,FILENAME ; DX:ファイルパスのメモリアドレス
MOV CX,0X0000 ; CX:0X0000->通常ファイルの作成、0X0001->読込専用ファイルの作成
INT 0X21 ; システムコール(戻り値:なし)
JC ASM_END ; 作成失敗

; ----- 作成成功
FILE_OK
; ----- 終了
ASM_END:
MOV AH,0X3E ; AH:0X3E->ファイルクローズ
MOV BX,0X00 ; 初期化
INT 0X21 ; システムコール(戻り値:なし)
MOV AH,0X4C ; AH:4C->プログラム終了
INT 0X21 ; システムコール(戻り値:なし)
; ----- メモリ
FILENAME:
DB 'TEXT_NEW.TXT' ; ファイルパス
***** ***** ***** ***** *****
; ----- スタート(ファイル削除)
ASSEMBLE:
ORG 0X0100 ; セグメント指定
MOV AH,0X41 ; AH:ファイル削除指定
MOV DX,FILENAME ; DX:ファイルパスのメモリアドレス
INT 0X21 ; システムコール(戻り値:なし)
JC ASM_END ; 削除失敗
; ----- 削除成功
FILE_OK
; ----- 終了
ASM_END:
MOV AH,0X3E ; AH:0X3E->ファイルクローズ
MOV BX,0X00 ; 初期化
INT 0X21 ; システムコール(戻り値:なし)
MOV AH,0X4C ; AH:4C->プログラム終了
INT 0X21 ; システムコール(戻り値:なし)
; ----- メモリ
FILENAME:
DB 'TEXT_DEL.TXT' ; ファイルパス


ちなみに、載せましたファイルを開くアセンブリ言語プログラムは使うCPUの構造をレジスタや細かいレベル(演算回路にデータをおくるレジスタなど、文字を表示するためのデータを送るレジスタなど)まで理解して作ったのですか?

だとしたら、何をもとに使っているCPUの内部構造を把握したのでしょう

か?

個人的にはアセンブリ言語はCPUに依存するため使うCPUの構造を詳しく知らないとプログラム自体組めない様にも思えます。

また、質問とは真逆にアセンブリプログラムからわからない情報は何かありますか?

編集後で申し訳ありませんがどうかよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 11

checkベストアンサー

+8

こんにちは。

C言語において勉強中なのですが、CPUなどを使いこなすのにアセンブリ言語を勉強している人などがいるなどの記述があったので気になりました。

アセンブラでギチギチにハードウェアを制御すれば最大限の性能を引き出せますが、その方法で大規模なプログラムを開発することはあまり現実的ではありません。生産性が低すぎてお金がかかりすぎるのです。そのため、そこまでやるのは処理速度が最重要なごく一部の分野の狭い範囲に限定されます。
多くの人は、そのようにして開発されたデバイスドライバやライブラリを用いて、それなりの速度で動作するプログラムを開発し、生産性を確保します。

この速度と生産性のトレードオフは対象のプログラムで大きく振れます。生産性命の分野もあれば速度命の分野もあります。C言語は速度命に近い分野のプログラムで良く使われます。ですので、ハードウェアの特性を把握していれば居るほど有利になる(より高速なプログラムを開発できる)というわけです。
そのためにアセンブラを勉強することはかなりお薦めです。


【質問の追記への回答】

だとしたら、何をもとに使っているCPUの内部構造を把握したのでしょうか?

最初はやはりアセンブラの入門書で学習するのが良いように感じます。情報処理技術者試験のCASLなどなら入門書もあるように思います。

実際のハードウェアを制御してみたいのであれば、ATEMLのAVRPICならばハードウェアも廉価ですし、情報も豊富です。(個人的には構造が素直なAVRがお勧めです。)

個人的にはアセンブリ言語はCPUに依存するため使うCPUの構造を詳しく知らないとプログラム自体組めない様にも思えます。

その通りです。しかし、いきなりPCのCPUから始めるのは難しすぎるのでお勧めではありません。
私自身はまだCPUが単純だった頃からこの分野に興味を持ちましたので、上記のAVRマイコンよりも更に簡単なマイコンから入りました。その流れ自体は正解だったと思います。

まずは、基本のメモリやレジスタの仕組みをマスターすることが重要と思います。その辺りを把握しているのとしていないのとでは、C言語で書けるプログラムの質が結構変わると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/28 04:17

    またAVRマイコンの開発ソフトにおいてⅭ言語プログラムのアセンブリ出力などの機能はあるのでしょうか?
    どうかよろしくお願いいたします。

    キャンセル

  • 2018/03/01 01:06

    > マイコンの中でもCPUに構造や複雑さが一番似ているのはAVRなのではないでしょうか?

    マイコンはI/Oも1チップのまとめたCPUです。内部にCPUも入っています。
    CPUの意味がPCのCPUでしたら、AVRがそれに一番似ているというわけではないです。C言語向きという点では似ていますが、より命令体系が似ているCPUもある筈です。

    > AVRマイコンの開発ソフトにおいてⅭ言語プログラムのアセンブリ出力などの機能はあるのでしょうか?

    それはCコンパイラの機能ですね。私の知る限りアセンブリ出力できないCコンパイラはないです。
    AVR用Cコンパイラでアセンブリ出力したことはありませんが、恐らくあると思います。

    キャンセル

  • 2018/03/01 01:13

    どうもありがとうございます。

    キャンセル

+5

使用しているCPUあるいはGPUの構造を細かい部分(メモリ、レジスタ、演算回路など)を把握したうえでアセンブリ言語を扱っているのでしょうか?
逆にハードウェアの知識が浅いとアセンブリ言語は理解できないのでしょうか?

ここでいう「ハードウェア」が「メモリ、レジスタ、演算回路など」のCPU内部構成のことだとするなら、それが把握できなければアセンブラは使いこなせません。少なくとも、メモリやレジスタ関連は命令と直結しているので理解する必要があります。
それに加えて、もし高速化のためにアセンブラを使うのなら、キャッシュや命令パイプラインなどの仕組みも理解する必要があります。ただし、その辺は同じ命令セットのCPUでもメーカーや型番によって違いがあるので、ちゃんと把握していないと、あるCPUでは高速化したつもりが別のCPUではそれほどでもない(むしろパフォーマンス低下)という現象も起こり得ます。

そしてどちらにしてもなぜアセンブリ言語を使っているのか教えていただけると勉強になります。 

デバイスドライバーは別として、一般のアプリでアセンブラを使う理由は「高速化」ですね。
ただし、ロジックをアセンブラで組むのは今となってはナンセンスです。今時のCPUは内部構造が複雑化しているので、人間がアセンブラで効率的なプログラムを書くのは至難の業です(書けたとしてもその作業行程が超絶非効率です)。

では何のためにアセンブラを使うかというと「C/C++が言語でサポートしていない機能を利用する」ためです。一番判りやすいのがSIMD命令ですかね。x86でいうところのSSEやAVXです。組み込み関数の形(実態はインライン展開)で利用できるようになっています。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/22 00:34

    どうもありがとうございました。

    キャンセル

+4

僕がこのギョーカイに足突っ込んだ頃はフツーにやってました。
CPUもショボかったし、コンパイラの最適化がヘタクソなもんで、生成されたアセンブリをハンド・オプチマイズしてましたね。スピード欲しいとこは機械語で書いてCから呼び出すとか。

今はやらんですねぇ...コンパイラの方がイカした機械語吐いてくれたりするし、なにより開発効率が。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/18 15:59

    コンパイラの方がイカした機械語を吐き出すとの事ですが、吐き出した機械語を読んで内部で何が起きているかを分析するのですか?
    アセンブリ言語に変換するとか。

    キャンセル

  • 2018/02/18 16:55 編集

    多くのC/C++コンパイラはコンパイル・オプションでアセンブリ/機械語のどっちを吐くか選択できます。
    昔はコンパイラの最適化がアレだったので、一旦アセンブリで吐かせ手を加えたのちアセンブラに食わせて機械語作ったり、それが面倒ならCでインタフェースだけ用意してその中で機械語で書いたサブルーチンをcallしたりとか。

    キャンセル

  • 2018/02/19 14:50

    どうもありがとうございます。

    キャンセル

+2

最近はコンパイラがどんなコードを吐くかの確認のために、アセンブリは読むことはあっても書くことは殆ど無いですね。
ソフトウェアパイプラインを意識したアセンブリを普通の人が書くのはとても難しいです。

しかし、アセンブリが読めれば高速化のためにどんなプログラムを書けばよいかのヒントが得られるので勉強するのは有効だと思います。

また、組み込み分野では電源投入後のCPUのスタートアップルーチンを作るためにアセンブリで書くことが多いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/22 00:33

    どうもありがとうございます。

    キャンセル

+1

載せましたファイルを開くアセンブリ言語プログラムは使うCPUの構造をレジスタや細かいレベル(演算回路にデータをおくるレジスタなど、文字を表示するためのデータを送るレジスタなど)まで理解して作ったのですか? 

MS-DOSとは懐かしい...

INT 0X21 は機械語レベルのシステムコール。これによって呼び出された先に機能の本体がある。
Cで言うところの標準関数みたいなもんで、呼ぶ側はそんなに細かいこと知らなくていい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/23 00:47

    あの突如なのですが、リンカスクリプトとアセンブリ言語に関係はあるのでしょうか?

    キャンセル

  • 2018/02/23 07:49

    リンカスクリプト・・・その名の通り、アセンブラじゃなくて、リンカに対する指示ですね。私自身は手を入れた経験皆無で、どこにあるかも知らない、それでも通用するようだ。Cコンパイラ(が使うリンカ)とか開発環境が用意したデフォルトのもので間に合ってるんだと思う。

    キャンセル

  • 2018/02/23 09:40

    "直接”の関係はない。コンパイラ/アセンブラが生成するのは機械語とシンボル表。
    おなじみ HelloWorld.c をコンパイルして生成された.obj/.o には main() のナカミから作られた機械語。
    そして"main が定義された"と"printfを呼んでる"って情報、これがシンボル表。
    リンカはシンボル表をかき集めて"呼んでる"と"定義された"とを繋ぎあわせている。

    キャンセル

0

ファイル操作などの

それはOSのAPIを使うかないんだからアセンブリで直書きする必要が皆無

>C言語において勉強中なのですが、CPUなどを使いこなすのにアセンブリ言語を勉強している人などがいるなどの記述があったので気になりました。

SIMD化のことかな?でもそれでもintrinsic使うからアセンブリで頑張るのは過去の話じゃないかなと。

ただし、じゃあCを使えばそのへん意識しなくていいかといえば(高速化のためには)全くそんなことはないので、まあそういうことですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ハードウェアの知識が浅いとアセンブリ言語は理解できないのでしょうか?

そんな事はないでしょう。
アセンブリ言語の基本は

  • 2進数を理解する
  • メモリ。何ビット単位でアドレスがついているか、エンディアンはビッグかリトルか等
  • CPU内部にどんなレジスタがあるか
  • 各命令の動作を理解する

といった事です。レジスタもメモリも、要するに記憶場所であって、高級言語を学ぶときに変数や配列をイメージするのと本質的な違いはありません。各命令の動作を理解する上で2進数に関する理解は重要です。例えば AND, OR, NOT とか1の補数、2の補数、桁溢れなどが思いつきます。
これらはハードウェアを勉強しなくても理解できることばかりです。

なぜアセンブリ言語を使っているのか

当然ですが、コンパイラはCPUの各命令を平等に全て使うわけではなく、全く使わない命令もあります。コンパイラが扱わない特殊な命令・特別な命令列を使いたい場合があります。そのような特殊な部分を、アセンブリ言語で書いて関数化する、それを高級言語(普通はC言語)から利用する…ことは昔から行われてきました。例外処理などの特殊なライブラリ関数や、Cスタートアップルーチンもアセンブリ言語で書かれます。もっともコンパイラの守備範囲は昔より広がっていて、以前アセンブリ言語だった部分がC言語に置き換えられたケースも見ていますが。

最近の私の経験です。

  • 数年前、コンパイラ任せでなく性能を追求できないものかとゴリゴリ書き始めた時、まさしく特殊な命令・命令列を試すことになりました。趣味なので根性続かず中途半端で終わってます(今から再開しようかw)。
  • 先日たまたま、リンクエラー対策として、アセンブリ言語で提供されているCスタートアップルーチンに手を入れる機会がありました。Cでも対策可能でしたが、処理の本筋に関係ない部分であり、僅か数行の追加で済むことだったので。これは一応組込みのお仕事。

今、アセンブリ言語を使う仕事は本当に微々たる局面しか無いと思います。それでもアセンブリ言語を学ぶのは、ブラックボックスを解消し、コンピュータおよび言語処理系の動作原理を具体的に実感できる意義があると思います。オブジェクト指向も連想配列も何もかも…全て単純な命令の組み合わせで実現されているのだから。そうしたことを知るのは、やはり上手な利用につながるのではないですか。さらに、ハードウェアの理解が助けになる分野もあります。貴方が関係するとは限らないけど。

追記

CPUのハードを理解してからアセンブリ言語を使うのか、C言語をアセンブリ言語の出力にして…プログラムを作っているのか

コンパイラにアセンブリ言語を出力させて雛形・お手本にします。

  • CPUにどんなレジスタがあるか、確認するのは基本中の基本だが
  • 命令全てを覚える必要はない。命令解説、命令一覧、擬似命令一覧のような資料があれば十分。
  • 実用上、呼出規則(ABI)の確認は必須。規則を確認できる資料があれば安心確実ですが、関数に引数やreturn文、関数呼出し、グローバル変数等を含めておいてコンパイルしてみればかなりの情報が得られます。

プログラミング言語をひとつ使えるようになれば次の言語は楽に覚えられる、と同じで、アセンブラもひとつ経験すると別のアセンブラでも見当がつくようになります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/19 14:53

    ちなみに、レジスタレベルの理解ではCPUへの理解が浅いとの事ですが、CPUへの理解を深めるにはレジスタ以外に何を行えば良いのでしょうか?
    教えて頂けるとありがたいです。

    キャンセル

  • 2018/02/20 07:22

    前進しているのであれば結構。余計なお世話だったかもね。

    > レジスタレベルの理解ではCPUへの理解が浅いとの事ですが、

    いいえ、そういうつもりで言ったのではありません。アセンブリ言語を扱う条件として
    ・CPU内部にどんなレジスタがあるか
    という条件を挙げました。ターゲットCPUのレジスタを知らずにアセンブリ言語が分かるはずがない、と言ったのです。貴方はまだCPUのレジスタをちゃんと知らない、だからアセンブリ言語も扱えない、そういうレベルなのだろうと思ったからです。早とちりかもしれないけど。

    > CPUへの理解を深めるにはレジスタ以外に何を行えば良いのでしょうか?

    それに答える前に、お聞きしたい。
    CPUのレジスタは知っているのですか?
    アセンブリ言語の経験はいかほど?プログラムを読めますか?アセンブリ言語を書いた、或いはコンパイラが生成したコードに手を入れた事はありますか?

    キャンセル

  • 2018/02/21 02:51

    余計なお世話などではありません。返信いただけて嬉しいです。おっしゃる通り、使用しているCPUにどのようなレジスタが含まれているか理解できていません。データシートやサンプルプログラムをアセンブリ言語で出力させてどのような時にあるレジスタを使うのかなどを見ております。

    私が今のところアセンブリ言語を用いて取り組めた物はPICマイコンを用いてLチカとコイルガンをサイトをもとに自作した程度です。
    以上を作成してからブランクがあるため今からPICマイコンのアセンブリ言語を読むのに少し苦労するかもしれません。なので、読める、読めないで言えば、読めないに入るかもしれません。
    また、pcで簡単なhello wordプログラムをアセンブリ言語に変換してコードを手に入れた事はありますが、CPUでのアセンブリ言語は全く初めてであるため、入門からグダグダです。

    キャンセル

0

マイコンプログラミングの分野では、「アセンブリ言語を使わざるを得ない」場面が多々存在します。

例えば、スマートフォンなどで主流になっているArmマイコンでは、「電源を投入した直後に動作する部分」についてはアセンブリ言語で記述するしか方法がありません。また、マイコンを発売しているベンダーによっては「アセンブラは無償、Cコンパイラは有償」という形で提供していることもあり、そうしたものは費用的な問題でアセンブリ言語を選択することもあります。

質問で想定されている環境とは全く異なる回答だと思いますが、そういう世界もあるという話で。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

アセンブリ言語を使っている方にお聞きしたいのですが、使用しているCPUあるいはGPUの構造を細かい部分(メモリ、レジスタ、演算回路など)を把握したうえでアセンブリ言語を扱っているのでしょうか?

CPUの理解が必要です。GPUは扱いたいなら必要なのかもしれませんね。
私はGPUについてはなんらかのライブラリごしにしか触らないので一般知識くらいしか持ってませんけど

逆にハードウェアの知識が浅いとアセンブリ言語は理解できないのでしょうか?

最低限、対象CPUの知識が必要でしょう
遅延スロットなんかは知らない人が見たら難しいだろうなと思います

そしてどちらにしてもなぜアセンブリ言語を使っているのか教えていただけると勉強になります。

機械語の読み書きが人間には難しいのでアセンブリ言語を用います
コンパイラの出力は(一部例外を除き)機械語です。実行中のコードもまた機械語になります。
デバッガを用いてソースのない部分の処理などの機械語を理解したいときにアセンブリ言語を用いています。

書かないのか?と聞かれると面倒だからやりません。
どうしても特殊な命令の利用が必要ならばintrinsicを
どうしても任意の機械語が必要ならばCをコンパイラに食わせ、手を加える事を考えます。

--

 追記:2018/02/19 08:32への回答

CPUの構造をレジスタや細かいレベル(演算回路にデータをおくるレジスタなど、文字を表示するためのデータを送るレジスタなど)

普通のwindows等が動いてるCPUをx86互換CPUといいます。
intelが30年前に発売した「intel 80386」というCPUが語源です。
当然今の「Core iシリーズ」と中身はまるで別ものです。
ですが、16bitモードの機械語には互換性があります。
また、Core iのうちでもCoffee Lakeとsandy bridgeは違いますし、Core iとPentium4でも結構違いますが
機械語はほぼ一緒で、かなり高い互換性があります。
更にはAMDが出してる互換CPUなんかも、中身はやっぱり別物です。

つまり、CPUやプログラムというのは入力に対する出力さえ規定しておけば中身を必ずとも知る必要はないという事です。

ちなみにintelのマニュアルです。
私も全文(4670頁)は読めないので、不明な命令等を検索して使っています。

ファイルを開くアセンブリ言語プログラム

int 21hはwikipediaで調べるとMS-DOS APIへリダイレクトされることから分かる通りOSのAPIであり
win32apiと大きく変わるものじゃないです。
当時のcpuの事情から割り込みを使い、レジスタによる受け渡しだっただけです。
今では過去のもので、64bit Windowsでは呼び出す事もできません。

int 13hというBIOSが提供するAPIもありますが、(端的に言えば)OSによって呼び出しが禁止されます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

一般論でいえば、アセンブリを学ぶメリットは小さいです。コンパイラが対応している限り、高級言語で記述してからコンパイルするほうが普通です。アセンブラを使う利益があるとすれば以下の場合ぐらいに限られます。

1 コンパイラが対応していない。 2 処理速度、省メモリに拘りたい。 例外 出来上がったプログラムの解析

ケース1についてはアセンブラが唯一のプログラミング手段ですので、これは当然です。具体的な例としては組み込み系分野とかスーパーコンピュータの分野です。ただし、いずれも先端分野ですし、「誰かがコンパイラ作ったら、それ以降はあえてアセンブラを使うほどではない」、「コンパイラを作る人が現れないほど狭い分野を学ぶメリットは薄い」といった考え方もあります。

ケース2についても、やはり限定的です。ハードウェアの進歩が早く、技術が身に着く迄に技術が不要になっているとかザラです。

共通して言えることですが「少し待てば大抵メリットがなくなる」ということです。逆にデメリットが大きすぎる(手間が遙かに大きい、環境ごとに必要な知識が異なる等)のでとても割にあうとは思えません。例外として、セキュリティ分野とかデバッグのためのテクニックを学ぶことは利益があると思いますが、ここでの本題ではなさそうなので深く述べません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/21 05:01

    述べ忘れましたが、原理の勉強のためとかであれば価値はありますよ。あくまでも実用面においての意見です。

    キャンセル

  • 2018/02/21 19:22

    題名にメリットと書いてしまいましたが、ハードウェアを意識しながらアセンブリ言語やC言語が書けるならばデメリットであっても構いません。

    キャンセル

0

アセンブラでのプログラムは、レジスタ名等を直接使うので、そのレベルでは、プロセッサの構造を知らない限りプログラムできません。高位言語で、システムに準備されている関数等を知らずにプログラムできないのと同じ関係です。

勉強の方法は人それぞれだと思いますが、何の知識もないプロセッサのアセンブラをアセンブラの結果だけ見て理解するのは遠回りです。

アセンブラは、CPUの挙動を1ステップづつ記述するので、大部分のときは、CPUの動作とアセンブラの記述は1対1で対応付けることができます。
しかしながら、CPUの動作がその場の状況によって変化する場合は、アセンブラの記述はCPUの動作を記述できません。
割り込み処理、命令のリオーダー、キャッシュ、複数コア間の同期、レジスタのダイナミックな色塗り分岐予測などで、動作の推測が難しくなります。

>CPUの構造をレジスタや細かいレベル(演算回路にデータをおくるレジスタなど、文字を表示するためのデータを送るレジスタなど) 
CALSなどのモデルですよね。そのレベルでは、アセンブラは十分にCPUの動作を正確に記述でき、しかもたぶんCで書いてもアセンブラで記述してもそれほど性能差はでません。
産業用途では、確実に処理時間を一定にするためにキャッシュを使わない という手法もあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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