1read 100read
2012年4月プログラム77: Cで書くかアセンブラで書くか・・・ (824)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
愛国Ruby (344)
「コンパイラ・スクリプトエンジン」相談室15 (417)
Objective-C [ObjC part:7]; (140)
七行プログラミング part6 (364)
【コボル】COBOL不要論【ただのDSLだよね?】 (331)
ExcelVBAで勤務表を作ろう (324)
Cで書くかアセンブラで書くか・・・
- 1 :04/09/30 〜 最終レス :12/04/30
-
下手なアセンブラコードよりも、Cで書いてコンパイラに任せた方が速い場合もあります。
こういう場合はアセンブラで、こういう場合はCで書いた方がいいよという情報をみんなで交換していきましょう。
このスレはCあるいはC++の中で使用するアセンブラに特化したスレです。アセンブラの全般の話題はこちらへ
アセンブラ… (°Д°)ハァ?
http://pc5.2ch.net/test/read.cgi/tech/1093519463/l50
- 2 :
- 速度はもう殆ど気にすることはなくなった。
速度が理由でアセンブラ使うことを検討したことはここ数年ないな。
アプリケーションプログラマだからこういう答になるけど、
サイズを気にする組み込み系だとまた話は違ってくるんだろうね。
- 3 :
- アセンブラ使うのは、Cでサポートされない部分を書く時くらいだな。
- 4 :
- OpenSSLはセンブリを上手く使ってるように思う。
- 5 :
- >速度はもう殆ど気にすることはなくなった
んなわけねー
- 6 :
- 思いつく限り
1.高速化のために使う場合
コンパイラがサポートしない特種命令を持つCPUの時、
もしくは命令スケジュール等が実質サポートできていない命令を使いたい時。
2.ハードウエアをキックする場合
オプティマイザがポートのキック順序を勝手に変えてしまい問題を引き起こしてしまう場合。
もしくはアクセスタイミングが正確でなければ動作しないハードをキックする場合。
3.割り込み関連のコードを書く場合
コンパイラがサポートしていないケースが多い。
4.言語間ブリッジを書く場合
二つの言語間インターフェイスを取れる言語はアセンブラのみ。
5.コンパイラそのものを作るとき
出力先にC等を使わないネイティブコンパイラには必須。
6.OSのような物を作る場合
スタック操作やスレッドの実現に使う。
プログラムのロード実行、その他自己書き換えのようなものを実現する場合。
以上
- 7 :
- アセン( ・Д・)ブルァ
- 8 :
- gccないでアセンブラを使うにはどうしたらよいのですか?
- 9 :
- asm
- 10 :
- >>8
inline-assemblerを使う
http://www-6.ibm.com/jp/developerworks/linux/010615/j_l-ia.html
- 11 :
- >>8
1:gcc内でアセンブラを使うには
2:gcc無いでアセンブラを使うには
- 12 :
- >>8
アセンブラのソース渡せばそのままアセンブルしてくれるだろ。
- 13 :
- 基本はハンドアセンブル
- 14 :
- alphaのアセンブラを学べるサイとか本を教えてください
- 15 :
- http://www.amazon.co.jp/exec/obidos/ASIN/4320026489/qid%3D1097292504/249-4699941-6264320
好きなだけ勉強するといい、このCPUに流行って欲しかったと心の底から思えるよ。
- 16 :
- 試作品みたいな名前だから人気も知名度もなさそうですね
- 17 :
- >>15
思わず完全無料ライブチャットの方をクリックしてしまった。
- 18 :
- >>16
>試作品みたいな名前
Alpha 知らないってのは痛いな。
- 19 :
- Alpha がゲーム機で復活してくれないかな
8bit/16bitの処理の遅さが弱点(命令セットを持っていない)と言われているけれど、
ゲームの場合は使わなきゃいいって選択肢があるからね。
- 20 :
- アルファはサーバ分野でひっそり生きてください
- 21 :
- ゲーム機には既にARMという最高のチップがある
- 22 :
- >>21
ARMは、そろそろ使用に耐えなくなる頃合だよん
- 23 :
- アセンブラを基礎から学べるサイトを教えてください
- 24 :
- 情報処理試験の仮想マシンでもやってな
- 25 :
- >>23
とりあえず↓これを読むのはどう?
http://www.amazon.co.jp/exec/obidos/ASIN/4822281019/qid%3D1099535689/249-2545910-7109969
- 26 :
- >>23
君へのおすすめはこっち
http://www.amazon.co.jp/exec/obidos/ASIN/4839909865/
- 27 :
- >>26
それ、面白そうだね。
電気回路知識がなくても大丈夫?
- 28 :
- 最適化を考える上でアセンブラを考慮するけど、殆どは「読む」だけ。
同じ処理の異なるロジックをCで一通り書いて、それをコンパイラでアセンブラコードに落として比較する。
これが一番確実で有効なアセンブラの利用法。
- 29 :
- gccのコードの中でアセンブラを使う場合、どの書式に則って書けばよいのでしょうか
- 30 :
- >>29
gccでコンパイルできる書式
つかマニュアルくらい嫁
- 31 :
- [ラベル:] 命令 アドレス [;コメント]<改行>
- 32 :
- 本当にアドレスでいいのか
貴方は
- 33 :
- いや、そりゃアドレスがレジスタを指すことも、アドレス部が無いこともあるけど、
>31は>29に対するしゃれだから
- 34 :
-
- 35 :
- パR/パチスロ特殊技術裏掲示板
http://jbbs.livedoor.jp/sports/19329/index.htm
- 36 :
- 細かい事考えずにnasm使えよ。
- 37 :
- アセンブラを学ぶにはどの本からはいるのがいい?
- 38 :
- >37
CPU書かんと答えようが無い。
- 39 :
- 6809
- 40 :
- 情報処理なんとか試験の教科書でいいんじゃない?
- 41 :
- そうなん?
- 42 :
- CASLはこれ使って実用的なものはほぼ作れないとはいえ、
その分仕様がシンプルだからね。勉強には良い。
- 43 :
- CASLって話には聞いたこと歩けど、使ったことないなぁ。
- 44 :
- CASLは使う物じゃなくて勉強する物だからね。
当たり前だけど、CPUによって命令がばらばら共通仕様が無い言語から
どのCPUにでもあるであろう命令のみをシンプルに集めた物。
- 45 :
- そこでCAP-Xですよ。
- 46 :
- bcbでアセンブラを使いたいのですが、何をそろえればよいのでしょうか?
- 47 :
- アセンブラの"IN"コマンドって何をするんですか?
エミュレーター8086で動かしてみたんですが、何も変わりません。
#make_COM#
SI1:
movdx,02FDh
mov ax,dx
testal,00000001b
jzSI1
movdx,02F8h
inax,dx
pushax
adddx,2
inax,dx
pushax
adddx,2
inax,dx
pushax
ret
- 48 :
- >>47
入力ポートからの読み込み。
つーか、そのくらいマニュアルに書いてあるが。
その例だと、0x2fdポートから読み込んだデータの最下位ビットが0の間ループし、
その後0x2f8ポート、0x2faポート、0x2fcポートから順次読み出してスタックに積み、
最後に積んだ結果のアドレスに戻ろうとしてアボーンする。
- 49 :
- てんきゅ!
- 50 :
- 内容:
Cコードからキーパッドを使って固定小数点をタイプし、
その打ち込んだ全ての固定小数点とその合計を足したものをLCDに
ディスプレイするという問題なのですが、以下のコードを書きました。
小数点をLCDにディスプレイする事は成功したんですが、その数字の
足した合計をディスプレイするのにてこずってます。
コードが多少長いですが、もし何か気づく点があったら指摘お願いします。
- 51 :
- void main(void)
{
char khar;
FILE *lcd;
unsigned char lcd_pos1=0xC3;
unsigned char lcd_pos2=0xCB;
lcd=stdprn;
setbuf(lcd,NULL);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD1);
fprintf(lcd,"%c%c",LCD_CMD,140);
do{
rt_yield();
khar=getch();
- 52 :
- if((x >= '0') && (x<='9'))
{
cprintf( "Sending %u ", x-'0');
}
else if ( x=='#')
{
dos_exit();
}
else if (x=='*')
{
fprintf(lcd,"%c%c",LCD_CMD,0xc);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD2);
fprintf(lcd,"%c%c",LCD_CMD,CLR_HOME);
fprintf(lcd,"%c%c",LCD_CMD,LCD_POS);
}
}while(1);
}
{
- 53 :
- {
int khar;
int sum = 0;
FILE *lcd;
unsigned char lcd_pos1=0xC3;
unsigned char lcd_pos2=0xCB;
lcd=stprn;
setbuf(lcd,NULL);
do{
rt_yield();
sum+=khar;
cprintf("%d",sum);
fprintf(lcd,"%c%c",LCD_CMD,0xc);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD2);
fprintf(lcd,"%c%c",LCD_CMD,CLR_HOME);
fprintf(lcd,"%c%c",LCD_CMD,LCD_POS);
}while(1);
}
- 54 :
- まるち (メ)!
- 55 :
- >>50
>気づく点
固定小数点って何? 固定小数点小数のこと?
合計の計算ができないのか、出力ができないのか、自力で分離できない?
そんな環境依存のコードを見せられても解析するのも面倒なんだけど。
#つーか、マルチかよ!
- 56 :
- うるせーたーこ。
- 57 :
- それが人に物聞く態度か?
甘ったれチャンは自己解決しろ(ぷ
- 58 :
- やっぱりローテート。なんで言語仕様に無いんだろ?
でも、符号無しを前提に、
#define C_ROR(u, n) sizeof(u) * 8 - (n) > 0 ? (u) >> (n) | (u) << (sizeof(u) * 8 - (n)): (u)
マクロで簡単に実装出来ちゃったりもする。
しかもnが定数だったりするとコンパイラのオプティマイズで三項演算コードも生成されない。
やっぱりローテート演算子要らないな。
- 59 :
- ローテートをサポートしているcの方言もあるけど、ワード/バイト内のローテートだけで
ROTATE with CARRY はまずないね。 欲しいのはこちらなんだけど。
ポートサンプリング処理などで、CY<--port, A<--byte, RRC/RLC A, byte<--A とやると
高速なコードにできるのだが、cだとシフトしてからportを判定して左端か右端をORするコード
にするしかない。
- 60 :
- >>47
(´-`).。oO(コマンド?)
- 61 :
- 初心者はアセンブラに手を出さない方がよいのでしょうか?
コンパイラの最適化よりなかなか速くなりません。
- 62 :
- >>61
まずはコンパイラの出力をさらに最適化することから始めれば良い
- 63 :
- >>61 たとえばこういうとこ。lifeboatのH83シリーズで
rxsft2 >>= 1; /* LSBファーストで受信 */
f( P8DR.0 ) rxsft2 |= 128;/* P80->CY, ROTXR.Bが欲しい */
これのASMコードが
MOV.B @rxsft2:24,R6L
SHLR.B R6L
MOV.B R6L,@rxsft2:24
BLD #0,@0xFFFFFFD7
BCC ?0019
MOV.B @rxsft2:24,R6L
OR.B #128,R6L
MOV.B R6L,@rxsft2:24
?0019:
- 64 :
- ポート8のbit0をrxsft2というchar変数に右シフトして取り込むコードだけど、
cでは上のように書くしかない。ASMにはROTATE with CARRY という命令があるから、
BLD #0,@FFFFFFD7 ;ポートからCYに読む
MOV.B @rxsft2:24,R6L
ROTXR.B R6L ;CY-->R6L右シフト-->LSBがCYに出て行く
MOV.B R6L,@rxsft2:24 ;これで同じ結果が得られる。
変数がワードでも同じ手法が使える。割り込み処理などぎりぎり速くしたい部分は
こういう書き方をするよ。
- 65 :
- >>6
7.バイナリ配布のソフトを弄らんとならんとき
- 66 :
- { void *code = ©_row;
__asm {
push edi
push esi
mov edi, dstp
mov esi, srcp
call dword ptr code
pop esi
pop edi
}
}
__asm {
pushfd ; Get original EFLAGS
pop eax
mov ecx, eax
xor eax, 200000h ; Flip ID bit in EFLAGS
push eax ; Save new EFLAGS value on stack
popfd ; Replace current EFLAGS value
pushfd ; Get new EFLAGS
pop eax ; Store new EFLAGS in EAX
xor eax, ecx ; Can not toggle ID bit,
jz done ; Processor=80486
mov has_CPUID,1 ; We have CPUID support
done:
}
この2つのアセンブリコードをCに直すにはどうすれば良いのでしょうか?環境はVS2005/Win32環境です。
- 67 :
- >>66
char a[] = {0x57,0x56,0xbf,0,0,0,0,0xbe,0,0,0,0,0xe8,0,0,0,0,0x5e,0x5f,0xc3};
*(void **)&a[3] = dstp;
*(void **)&a[8] = srcp;
*(int *)&a[13] = (char *)copy_row - &a[17];
((void (*)(void))a)();
char b[] = {0x9c,0x58,0x8b,0xc8,0x35,0x00,0x00,0x20,0x00,0x50,0x9d,0x9c,0x58,0x33,0xc1,0xc3};
if (((int (*)(void))b)()) has_CPUID = 1;
- 68 :
- >>67
どうもありがとうございます!
- 69 :
- 質問します!
ライブラリとかを複数の環境に対応するように作成するとき、
だいたい何種類ぐらいの環境に対応させるものですか?
たとえば
文字ライブラリや数学ライブラリを環境依存無くかつ高速で動作させるには、
アセンブラを使わざる終えないでしょうが、どんなCPUに対応しますか?
x86系CPU や Alpha の他にはなにがありますか?
- 70 :
- >>69
H8 と Z8000 と SX-8
- 71 :
- >>70
ありがとうございました。
一般的かつ平均的に5種類のCPU用にアセンブラをマスターすれば、
高速な汎用ライブラリをとりあえずは書けるということになりますね。
- 72 :
- >>71
なりません。
- 73 :
- Cとアセンブラで書いとけばほとんど賄える
- 74 :
- 俺はまだ、高級アセンブリ言語でしかWindowsプログラムを作れないが、
アセンブリ言語を学習してWindowsプログラムを作りたい。
- 75 :
- H8マイコン?
Z800016bit?
SX-8スパコン?
で、iMacのサポートは?ふつうはPCとWSで動けばいいじゃん。
- 76 :
- >>75
ポケコンとワンダースワン?
- 77 :
- PCとWSがターゲットのライブラリなら普通は高級言語で書くと思うが。
- 78 :
- ワンダースワンはV30MZ(16bit-x86互換)。
- 79 :
- C言語+Windows APIを使っているのですが、
最大化やウィンドウのリサイズを禁止するにはどうすればいいんでしょうか?
最小化はそのまま使えるようにしたいのですが…
- 80 :
- 最大化やリサイズのイベントを見張れば?
- 81 :
- つーか、マルチすなや。
- 82 :
- スレチガイかもしれないけど、
main(){
int a,b,*s=(int*)malloc(sizeof(int));
__asm{
mov eax,a;
add eax,b;
//ここが問題 sのアドレスへどうやってeaxの値をいれてやれば
//幸せになれますか?
}
printf("%d\n",*s);
return 0;
}
環境はVS2003 Win32とVS2005 Win64 デス
- 83 :
- モダンなコンパイラがやる以上のチューニングを
人手で出来るケースや能力ってかなり限定されてるんじゃないか?
- 84 :
- mov edx, s;
mov dword ptr [edx], eax;
- 85 :
- >>84
ありがとうございました。
- 86 :
- >>83
最新のインストラクションを使う場合は書かざるえないんですが。
- 87 :
- そうだね。
それだけだけど
- 88 :
- 俺の仕事のCPUにモダンなコンパイラなど無い
- 89 :
- 俺の仕事のCPUにモダンなCPUなど無い
- 90 :
- コンパイラぐらい書けよ
- 91 :
- 仕事なら
Cで書ける時は全てCで書く
どうしてもアセンブラじゃないと書けないときだけアセンブラで書く。
趣味なら
面白そうな方で書く
- 92 :
- Cで書くときでもC++コンパイラが使えるのならBetter CとしてC++を使う。
- 93 :
- >>90
コンパイラ書く手間工数に入れていい?
- 94 :
- おれも92のスタイル。
new,delete コンテナはできれば使いたい。
- 95 :
- 超音波をAD変換させてポート1に出力したいのですが
#include<3048.h>
void ioinit(void)
{
P1.DDR=0xff;
}
void adinit(void)
{
AD.ADCSR.BIT.ADF=0;
AD.ADCSR.BIT.SCAN=0;
AD.ADCSR.BIT.CKS=1;
AD.ADCSR.BIT.CH=0;
}
}
どこがいけないのでしょうか?
- 96 :
- 以上が課題の全文です。
よろしくお願いします。
- 97 :
- >>95-96
ここで聞いた方がいい
http://science4.2ch.net/test/read.cgi/denki/1133272478/
- 98 :
- >>95
3048.hの中身が分からない事には、何も言えません。
本の中身を、タイトルだけ見て当てろと言ってるのと同じだよ。
- 99 :
- >>98
>>97 のリンク先の人たちにとっては 3048.h の中身は stdio.h と同じくらい常識ですよ
- 100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
GCCについて part10 (194)
Visual Studio 2005 Part 27 (121)
おはよう (241)
Eclipse統合M32【Java/C++/Ruby/Python/Perl】 (799)
文字コード総合スレ part7 (617)
【3DS】プチコンを語るスレ【DSi】 (597)
--log9.info------------------
何でガンダムSEEDはいまだに大人気なのか 11 (485)
【ガンダムAGE】八頭身のウルフはキモイ (178)
シンとキラが嫌いな人のスレ (398)
機動戦士ガンダム00 視聴率を語るスレ Part23 (843)
ガンダム 1行リレー (127)
IDにFが出たらデカルトが風俗に行けるスレ (500)
IDにRが出たらユリンちゃんがリボンをくれるスレ (118)
【フレイ苦難】FCA-逆襲のフレイ-PHASE104【劇場版】 (376)
IDにPMがでたらセルゲイがポケモンをくれるスレ (119)
IDにDが付いたらディアッカが炒飯をくれるスレ30 (500)
IDにDTが出たらミーナが筆下ろししてくれるスレ (844)
ガンダムAGEの擁護って何円もらえるの? (100)
【勘違い】アスランpart41【被害妄想】 (483)
キラ・ヤマトを語るスレ 23 (383)
次のガンダム作品を妄想するスレ (146)
【ガンダムAGE】ユノア・アスノを語るスレ (535)
--log55.com------------------
映画館でアルバイト Screen61
【SV=退職者製造機】ベルシステム24札幌 PART24
関西交通量調査169
【池沼w】日野自動車古河工場【期間工】 Part.3
印西のカスミの魚屋でパートしているおばちゃん
ダイエースペースクリエイト【棚卸し】 Part.2
DHC物流部 バッチNo.1
【ロフト】Loftの黄色い人達12のじ目【社員(笑)】
-