トップページ⇒tech
829コメント243KB

Cで書くかアセンブラで書くか・・・

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG

下手なアセンブラコードよりも、Cで書いてコンパイラに任せた方が速い場合もあります。
こういう場合はアセンブラで、こういう場合はCで書いた方がいいよという情報をみんなで交換していきましょう。


このスレはCあるいはC++の中で使用するアセンブラに特化したスレです。アセンブラの全般の話題はこちらへ

アセンブラ… (°Д°)ハァ?
http://pc5.2ch.net/test/read.cgi/tech/1093519463/l50
0153デフォルトの名無しさん2006/10/20(金) 11:02:16
>>152
たった4倍
10秒が40秒になるんだったら遅すぎて耐えられないだろうけど
1/100msecが4/100msecになったところでたいした変わらないだろ
0154デフォルトの名無しさん2006/10/20(金) 11:44:54
>>152
何が遅いって?
誰が何を耐えられないって?
0155デフォルトの名無しさん2006/10/20(金) 12:27:33
>>153
アホだろお前さんw
0156デフォルトの名無しさん2006/10/20(金) 12:44:37
>>155 アホ決定!!!
0157デフォルトの名無しさん2006/10/20(金) 13:30:26
>>155 は三国無比のアホ!!!
0158デフォルトの名無しさん2006/10/20(金) 14:53:23
>>153
もちろん10秒が40秒になるケースの話だろ。
こういうときアセンブラは役に立つ。
0159デフォルトの名無しさん2006/10/20(金) 19:20:26
呼出回数が多い部分はアセンブラで書くことを検討すべきだな。
0160デフォルトの名無しさん2006/10/21(土) 06:08:32
呼び出し回数を減らすのが先
0161デフォルトの名無しさん2006/10/21(土) 10:49:46
>>160
馬鹿の発想だね
まあ馬鹿でないのならまともなプログラマの発想とは思えん
まともじゃない、というのは理念的には正しくても非現実的ということだ。
0162デフォルトの名無しさん2006/10/21(土) 11:00:37
>>160 は空前絶後の馬鹿
0163デフォルトの名無しさん2006/10/21(土) 11:06:49
まあたぶん学生クンがアルゴリズムの講義で習ったことを
そのまま言ってるんだろうけどね。

もちろんアルゴリズム上の工夫で計算量を減らすのは用途によっては致命的重要だけど、
そんなのこの話の自明の前提だろうに。
0164デフォルトの名無しさん2006/10/24(火) 11:12:00
呼び出し回数を減らしても、一億回が五千万回にしかならないこともあるのだ。
一億回が27万回に減ったとしても、呼び出された部分を高速化することには意味がある。
0165デフォルトの名無しさん2006/10/24(火) 11:15:55
一億回が五千万回になるなら十分にやる価値はあると思うが
0166デフォルトの名無しさん2006/10/24(火) 11:37:23
呼び出し回数を減らした後の話じゃないのか?
0167デフォルトの名無しさん2006/10/25(水) 12:49:11
プロファイルして決めろ馬鹿ども
0168デフォルトの名無しさん2006/10/29(日) 19:33:14
呼び出し回数を減らすのはそもそも最初にやることだろ。
そんなことは自明なんだよ。
その上で最適化の必要があるのならやらないと。
0169デフォルトの名無しさん2006/11/07(火) 15:09:42
へたくそなCはアセンブラに劣る。
設計を知らない奴に何もできない。
0170デフォルトの名無しさん2006/11/22(水) 04:15:10
ロボットのプログラムって今でもアセンブラ?
0171デフォルトの名無しさん2006/11/22(水) 06:49:15
どのロボットだよ
0172デフォルトの名無しさん2006/11/22(水) 07:41:11
お前のことだよ
0173デフォルトの名無しさん2006/11/22(水) 08:10:58
はわわ〜わたしですか?
0174デフォルトの名無しさん2006/11/22(水) 08:40:11
10年前だけどCだったよ。
0175デフォルトの名無しさん2006/11/22(水) 08:44:24
MINDSTORMSはNQCとかRobot CとかCに似たのが多いな。
面白いやつだとドトネトのサブセット実装とか。
0176デフォルトの名無しさん2006/11/22(水) 17:43:38
カブロボはJavaだよ
0177デフォルトの名無しさん2007/01/02(火) 16:51:21
PICは Cよりもアセンブラで書くのが一般的なんですかね?
0178デフォルトの名無しさん2007/01/03(水) 01:10:49
インテル86系の話ね。
DISK-BIOS位だと、アセンブラで書いた方が小さくて速いコードが書けた。
しかし、先日MS-Windowsのディスクドライバを逆アセンブルしたら、ある意味で非
人間的な最適化が掛かっていてビックリした。
要は、バイト数の少ない命令を使うことと、分岐をできるだけ減らすことで高速化
(というか正確には分岐予測失敗によるパイプラインの乱れをなく)してあるんだ
が、人間だとこんなコト考えつくかよ、と思うような論理演算と算術演算を使って、
条件分岐をなくしてあった。
コンパイラも進化したものだね。
0179デフォルトの名無しさん2007/01/03(水) 02:37:08
やっぱPICマイコンには Cがいい?
0180デフォルトの名無しさん2007/01/10(水) 22:30:11
PICマイコンより78K使った方がいい。
0181デルフォトの名無しさん2007/02/11(日) 22:07:03
;************as_first.asm************
CODE SEGMENT
ASSUME cs:CODE,ds:CODE
ORG 100H

