Cで書くかアセンブラで書くか・・・
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG下手なアセンブラコードよりも、Cで書いてコンパイラに任せた方が速い場合もあります。
こういう場合はアセンブラで、こういう場合はCで書いた方がいいよという情報をみんなで交換していきましょう。
このスレはCあるいはC++の中で使用するアセンブラに特化したスレです。アセンブラの全般の話題はこちらへ
アセンブラ… (°Д°)ハァ?
http://pc5.2ch.net/test/read.cgi/tech/1093519463/l50
0153デフォルトの名無しさん
2006/10/20(金) 11:02:16たった4倍
10秒が40秒になるんだったら遅すぎて耐えられないだろうけど
1/100msecが4/100msecになったところでたいした変わらないだろ
0154デフォルトの名無しさん
2006/10/20(金) 11:44:54何が遅いって?
誰が何を耐えられないって?
0155デフォルトの名無しさん
2006/10/20(金) 12:27:33アホだろお前さんw
0156デフォルトの名無しさん
2006/10/20(金) 12:44:370157デフォルトの名無しさん
2006/10/20(金) 13:30:260158デフォルトの名無しさん
2006/10/20(金) 14:53:23もちろん10秒が40秒になるケースの話だろ。
こういうときアセンブラは役に立つ。
0159デフォルトの名無しさん
2006/10/20(金) 19:20:260160デフォルトの名無しさん
2006/10/21(土) 06:08:320161デフォルトの名無しさん
2006/10/21(土) 10:49:46馬鹿の発想だね
まあ馬鹿でないのならまともなプログラマの発想とは思えん
まともじゃない、というのは理念的には正しくても非現実的ということだ。
0162デフォルトの名無しさん
2006/10/21(土) 11:00:370163デフォルトの名無しさん
2006/10/21(土) 11:06:49そのまま言ってるんだろうけどね。
もちろんアルゴリズム上の工夫で計算量を減らすのは用途によっては致命的重要だけど、
そんなのこの話の自明の前提だろうに。
0164デフォルトの名無しさん
2006/10/24(火) 11:12:00一億回が27万回に減ったとしても、呼び出された部分を高速化することには意味がある。
0165デフォルトの名無しさん
2006/10/24(火) 11:15:550166デフォルトの名無しさん
2006/10/24(火) 11:37:230167デフォルトの名無しさん
2006/10/25(水) 12:49:110168デフォルトの名無しさん
2006/10/29(日) 19:33:14そんなことは自明なんだよ。
その上で最適化の必要があるのならやらないと。
0169デフォルトの名無しさん
2006/11/07(火) 15:09:42設計を知らない奴に何もできない。
0170デフォルトの名無しさん
2006/11/22(水) 04:15:100171デフォルトの名無しさん
2006/11/22(水) 06:49:150172デフォルトの名無しさん
2006/11/22(水) 07:41:110173デフォルトの名無しさん
2006/11/22(水) 08:10:580174デフォルトの名無しさん
2006/11/22(水) 08:40:110175デフォルトの名無しさん
2006/11/22(水) 08:44:24面白いやつだとドトネトのサブセット実装とか。
0176デフォルトの名無しさん
2006/11/22(水) 17:43:380177デフォルトの名無しさん
2007/01/02(火) 16:51:210178デフォルトの名無しさん
2007/01/03(水) 01:10:49DISK-BIOS位だと、アセンブラで書いた方が小さくて速いコードが書けた。
しかし、先日MS-Windowsのディスクドライバを逆アセンブルしたら、ある意味で非
人間的な最適化が掛かっていてビックリした。
要は、バイト数の少ない命令を使うことと、分岐をできるだけ減らすことで高速化
(というか正確には分岐予測失敗によるパイプラインの乱れをなく)してあるんだ
が、人間だとこんなコト考えつくかよ、と思うような論理演算と算術演算を使って、
条件分岐をなくしてあった。
コンパイラも進化したものだね。
0179デフォルトの名無しさん
2007/01/03(水) 02:37:080180デフォルトの名無しさん
2007/01/10(水) 22:30:110181デルフォトの名無しさん
2007/02/11(日) 22:07:03CODE 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全角スペースを表示できるエディタを使おう。
Oと0の判別し易いフォントを使おう。
擬似命令について勉強し直そう。
0183デフォルトの名無しさん
2007/02/12(月) 10:00:360185デフォルトの名無しさん
2007/02/12(月) 17:25:590186デフォルトの名無しさん
2007/02/22(木) 04:17:39ttp://net2.system.to/pc/font.html
0188デフォルトの名無しさん
2007/04/09(月) 17:16:050189デフォルトの名無しさん
2007/04/09(月) 17:47:170190デフォルトの名無しさん
2007/04/10(火) 00:26:45容量の制限やアセンブラにしか出来ないこと以外は生産性とのバランスの問題らよ。
0191デフォルトの名無しさん
2007/04/10(火) 14:48:32>生産性とのバランスの問題らよ。
が解っていながら
>容量の制限やアセンブラにしか出来ないこと以外は
この作為的な前提条件は一体。
0192デフォルトの名無しさん
2007/04/10(火) 15:22:040193・∀・)っ-○◎●
2007/04/15(日) 15:21:28構造化されてないスパゲッティコードばっかし書く人ならそうだな
0194デフォルトの名無しさん
2007/04/15(日) 19:16:13馬鹿が背伸びして話題に参加することないのにw
192の言っていることは疑念の余地無く正しいし、それが分からないとしたら
アセンブラでコーディングしたことがないんだろうな。
0195・∀・)っ-○◎●
2007/04/15(日) 19:39:43他人のコードを読んだり、改修することまで視野に入れれば
処理系によっては構造化マクロがあるのは知ってるが
足し算を1行追加するのなんてたあいもないが、
アセンブリだと下手すりゃレジスタの割り当てを変え
しないといけないことだってある。
>アセンブラでコーディングしたことがないんだろうな。
ないよ。アセンブリ言語でコーディングはたまにやるけど。
アセンブラはバイナリコードの生成に使う。
0196デフォルトの名無しさん
2007/04/17(火) 14:24:440197デフォルトの名無しさん
2007/04/17(火) 20:40:42レジスタが非常に直交性のいい奴か、逆にレジスタが非常に少ない奴だと
そのあたりを気にしなくていい(気にしようが無い)から慣れてればどんどん組んでいける。
いわゆる80系(Z80とか8086あたり)の奴が一番難しいんじゃないかな。
それでもダンプでデバッグできる人がいたりするから、
凄腕なら実は生産性が変わらなかったりして。
最近アセンブラレベルで扱う必要があった石が、これの両極端なんだよね。
片方はそもそも扱えるリソースが少ないのに直交性の高いレジスタが16個。
方や16bitのアキュムレータが二つ、インデックスが二つだけで選びようが無い。
当然PCやSPは別にあるけど。
関係ないが、仕事の回路図に乗っかってた32bitの石のデータシートを見たら、
レジスタセットがZ80の拡張で吹いた。まだこのアーキテクチャ生きてるんだ。
0198デフォルトの名無しさん
2007/04/17(火) 21:10:46http://pc11.2ch.net/test/read.cgi/tech/1161097445/464
0199デフォルトの名無しさん
2007/04/17(火) 23:28:28こいつアセンブラでしかコーディングしたことないのか
16bit時代のWindows3.0だってアセンブラで書かれているのはほんの一部でしかない。
明らかに移植性より生産性を重視しての選択だろ
アセンブリ言語はコードを書くための生産性もそうだが
バグつぶしにかかる時間が高級言語に比べ明らかに落ちる
0200・∀・)っ-○◎●
2007/04/17(火) 23:38:11リアルで知ってる
0201デフォルトの名無しさん
2007/04/17(火) 23:51:55そういうロートルにSIMD書かせたらいいんじゃね?w
>>197
>それでもダンプでデバッグできる人がいたりするから、
特定のニモニックを覚えているだけのレベルなのか、
アセンブラ要らずのレベルを指しているのかによっても違うが。
0202デフォルトの名無しさん
2007/04/18(水) 00:10:38>明らかに移植性より生産性を重視しての選択だろ
ここは「移植性と生産性」って書かないと何の反論にもならないんじゃないの?
アセンブラのコードの移植性が高い、と言ってる人間が誰かいるか?
まあいいや。
さすがにアセンブラと、例えばCを比べたときに、
生産性や可読性がまったく変わらないとまではいえないけど、分野によっては
それほど大差がなかったりするのは経験上事実だと思う。
(逆にいうと、複雑なデータ構造をこねくりまわすようなプログラムは
確かにアセンブラでは辛い場合が多いとは思う。)
もちろんCみたいに文法の足枷がないぶん、ループや分岐といった「構造」が
浮き彫りになるようなコーディングスタイルをきっちり決めないとそういうわけには
いかないと思うけど。
0203199
2007/04/18(水) 00:24:31第三者的な位置から言ってみただけ
ちょっと>>194が狭い世界しか知らない風なのに
「馬鹿」呼ばわりしたのもムカついたし
それに>>192から逆上って読めば理解できるかと思ったから
あえてクドくかかなかっただけ。
0204199
2007/04/18(水) 00:38:59アセンブラの互換性の無さはは当たり前過ぎるし
昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
想像した上で、Cで書くメリットの中に移植性は眼中になかったと思ったからさ
まだ書いてること変かな?
0205デフォルトの名無しさん
2007/04/19(木) 00:07:53>昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
AlphaやMIPSやPowerPCのWindows NTのこともたまには思い出したあげて下さい・・・
0206・∀・)っ-○◎●
2007/04/19(木) 00:30:340207デフォルトの名無しさん
2007/04/19(木) 00:38:350208デフォルトの名無しさん
2007/04/19(木) 00:41:340209デフォルトの名無しさん
2007/04/20(金) 12:58:46黒って何だ?
#白はDreamCastなんだろうけど。
0210デフォルトの名無しさん
2007/04/20(金) 13:25:360211デフォルトの名無しさん
2007/04/20(金) 13:32:23dreamcast R7
0212デフォルトの名無しさん
2007/04/20(金) 15:35:300213デフォルトの名無しさん
2007/04/20(金) 15:41:330215デフォルトの名無しさん
2007/04/21(土) 08:38:561、キャリー・ボローを利用する場合
例:多倍長加算、DDA・DDS
2、回転系の命令を使いたい場合
3、32x32=64の掛け算を使いたい
4、コルーチン等のコンテクスト保存や飛ばしリターンなんかのテクニック
windowsだとコルーチンは自前だとスタック複数確保とか綺麗に出来ないしスレッドで十分
飛ばしリターンは例外で十分だろけどさ
5、PCだとRDTSC
0216デフォルトの名無しさん
2007/04/21(土) 10:14:26これは最適化で使ってくれるコンパイラもある。
0217デフォルトの名無しさん
2007/04/21(土) 11:04:40俺がそれを知ったのは、とあるCソースのコメント
0218デフォルトの名無しさん
2007/04/21(土) 11:33:17DDS Direct Digital Synthesis ?
0219デフォルトの名無しさん
2007/04/21(土) 11:38:250220デフォルトの名無しさん
2007/04/21(土) 11:45:38そもそもxが何かも判らん
0221デフォルトの名無しさん
2007/04/21(土) 11:48:220222デフォルトの名無しさん
2007/04/21(土) 17:30:480223デフォルトの名無しさん
2007/04/21(土) 18:10:500224デフォルトの名無しさん
2007/04/21(土) 18:14:450225デフォルトの名無しさん
2007/04/22(日) 01:59:010226デフォルトの名無しさん
2007/04/22(日) 14:36:380227デフォルトの名無しさん
2007/04/22(日) 22:06:280228デフォルトの名無しさん
2007/04/22(日) 22:27:050229デフォルトの名無しさん
2007/04/22(日) 22:36:320230デフォルトの名無しさん
2007/04/23(月) 11:03:54コンパイラにアセンブラ吐き出させて手で最適化するのはよくやる。
主に出入り口のレジスタ退避を減らすとかだけどね。
俺の仕事ではブロック入出力が多いんで、コンパイラが当ててくれなかった
組み込みループ命令とかを使って組みなおすことも多い。
0231デフォルトの名無しさん
2007/04/23(月) 12:15:57吐かれたアセンブラを必死で最適化したつもりのコード(多少サイズは小さい)が
実行させたら元より遅くなってしまったり・・・・
0232デフォルトの名無しさん
2007/04/23(月) 16:31:110233デフォルトの名無しさん
2007/04/23(月) 16:54:210234デフォルトの名無しさん
2007/04/26(木) 08:17:06割り込みで大量にレジスタ保存するコストが大きく
かつC言語は、レジスタを大量に使うように最適化されているので、
割り込みはアセンブラで書かなければいけないという事になりがち・・・・という話かな >>230
>>231はSHは命令のロードとデータの読み書きを巧くCコンパイラなら配分してくれるが
自作だとコードが短くなってもパイプラインが乱れてストールする事になることもあるという事だろ
SHは型番でそのあたりの事情が違うから、そのあたりの最適化はコンパイラに任せた方がいい。
最近のSHはレジスタバンク持ってるから、割り込みもC言語でOK
0235デフォルトの名無しさん
2007/05/30(水) 22:31:00つーか先にアセンブラ覚えた人間がC使うと、厳格な変数型チェックにぶち切れることになる。
「杓子定規にも程があるだろこのお役所コンパイラがぁ〜〜〜〜!!」とか何度叫んだやら。
逆にCから覚えた奴がCの「初めに変数型ありき」の感覚でアセンブラ使っても
大して速くも短くもならんし、ほとんどメリット無いだろな…
0236デフォルトの名無しさん
2007/05/30(水) 23:03:410237デフォルトの名無しさん
2007/05/30(水) 23:56:290238デフォルトの名無しさん
2007/05/31(木) 01:43:440239デフォルトの名無しさん
2007/05/31(木) 01:57:44ま、警告だけでも大助かりなんだけどね。
警告がでたら闇雲にキャストしてコンパイラを黙らせる輩の気が知れん。
0240デフォルトの名無しさん
2007/05/31(木) 06:30:27漏れはCの型チェックで切れたことは一度もないぞw
Javaと勘違いしてるんじゃないのか?
0241デフォルトの名無しさん
2007/05/31(木) 17:34:21union U
{
int i;
unsigned char b[4];
};
0242デフォルトの名無しさん
2007/05/31(木) 18:12:03そんな環境依存コードを書くぐらいならはじめからアセンブラを使う
0243デフォルトの名無しさん
2007/05/31(木) 18:15:510244デフォルトの名無しさん
2007/06/02(土) 10:09:40文字列の解析なんかだともっと顕著だよな。
一度に4バイト照合出来るCPUでも、
C言語は1バイトずつ4回比較しろって思想で作られてるから。
0246デフォルトの名無しさん
2007/06/02(土) 20:46:26エンディアンが問題になるのは違いが見つかるときだけだろ?
ほとんどのケースでは違いがないことの方が多い
全ファイルにまたがって違いがあるならそれを比較する意味すらない
0247ヒント: alignment
2007/06/02(土) 20:48:040248デフォルトの名無しさん
2007/06/02(土) 20:50:210249デフォルトの名無しさん
2007/06/02(土) 22:57:00納期間近の夜中に泣きながら原因を探し回ってようやく気が付くんだからほうっといてあげようよ
0250・∀・)っ-○◎●
2007/06/03(日) 00:05:22strcmpは一致するかしないかだけじゃなくて、違う場合は大小値
リトルエンディアンだと大小値が必ずしも一致しない
"hage と samaを32ビット
0251・∀・)っ-○◎●
2007/06/03(日) 00:09:30strcmpは、一致しない場合は正か負かの値でどっちが大きいかを表すように仕様で決まってる。
"hage" と "sama" を32ビット値として評価した場合
ビッグエンディアンでint32としてすると先頭が上位になるから後者のほうが大だから
strcmpの仕様通りになるが
リトルエンディアンだと先頭の方が下位になるから前者のほうが大
0252元組み込み屋
2007/06/03(日) 00:31:55それこそ環境に依存しているんじゃないの?
共用体でプログラムを組む場合、それこそ限られた環境で動かすからあんまり当てはまらない
■ このスレッドは過去ログ倉庫に格納されています