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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3312閲覧

C18でのインラインアセンブラについて

fujimon7111

総合スコア30

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/03/31 09:06

C18でインラインアセンブラができるのは知っているのですが、処理速度はどの程度速くなるのでしょうか?

足し算1回だけやPICのポートへの出力をアセンブリで書くと1サイクルでも処理を短縮できますか?

アセンブリ言語は全く知らない素人ですが教えてください

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

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

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

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

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

guest

回答3

0

ベストアンサー

なるでしょう,とはお答えできますが,定量的にどのくらい早くなりますか?と聞かれると分かりません.
Cコンパイラがマシンコードに書き直すコードよりも簡潔に書けばそのステート分だけ早くなります.

安全性が同じですか?って聞かれると多分違うでしょうね.

足し算1回と行っても,それが1バイトなのか2バイトなのか,符号付きなのかそうでないのか,桁落ち,桁あふれしたらどうするのか,というのをアセンブリならばすべて配慮しなくてはなりません.
C言語ならばその辺をおおよそ処理系としてまとめてありますので…

たとえばPICのポートのアドレスをインクリしながらアクセスしようとする場合,ライブラリからの操作であれば,その引数の妥当性も配慮してあるかもしれません.

アセンブリコードならばそこも配慮する必要があります.

が,このポートの値を読む!このポートに値を書き込む!というだけならばライブラリを通すよりも早い,とこんな具合です.

PICじゃないですが,Arduinoなんかはライブラリ経由すると18~20ステートかかるのでマイコンのクロックに追従したフリップフロップなんか夢のまた夢ですが,アセンブリコードだと1サイクルステートでアクセスできるのでそちらを使う,なんて高速化手段は用います.

安全性と高速性のバランスをどのへんで取るか,と言ったところでしょうかね?
(液晶パネルにprintfで数値を表示するような場合,アセンブリで高速化しよう!なんてすれば多分血反吐吐く羽目になりますけど…)

投稿2016/03/31 11:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

アセンブラで、最適化したコードを書く能力のある人間がコードを書けば、
確かに、Cコンパイラの出力する結果よりも早く動くコードが書けると思います。
また、下手をすると、コンパイラの出力より遅いコードになる事もあります。

また、「必要?」という疑問があります。

自分は、長い間仕事で、コードを書いていますが、最近では「速度」の為に、
アセンブラを使う事は、ありません。
後で、他の人がメンテナンスする事が困難になるからです。

また、スピードを求める場合、局部の1クロックよりも、アルゴリズム全体を
改良した方が、効果が大きいからです。

最近、自分がアセンブラを使うのは、RAMのチェック処理で、RAMを一切使わない
で処理を書く必要がある場合とか、ROMの全領域チェックを行うプログラム自身が
そのROMに書かれているので、自分自身をRAMに引っ越しして、ROMのチェックを
行い、その後ROMのコードを書き戻す処理を作る場合などです。

ただ、アセンブラを勉強事自体は、良いと思います。
コンピュータがどうやって動いているかをより深く知ることができると思いますよ。

投稿2016/04/01 13:01

ShinyaAnan

総合スコア241

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

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

fujimon7111

2016/04/03 16:24

能力のある人間がコードを書けば>> 確かにそうですね何個か書いて計ってみたいと思います(勉強として)
guest

0

C18でインラインアセンブラができるのは知っているのですが、
処理速度はどの程度速くなるのでしょうか?
足し算1回だけやPICのポートへの出力をアセンブリで書くと
1サイクルでも処理を短縮できますか?

と、問う前に、
cコンパイラの、
単純な演算ルーチンコードでの、
最適化有り、最適化無しでの、アセンブリソースと
インラインコードでの、アセンブリソースを見比べてみてください。
但し、その結果は、局所的な物であって、全体としての数字ではありません。
cの処理系によっては、処理系のアセンブリ出力を見ながら、
コードの内容を変更するなどの処置で、実行コード量が変化する事もあります。
c&ライブラリを使う場合と、主としてアセンブラを使う場合の、
分岐点的な物はありますが、場合によります。
ざっくりであれば、実行コードが、64K / 128K を超える辺りからは、cが有利です。
ROM 容量8k 未満の場合は、アセンブラの使用を検討した方が、良い場合が多いです。
MCUを使う場合、フラッシュ製品だけではなく、
まず、仕様と、MCUのROM容量を考慮します。(忘れがちなのが、将来拡張があるかないか)
私の場合は、
ライブラリ含めて、MCUのROMに収まり、時間要因、物理的要因に支障が無いのであれば、
cや、開発ツールがサポートしているプラットフォームで、行います。
割込み等の部分で、時間要因等が発生した場合は、その部分のみ、アセンブラの使用を検討します。
ライブラリが過大であれば、ライブラリをカスタマイズして、ダイエットします。
それでも、ダメだなぁという場合は、アセンブラでその部分を書いてしまったり、
ライブラリを差し替えたり、最終手段として、MCUの変更を考えます。
現在では、PIC でも、プロトタイプ系のツールが使える場合もあるので、
試作機→製品確認機→製品機 などの手順での場合に、
プロトタイプ系を使ったりもします。
試作機:プロトタイプ系でロジックや、機能を確認
確認機:コスト含め、c / assembler / プロタイプ系 どうするか決めたり

投稿2016/04/01 02:00

daive

総合スコア2028

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問