START: mov ah,09H ;文字列出力
mov dx,OFFSET MSG
int 21H

mov ah,4CH     ; 終了
int 21H

MSG BD "Hello World",ODH,OAH,'$'
CODE ENDS
END START

7、10、13行目でエラーが出るんだが何故だろう?
0182デフォルトの名無しさん2007/02/11(日) 22:22:19
>>181
全角スペースを表示できるエディタを使おう。
Oと0の判別し易いフォントを使おう。
擬似命令について勉強し直そう。
0183デフォルトの名無しさん2007/02/12(月) 10:00:36
これはひどい
0184デルフォトの名無しさん2007/02/12(月) 17:18:50
>>182
なるほど

>>183
お恥ずかしい
確かにひどい間違いやらかした
0185デフォルトの名無しさん2007/02/12(月) 17:25:59
うわ
0186デフォルトの名無しさん2007/02/22(木) 04:17:39
ゆたぽんフォントを使ってみては?
ttp://net2.system.to/pc/font.html
0187デフォルトの名無しさんNGNG?2BP(77)
age
0188デフォルトの名無しさん2007/04/09(月) 17:16:05
まぁ、OS作るのにはアセンブラのほうが良い
0189デフォルトの名無しさん2007/04/09(月) 17:47:17
んなこたーない。
0190デフォルトの名無しさん2007/04/10(火) 00:26:45
なにごともアセンブラで作れればそれに越したことはないんじゃないの
容量の制限やアセンブラにしか出来ないこと以外は生産性とのバランスの問題らよ。
0191デフォルトの名無しさん2007/04/10(火) 14:48:32
>>190
>生産性とのバランスの問題らよ。
が解っていながら
>容量の制限やアセンブラにしか出来ないこと以外は
この作為的な前提条件は一体。
0192デフォルトの名無しさん2007/04/10(火) 15:22:04
生産性は大して変わらないが移植性が明らかに落ちるのが問題
0193・∀・)っ-○◎●2007/04/15(日) 15:21:28
>生産性は大して変わらない

構造化されてないスパゲッティコードばっかし書く人ならそうだな
0194デフォルトの名無しさん2007/04/15(日) 19:16:13
>>193
馬鹿が背伸びして話題に参加することないのにw
192の言っていることは疑念の余地無く正しいし、それが分からないとしたら
アセンブラでコーディングしたことがないんだろうな。
0195・∀・)っ-○◎●2007/04/15(日) 19:39:43
>>194が背伸びしてる馬鹿であることは疑念の余地無いな。やったことないだろ。

他人のコードを読んだり、改修することまで視野に入れれば
処理系によっては構造化マクロがあるのは知ってるが

足し算を1行追加するのなんてたあいもないが、
アセンブリだと下手すりゃレジスタの割り当てを変え
しないといけないことだってある。

>アセンブラでコーディングしたことがないんだろうな。

ないよ。アセンブリ言語でコーディングはたまにやるけど。
アセンブラはバイナリコードの生成に使う。
0196デフォルトの名無しさん2007/04/17(火) 14:24:44
ダンゴ如きに同意なんぞしたくはないが、これには全面同意せざるを得ない。
0197デフォルトの名無しさん2007/04/17(火) 20:40:42
環境と規模による気も駿河。
レジスタが非常に直交性のいい奴か、逆にレジスタが非常に少ない奴だと
そのあたりを気にしなくていい(気にしようが無い)から慣れてればどんどん組んでいける。
いわゆる80系(Z80とか8086あたり)の奴が一番難しいんじゃないかな。
それでもダンプでデバッグできる人がいたりするから、
凄腕なら実は生産性が変わらなかったりして。

最近アセンブラレベルで扱う必要があった石が、これの両極端なんだよね。
片方はそもそも扱えるリソースが少ないのに直交性の高いレジスタが16個。
方や16bitのアキュムレータが二つ、インデックスが二つだけで選びようが無い。
当然PCやSPは別にあるけど。

関係ないが、仕事の回路図に乗っかってた32bitの石のデータシートを見たら、
レジスタセットがZ80の拡張で吹いた。まだこのアーキテクチャ生きてるんだ。
0198デフォルトの名無しさん2007/04/17(火) 21:10:46
一部の専門学校では現役のようです
http://pc11.2ch.net/test/read.cgi/tech/1161097445/464
0199デフォルトの名無しさん2007/04/17(火) 23:28:28
>>194
こいつアセンブラでしかコーディングしたことないのか

16bit時代のWindows3.0だってアセンブラで書かれているのはほんの一部でしかない。
明らかに移植性より生産性を重視しての選択だろ
アセンブリ言語はコードを書くための生産性もそうだが
バグつぶしにかかる時間が高級言語に比べ明らかに落ちる
0200・∀・)っ-○◎●2007/04/17(火) 23:38:11
アセンブラはやったことあるけど高級言語の苦手なロートルって
リアルで知ってる
0201デフォルトの名無しさん2007/04/17(火) 23:51:55
>>200
そういうロートルにSIMD書かせたらいいんじゃね?w

>>197
>それでもダンプでデバッグできる人がいたりするから、
特定のニモニックを覚えているだけのレベルなのか、
アセンブラ要らずのレベルを指しているのかによっても違うが。
0202デフォルトの名無しさん2007/04/18(水) 00:10:38
>>199
>明らかに移植性より生産性を重視しての選択だろ
ここは「移植性と生産性」って書かないと何の反論にもならないんじゃないの?
アセンブラのコードの移植性が高い、と言ってる人間が誰かいるか?

まあいいや。
さすがにアセンブラと、例えばCを比べたときに、
生産性や可読性がまったく変わらないとまではいえないけど、分野によっては
それほど大差がなかったりするのは経験上事実だと思う。
(逆にいうと、複雑なデータ構造をこねくりまわすようなプログラムは
確かにアセンブラでは辛い場合が多いとは思う。)

もちろんCみたいに文法の足枷がないぶん、ループや分岐といった「構造」が
浮き彫りになるようなコーディングスタイルをきっちり決めないとそういうわけには
いかないと思うけど。
02031992007/04/18(水) 00:24:31
>>202に反論するけど別に>>194に反論してる訳じゃないし
第三者的な位置から言ってみただけ
ちょっと>>194が狭い世界しか知らない風なのに
「馬鹿」呼ばわりしたのもムカついたし
それに>>192から逆上って読めば理解できるかと思ったから
あえてクドくかかなかっただけ。


02041992007/04/18(水) 00:38:59
ごめん今焼酎やりながら書いてるからなんか変になっちまったが
アセンブラの互換性の無さはは当たり前過ぎるし
昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
想像した上で、Cで書くメリットの中に移植性は眼中になかったと思ったからさ

まだ書いてること変かな?
0205デフォルトの名無しさん2007/04/19(木) 00:07:53
>>204
>昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
AlphaやMIPSやPowerPCのWindows NTのこともたまには思い出したあげて下さい・・・
0206・∀・)っ-○◎●2007/04/19(木) 00:30:34
箱○はWindows XP Embeded EditionのカスタムPPC64版が動いてる
0207デフォルトの名無しさん2007/04/19(木) 00:38:35
Windows CEのことも・・・あ、ドリームキャストは忘れてください。
0208デフォルトの名無しさん2007/04/19(木) 00:41:34
うちじゃ白黒二台とも現役なのに……
0209デフォルトの名無しさん2007/04/20(金) 12:58:46
>>208
黒って何だ?
#白はDreamCastなんだろうけど。
0210デフォルトの名無しさん2007/04/20(金) 13:25:36
サターンのことじゃないのか?あれOS載ってたっけ
0211デフォルトの名無しさん2007/04/20(金) 13:32:23
>>209
dreamcast R7
0212デフォルトの名無しさん2007/04/20(金) 15:35:30
PS3かとおもった<黒いの
0213デフォルトの名無しさん2007/04/20(金) 15:41:33
初代箱はWindows 2000のカスタム版だな
02142082007/04/21(土) 03:34:29
>>211
そそ。最後のチャンスと思って買ったのよね。
0215デフォルトの名無しさん2007/04/21(土) 08:38:56
俺がアセンブラを使った例

1、キャリー・ボローを利用する場合
   例:多倍長加算、DDA・DDS

2、回転系の命令を使いたい場合

3、32x32=64の掛け算を使いたい

4、コルーチン等のコンテクスト保存や飛ばしリターンなんかのテクニック
  windowsだとコルーチンは自前だとスタック複数確保とか綺麗に出来ないしスレッドで十分
  飛ばしリターンは例外で十分だろけどさ

5、PCだとRDTSC
0216デフォルトの名無しさん2007/04/21(土) 10:14:26
> 32x32=64の掛け算を使いたい
これは最適化で使ってくれるコンパイラもある。
0217デフォルトの名無しさん2007/04/21(土) 11:04:40
>>216
俺がそれを知ったのは、とあるCソースのコメント
0218デフォルトの名無しさん2007/04/21(土) 11:33:17
DDA Digital Differential Analyzer
DDS Direct Digital Synthesis ?
0219デフォルトの名無しさん2007/04/21(土) 11:38:25
32x32は1024だよな
0220デフォルトの名無しさん2007/04/21(土) 11:45:38
アセンブラスレなんだから 32x32は9C4かも判らんし1244かも判らん
そもそもxが何かも判らん

0221デフォルトの名無しさん2007/04/21(土) 11:48:22
32bit整数かける32bit整数の結果を64bit整数に保存する命令を使いたい、の意味だと受け取ったが
0222デフォルトの名無しさん2007/04/21(土) 17:30:48
そんなの解っててネタレスしてるんだろうが無粋な八目
0223デフォルトの名無しさん2007/04/21(土) 18:10:50
八目鰻は鰻じゃないらしいね。
0224デフォルトの名無しさん2007/04/21(土) 18:14:45
voidさんがいると聞いて飛んできました
0225デフォルトの名無しさん2007/04/22(日) 01:59:01
あれは魚のうちでもとりわけ下等な奴らしいぞ
0226デフォルトの名無しさん2007/04/22(日) 14:36:38
八目鰻の目は二つ
0227デフォルトの名無しさん2007/04/22(日) 22:06:28
メクラウナギってのは名前変えるんだっけ
0228デフォルトの名無しさん2007/04/22(日) 22:27:05
メクラ>227って名前になるらしい
0229デフォルトの名無しさん2007/04/22(日) 22:36:32
当然、「目の不自由な人のような鰻」となります。
0230デフォルトの名無しさん2007/04/23(月) 11:03:54
割り込みのレスポンスがシビアなときには、とりあえずのコードをCで書いて
コンパイラにアセンブラ吐き出させて手で最適化するのはよくやる。
主に出入り口のレジスタ退避を減らすとかだけどね。
俺の仕事ではブロック入出力が多いんで、コンパイラが当ててくれなかった
組み込みループ命令とかを使って組みなおすことも多い。
0231デフォルトの名無しさん2007/04/23(月) 12:15:57
SHなんかは、Cである程度最適化(構造体のサイズを届く範囲にするとか)した後、
吐かれたアセンブラを必死で最適化したつもりのコード(多少サイズは小さい)が
実行させたら元より遅くなってしまったり・・・・
0232デフォルトの名無しさん2007/04/23(月) 16:31:11
RISCマシンでアセンブラなんて、狂気の沙汰だ。
0233デフォルトの名無しさん2007/04/23(月) 16:54:21
VLIWはちょっとイヤだがRISCならいけるだろ
0234デフォルトの名無しさん2007/04/26(木) 08:17:06
レジスタ沢山持ってるCPUだと、
割り込みで大量にレジスタ保存するコストが大きく
かつC言語は、レジスタを大量に使うように最適化されているので、
割り込みはアセンブラで書かなければいけないという事になりがち・・・・という話かな >>230

>>231はSHは命令のロードとデータの読み書きを巧くCコンパイラなら配分してくれるが
自作だとコードが短くなってもパイプラインが乱れてストールする事になることもあるという事だろ
SHは型番でそのあたりの事情が違うから、そのあたりの最適化はコンパイラに任せた方がいい。
最近のSHはレジスタバンク持ってるから、割り込みもC言語でOK
0235デフォルトの名無しさん2007/05/30(水) 22:31:00
Cで書いたら変数型の制約がうっとうしくてやってられんような場面ではアセンブラ便利。
つーか先にアセンブラ覚えた人間がC使うと、厳格な変数型チェックにぶち切れることになる。
「杓子定規にも程があるだろこのお役所コンパイラがぁ〜〜〜〜!!」とか何度叫んだやら。

逆にCから覚えた奴がCの「初めに変数型ありき」の感覚でアセンブラ使っても
大して速くも短くもならんし、ほとんどメリット無いだろな…
0236デフォルトの名無しさん2007/05/30(水) 23:03:41
C言語程度の緩い型チェックでぶち切れるなよ
0237デフォルトの名無しさん2007/05/30(水) 23:56:29
俺なんかvoid*が怖くてしょうがないよ
0238デフォルトの名無しさん2007/05/31(木) 01:43:44
型チェックはバグを減らしてくれるよ
0239デフォルトの名無しさん2007/05/31(木) 01:57:44
警告だけはしてくれるわな。バグを減らすのは相変わらずプログラマの仕事だが。

ま、警告だけでも大助かりなんだけどね。
警告がでたら闇雲にキャストしてコンパイラを黙らせる輩の気が知れん。
0240デフォルトの名無しさん2007/05/31(木) 06:30:27
>>234
漏れはCの型チェックで切れたことは一度もないぞw
Javaと勘違いしてるんじゃないのか?
0241デフォルトの名無しさん2007/05/31(木) 17:34:21
なら、こういうことしなければならない面倒くささかな?
union U
{
  int i;
  unsigned char b[4];
};
0242デフォルトの名無しさん2007/05/31(木) 18:12:03
>>241
そんな環境依存コードを書くぐらいならはじめからアセンブラを使う
0243デフォルトの名無しさん2007/05/31(木) 18:15:51
そして>>235へ戻る
0244デフォルトの名無しさん2007/06/02(土) 10:09:40
>241
文字列の解析なんかだともっと顕著だよな。
一度に4バイト照合出来るCPUでも、
C言語は1バイトずつ4回比較しろって思想で作られてるから。
0245・∀・)っ-○◎●2007/06/02(土) 18:41:57
>>241
それビッグエンディアンじゃないと使い物にならん
0246デフォルトの名無しさん2007/06/02(土) 20:46:26
なんで?

エンディアンが問題になるのは違いが見つかるときだけだろ?

ほとんどのケースでは違いがないことの方が多い

全ファイルにまたがって違いがあるならそれを比較する意味すらない


0247ヒント: alignment2007/06/02(土) 20:48:04
馬鹿ばっかりだな
0248デフォルトの名無しさん2007/06/02(土) 20:50:21
そろそろ UTF-32 の議論に移るべきだと思う
0249デフォルトの名無しさん2007/06/02(土) 22:57:00
>>247
納期間近の夜中に泣きながら原因を探し回ってようやく気が付くんだからほうっといてあげようよ
0250・∀・)っ-○◎●2007/06/03(日) 00:05:22
>>246
strcmpは一致するかしないかだけじゃなくて、違う場合は大小値
リトルエンディアンだと大小値が必ずしも一致しない

"hage と samaを32ビット



0251・∀・)っ-○◎●2007/06/03(日) 00:09:30
ミスった

strcmpは、一致しない場合は正か負かの値でどっちが大きいかを表すように仕様で決まってる。
"hage" と "sama" を32ビット値として評価した場合
ビッグエンディアンでint32としてすると先頭が上位になるから後者のほうが大だから
strcmpの仕様通りになるが
リトルエンディアンだと先頭の方が下位になるから前者のほうが大
0252元組み込み屋2007/06/03(日) 00:31:55
>251
それこそ環境に依存しているんじゃないの?
共用体でプログラムを組む場合、それこそ限られた環境で動かすからあんまり当てはまらない
■ このスレッドは過去ログ倉庫に格納されています