1 :
デフォルトの名無しさん :
04/09/30 02:24:11
速度はもう殆ど気にすることはなくなった。 速度が理由でアセンブラ使うことを検討したことはここ数年ないな。 アプリケーションプログラマだからこういう答になるけど、 サイズを気にする組み込み系だとまた話は違ってくるんだろうね。
3 :
デフォルトの名無しさん :04/09/30 07:40:12
アセンブラ使うのは、Cでサポートされない部分を書く時くらいだな。
4 :
デフォルトの名無しさん :04/09/30 14:20:13
OpenSSLはセンブリを上手く使ってるように思う。
>速度はもう殆ど気にすることはなくなった んなわけねー
思いつく限り 1.高速化のために使う場合 コンパイラがサポートしない特種命令を持つCPUの時、 もしくは命令スケジュール等が実質サポートできていない命令を使いたい時。 2.ハードウエアをキックする場合 オプティマイザがポートのキック順序を勝手に変えてしまい問題を引き起こしてしまう場合。 もしくはアクセスタイミングが正確でなければ動作しないハードをキックする場合。 3.割り込み関連のコードを書く場合 コンパイラがサポートしていないケースが多い。 4.言語間ブリッジを書く場合 二つの言語間インターフェイスを取れる言語はアセンブラのみ。 5.コンパイラそのものを作るとき 出力先にC等を使わないネイティブコンパイラには必須。 6.OSのような物を作る場合 スタック操作やスレッドの実現に使う。 プログラムのロード実行、その他自己書き換えのようなものを実現する場合。 以上
アセン( ・Д・)ブルァ
8 :
デフォルトの名無しさん :04/10/01 11:13:36
gccないでアセンブラを使うにはどうしたらよいのですか?
9 :
デフォルトの名無しさん :04/10/01 11:46:46
asm
>>8 1:gcc内でアセンブラを使うには
2:gcc無いでアセンブラを使うには
>>8 アセンブラのソース渡せばそのままアセンブルしてくれるだろ。
基本はハンドアセンブル
14 :
デフォルトの名無しさん :04/10/09 12:23:03
alphaのアセンブラを学べるサイとか本を教えてください
試作品みたいな名前だから人気も知名度もなさそうですね
>>15 思わず完全無料ライブチャットの方をクリックしてしまった。
>>16 >試作品みたいな名前
Alpha 知らないってのは痛いな。
Alpha がゲーム機で復活してくれないかな 8bit/16bitの処理の遅さが弱点(命令セットを持っていない)と言われているけれど、 ゲームの場合は使わなきゃいいって選択肢があるからね。
アルファはサーバ分野でひっそり生きてください
ゲーム機には既にARMという最高のチップがある
>>21 ARMは、そろそろ使用に耐えなくなる頃合だよん
23 :
デフォルトの名無しさん :04/11/04 11:23:41
アセンブラを基礎から学べるサイトを教えてください
情報処理試験の仮想マシンでもやってな
25 :
デフォルトの名無しさん :04/11/04 11:37:24
27 :
デフォルトの名無しさん :04/11/04 21:57:00
>>26 それ、面白そうだね。
電気回路知識がなくても大丈夫?
最適化を考える上でアセンブラを考慮するけど、殆どは「読む」だけ。 同じ処理の異なるロジックをCで一通り書いて、それをコンパイラでアセンブラコードに落として比較する。 これが一番確実で有効なアセンブラの利用法。
29 :
デフォルトの名無しさん :04/11/09 17:35:09
gccのコードの中でアセンブラを使う場合、どの書式に則って書けばよいのでしょうか
>>29 gccでコンパイルできる書式
つかマニュアルくらい嫁
[ラベル:] 命令 アドレス [;コメント]<改行>
本当にアドレスでいいのか 貴方は
いや、そりゃアドレスがレジスタを指すことも、アドレス部が無いこともあるけど、 >31は>29に対するしゃれだから
34 :
デフォルトの名無しさん :04/11/22 16:29:41
35 :
デフォルトの名無しさん :04/12/07 03:22:22
細かい事考えずにnasm使えよ。
37 :
デフォルトの名無しさん :05/02/03 05:04:00
アセンブラを学ぶにはどの本からはいるのがいい?
38 :
デフォルトの名無しさん :05/02/03 05:13:49
>37 CPU書かんと答えようが無い。
6809
40 :
デフォルトの名無しさん :05/02/03 20:48:59
情報処理なんとか試験の教科書でいいんじゃない?
そうなん?
CASLはこれ使って実用的なものはほぼ作れないとはいえ、 その分仕様がシンプルだからね。勉強には良い。
CASLって話には聞いたこと歩けど、使ったことないなぁ。
CASLは使う物じゃなくて勉強する物だからね。 当たり前だけど、CPUによって命令がばらばら共通仕様が無い言語から どのCPUにでもあるであろう命令のみをシンプルに集めた物。
そこでCAP-Xですよ。
46 :
デフォルトの名無しさん :05/03/05 03:00:28
bcbでアセンブラを使いたいのですが、何をそろえればよいのでしょうか?
47 :
デフォルトの名無しさん :2005/04/04(月) 13:28:37
アセンブラの"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
>>47 入力ポートからの読み込み。
つーか、そのくらいマニュアルに書いてあるが。
その例だと、0x2fdポートから読み込んだデータの最下位ビットが0の間ループし、
その後0x2f8ポート、0x2faポート、0x2fcポートから順次読み出してスタックに積み、
最後に積んだ結果のアドレスに戻ろうとしてアボーンする。
49 :
デフォルトの名無しさん :2005/04/04(月) 14:23:07
てんきゅ!
50 :
デフォルトの名無しさん :2005/04/04(月) 16:13:32
内容: Cコードからキーパッドを使って固定小数点をタイプし、 その打ち込んだ全ての固定小数点とその合計を足したものをLCDに ディスプレイするという問題なのですが、以下のコードを書きました。 小数点をLCDにディスプレイする事は成功したんですが、その数字の 足した合計をディスプレイするのにてこずってます。 コードが多少長いですが、もし何か気づく点があったら指摘お願いします。
51 :
デフォルトの名無しさん :2005/04/04(月) 16:18:58
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 :
デフォルトの名無しさん :2005/04/04(月) 16:19:28
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 :
デフォルトの名無しさん :2005/04/04(月) 16:19:55
{ 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 :
デフォルトの名無しさん :2005/04/04(月) 16:37:15
まるち (メ)!
>>50 >気づく点
固定小数点って何? 固定小数点小数のこと?
合計の計算ができないのか、出力ができないのか、自力で分離できない?
そんな環境依存のコードを見せられても解析するのも面倒なんだけど。
#つーか、マルチかよ!
56 :
デフォルトの名無しさん :2005/04/04(月) 17:42:21
うるせーたーこ。
それが人に物聞く態度か? 甘ったれチャンは自己解決しろ(ぷ
やっぱりローテート。なんで言語仕様に無いんだろ? でも、符号無しを前提に、 #define C_ROR(u, n) sizeof(u) * 8 - (n) > 0 ? (u) >> (n) | (u) << (sizeof(u) * 8 - (n)): (u) マクロで簡単に実装出来ちゃったりもする。 しかもnが定数だったりするとコンパイラのオプティマイズで三項演算コードも生成されない。 やっぱりローテート演算子要らないな。
ローテートをサポートしているcの方言もあるけど、ワード/バイト内のローテートだけで ROTATE with CARRY はまずないね。 欲しいのはこちらなんだけど。 ポートサンプリング処理などで、CY<--port, A<--byte, RRC/RLC A, byte<--A とやると 高速なコードにできるのだが、cだとシフトしてからportを判定して左端か右端をORするコード にするしかない。
61 :
デフォルトの名無しさん :2005/05/15(日) 09:42:57
初心者はアセンブラに手を出さない方がよいのでしょうか? コンパイラの最適化よりなかなか速くなりません。
>>61 まずはコンパイラの出力をさらに最適化することから始めれば良い
>>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 :
63 :2005/05/16(月) 04:50:58
ポート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 ;これで同じ結果が得られる。 変数がワードでも同じ手法が使える。割り込み処理などぎりぎり速くしたい部分は こういう書き方をするよ。
>>6 7.バイナリ配布のソフトを弄らんとならんとき
66 :
デフォルトの名無しさん :2005/05/28(土) 20:48:10
{ 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環境です。
>>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;
69 :
デフォルトの名無しさん :2005/05/30(月) 05:56:47
質問します! ライブラリとかを複数の環境に対応するように作成するとき、 だいたい何種類ぐらいの環境に対応させるものですか? たとえば 文字ライブラリや数学ライブラリを環境依存無くかつ高速で動作させるには、 アセンブラを使わざる終えないでしょうが、どんなCPUに対応しますか? x86系CPU や Alpha の他にはなにがありますか?
71 :
デフォルトの名無しさん :2005/05/30(月) 07:01:22
>>70 ありがとうございました。
一般的かつ平均的に5種類のCPU用にアセンブラをマスターすれば、
高速な汎用ライブラリをとりあえずは書けるということになりますね。
Cとアセンブラで書いとけばほとんど賄える
俺はまだ、高級アセンブリ言語でしかWindowsプログラムを作れないが、 アセンブリ言語を学習してWindowsプログラムを作りたい。
75 :
デフォルトの名無しさん :2005/05/31(火) 08:50:01
H8マイコン? Z800016bit? SX-8スパコン? で、iMacのサポートは?ふつうはPCとWSで動けばいいじゃん。
PCとWSがターゲットのライブラリなら普通は高級言語で書くと思うが。
ワンダースワンはV30MZ(16bit-x86互換)。
79 :
デフォルトの名無しさん :2005/06/26(日) 03:44:03
C言語+Windows APIを使っているのですが、 最大化やウィンドウのリサイズを禁止するにはどうすればいいんでしょうか? 最小化はそのまま使えるようにしたいのですが…
最大化やリサイズのイベントを見張れば?
つーか、マルチすなや。
スレチガイかもしれないけど、 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 :
デフォルトの名無しさん :2005/11/20(日) 23:56:49
モダンなコンパイラがやる以上のチューニングを 人手で出来るケースや能力ってかなり限定されてるんじゃないか?
mov edx, s; mov dword ptr [edx], eax;
>>83 最新のインストラクションを使う場合は書かざるえないんですが。
そうだね。 それだけだけど
俺の仕事のCPUにモダンなコンパイラなど無い
俺の仕事のCPUにモダンなCPUなど無い
コンパイラぐらい書けよ
仕事なら Cで書ける時は全てCで書く どうしてもアセンブラじゃないと書けないときだけアセンブラで書く。 趣味なら 面白そうな方で書く
Cで書くときでもC++コンパイラが使えるのならBetter CとしてC++を使う。
おれも92のスタイル。 new,delete コンテナはできれば使いたい。
95 :
デフォルトの名無しさん :2005/12/05(月) 15:15:01
超音波を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; } } どこがいけないのでしょうか?
以上が課題の全文です。 よろしくお願いします。
>>95 3048.hの中身が分からない事には、何も言えません。
本の中身を、タイトルだけ見て当てろと言ってるのと同じだよ。
>>98 >>97 のリンク先の人たちにとっては 3048.h の中身は stdio.h と同じくらい常識ですよ
>>99 じゃあそのスレで質問しろ。
状況判断能力のない奴だ。
101 :
デフォルトの名無しさん :2005/12/06(火) 11:25:17
(・∀・)ニヤニヤ
>>95 3048.hってもしかしてルネサスのCPUじゃない?
ADってA→Dコンバートだから入力なんだが・・・
全然、知らないけど、 超音波装置:電圧出力 → AD変換でデジタル値に変換 そのデジタル値を出力ってこと? デジタルの出力ってどんなの?
>>95 > どこがいけないのでしょうか?
お前の無能力
>>103 普通は
DA変換でデジタル値をアナログ電圧に変換 → 超音波装置:電圧入力
>>106 >>95 はADコンバートのスキャン開始を設定しているだけ
H8/3048のAD端子にかかっている電圧を一定時間毎に
デジタル値に変換してCPUの内部レジスタに転送してくれる機能が
あるんだけど、それを作動させたにすぎない
無論、超音波なんて出ない
>>109 つーことはあなたと私と二人で会話をしていたわけか・・・
E・∇・ヨノシ <111ゲット♫
↑ばーか
優れたトップというのは、なかなか常人には理解できないもの。そういうトップのもとでは出世一つとってみても、 なかなか難しいものであるし、出世できたとしても真正面からトップと対峙するので、さらに仕事は難しくなる。 その典型例として、現実の世界を例にとるとあまりにドロドロした話となってしまうので、「宇宙戦艦ヤマト」にお けるデスラー総統とヒス副総統(将軍)の関係から、どういった処方があるのかを見ていきましょう。
「宇宙戦艦ヤマト」の内容については、いちいちここでは取り上げません。 ヤマトの敵方として設定されている大ガミラス帝国は、デスラー総統を絶 対的指導者としている独裁国家です。設定そのものの多くをナチスドイツ に求めることができるので、そういったものだという理解があれば十分です。 その絶対的指導者の副官としてヒスという人物があるのですが、おそらく 彼は天賦の才で副官に登りつめたのではなく、官僚的な指導者層の中から この地位を得たと思われ、組織的な根回しには向いているが、対外的な 処方についてはあまり得意ではないように感ずる人物です。 まずは、この二人のやり取りから行ってみましょう。
太陽系を脱出したヤマトは、ガミラス絶対防衛圏にさしかかる。そこで、それまで小事と考えられて きたヤマトについて、デスラー総統に経過を説明する必要が生じた。説明担当はもちろん、副官的 位置付けにあったヒス将軍(当時は副総統ではなかった)。 ヒス 「ヤマトの愚かな航海ぶりについてご説明いたします。」 と切り出し、地球から太陽系脱出までの概略について説明し、その説明途中で、 ヒス 「木星にある我が前線をピストルで撃破…」 という表現を用います。すると、すかさずデスラー総統は、 デスラー 「ヒス君、ピストルだったかねぇ。」 ヒス 「は、波動砲とやらですが、私の目にはピストルみたいなもので…」 デスラー 「君の感想はいらん。事実だけを報告しなさい。」
というやりとりで、ご機嫌取りの様子がありありと伺えるヒス将軍の説明を揶揄します。 実際、ビジネスの現場でも見られるやり取りですね。ということで、ヒス将軍はその後 の説明を「ようするに〜」とあっさり終わらさざる得ず、せっかく用意していたであろう 台本は意味を失します。そこで、すかさずフォロゥに入ったタラン将軍(「さらば宇宙戦艦ヤマト」 では、デスラーのいい副官としての登場だったが、本作ではドメル将軍軍事裁判等で あまり良い印象はない)。総統の名をいただいたというデスラー機雷の説明を行い、最後に タラン 「ヤマトが紙飛行機よりも脆く燃え果てる様を、夕食後の座興に総統に お楽しみいただきたく、ご連絡申し上げたわけでございます。」 と、ヤマト航海経過の報告から、デスラー機雷によるヤマト殲滅の説明へと鮮やかに 話題を転換(ヒス将軍からタラン将軍への主役交代)。デスラーの損ねた機嫌を 回復しようとします。それに対しデスラーも、 デスラー 「いや、ありがとうタラン将軍。面白いアトラクションを用意してくれて 今宵の酒は一段と味がよいだろう。」 と返します。そして、やや不満が残りながらも次の言葉を続けます。
デスラー 「諸君、宇宙戦艦ヤマトの無事を祈って乾杯しようではないか。」 と。しかし、この言葉が終わらぬうちに、ある将軍は急に馬鹿笑いをはじめ、 某将軍 「はっはっはっはっはっ…、ヤマトの無事を祈ってか、これは面白い。 総統も相当冗談がお好きで…。はっはっはっはっはっ…」 と顰蹙を買う行為を始めたのです。これでは、せっかくフォロゥを入れたタラン将軍の 苦労も水の泡。哀れ、自業自得とはいえ、この将軍は抹殺されてしまったのです。 ヒス将軍によって損なわれた機嫌が、何とかタラン将軍のフォロゥで良くはなった。 しかし、完全ではなく、ヒス将軍に対する不満は下品な男(デスラー総統評)に すべて被さる結果となったものの、しこりが残ったのは間違いないと見ていいでしょう。
そして、せっかくのご機嫌取りのデスラー機雷によるヤマト封じ込めは失敗。 この一部始終をビデオモニタで鑑賞していたデスラー総統は、 デスラー 「ヤマトの最期が見られなかったが、結構楽しいショウだった。諸君! 私への心遣い、深く感謝しよう。私はゆっくり眠りにつくとしよう。おやすみ、諸君。」 と精一杯の強がりを言った後、 デスラー 「あぁ、ヒス君。ヤマトの艦長は何と言ったかね?」 ヒス 「オキタ…、でございますが。」 デスラー 「オキタか、お見事だったと祝電を打ってやってくれ。デスラーの名でな。」 ヒス 「はい、デスラー総統。」 というやりとりで、ヤマト艦長沖田に『ヤマト諸君の健闘をたたえる。今後の対決が楽しみだ。 ガミラス総統デスラー』という内容の祝電を打ったのです(ヤマトでは、祝電の発信源を なぜ捉えなかったのかと沖田艦長が相原を叱責する場面がある。こういうこだわりが当時としては凄かった)。
ヒス将軍は、なぜヤマトに祝電を打ったのかというデスラーの真意は伝わっていないでしょう。 それが証拠に、デスラー機雷突破後のデスラー自らが考案した作戦が失敗したときの以下の やりとりから、それを十分に汲み取ることができます。 (デスラーの寝室に報告に上がるヒス将軍。) デスラー 「な・に・ご・とだね、ヒス君。まぁ、入りたまえ。」 ヒス 「はぁ。(しばしの沈黙)。総統、ヤマトのことで…。」 デスラー 「ヤマトなぞの最期を報告せんでいいと言った筈だ。」 ヒス 「いえ、それが……。切り抜けました。」 デスラー 「なにぃっ!」 ヒス 「総統のガスはコロナの中におびき寄せられ焼き尽くされました。ヤマトは前に立ちはだかるコロナを波動砲で粉砕し、見事な作戦です。艦長オキタに祝電を打ちましょう。」 デスラー 「祝電? ヒス将軍、君はバカかね?」 ヒス 「はぁっ?」 デスラー 「もういい、戻って休みたまえ。」 ヒス 「はっ! 総統、ばんざい!」 どこがどう、ということは敢えて指摘しませんが、こういう部下を持つ上司は辛いと 感ずるところです。では、優れた対応とはどういうものなのか。それは、ドメル将軍 凱旋の時のデスラーとのやり取りの中に見ることができます。短いやり取りながら、 デスラーの意を十分に汲んだやり取りだといえましょう。
ドメル 「総統、ちょっと小耳に挟んだのですが、ヤマトは冥王星基地を破り、太陽系から外へ出てきた。」 デスラー 「ふっふっふ、目下、銀河系をうろうろしてるようだがな。暇つぶしにからかってやったのだ。」 ドメル 「総統、よろしければ私が捻り取ってまいりましょう。」 デスラー 「はっはっ、また君に勲章が一つ増えるだけだろうが、ま、休養半分で軽くやってきてもらおうか。」 ドメル 「はっ、かしこまりました。」 これである。 ドメル将軍凱旋後、ヤマト撃破はドメル将軍の担当となる。バラン星での作戦が失敗し、責任を問われる ドメル将軍は軍事法廷で死刑を宣告される(軍事法廷の責任担当はヒス副総統)。その判決の署名を デスラー総統に持ち込むヒス副総統だったが相手にされず、判決書は破り捨てられ、ドメル将軍に 男としての最後のチャンスを与えた。 一方、ガミラス本星での戦いで、勝ち目のない戦いに和平を進言したヒス副総統は、デスラーに 射殺される(珍しくまともな進言だったのに)。もし、和平を進言したのがヒス副総統でなく、 亡きドメル将軍だったなら結果は同じといえるだろうか。 「宇宙戦艦ヤマト」というのは、お話であるからあまりそういったことを考えても仕方がないことかもしれない。 だが、しかし、たかがお話だからこそ見えるもの、示唆できるものがあるのも事実だろう。 所詮、社会は人付き合い。そういったものなのだから、教訓として得られるものであれば積極的に吸収していきたいものだ。
121 :
デフォルトの名無しさん :2006/04/17(月) 22:39:54
パチンコ&スロット解析用ソケット
メイン基盤上のチップLE2080,2280,4280のプログラムが
市販品のロムライターで読み込みできます。
確率や連チャンの仕組みが一目瞭然!
攻略法はあなた自身で見つける時代です。
http://www.3-you.com/
保守
123 :
デフォルトの名無しさん :2006/06/12(月) 16:54:11
アセンブラって今時使う意味あるの?SSEだって、コンパイラが自動的に使ってくれるというのに、 使うとしたらどんな時?
124 :
デフォルトの名無しさん :2006/06/12(月) 17:08:11
この処理は全体の90%で登場するからとかいうケース
>>123 何で PC (しかも x86) 前提?
>>123 前人未到なトリッキーアルゴリズムを実装するとき。
コンパイラがAI積んだエキスパートシステムになる時代がくるまでは
まだまだ人間の頭脳が役立つ時はある。
趣味の話しだけどCが苦痛の人もいます アセンブラの方がやりやすくてイライラする そういう場合に使う
>>127 きみ なんさい?
おじさんに こっそり おしえてよ。
先週、アセンブラでチューニングしたら、コンパイラの吐いたコードの四倍の速さで処理が終わったよ。 処理がいっぱいいっぱいだったのにCPUのHALT期間が七割くらいになったんでそれなりの省電力も。
>>129 それなんてダメコンパイラ?
まさか最適化の指定をしてないなんて落ちじゃないよな。
>>130 実はしていない。
最適化するとエラーでコンパイルが通らなくなる駄目コンパイラなんだよ。まじで。
あー、言っておくが、下手すると現時点で俺しか使ってないかもしれないようなマイナーCPUでのこと。 このたびめでたくCPUがディスコンになる運びだ。
そんなコンパイラは窓から投げ…… あ、ディスコンなのね。
>>128 俺は年齢より、>127 の日本語歴が気になる。
137 :
デフォルトの名無しさん :2006/08/14(月) 09:31:08
単純計算のCのソースと、それをそのままインラインアセンブラに書き換えたソースとを 実行速度で比較して、「ほらこんなに違うでしょ」という良い例あるかな。
138 :
デフォルトの名無しさん :2006/08/14(月) 09:36:48
自動ベクトル化の性能って、今はどうなの? コレが出来ない限り人間じゃなきゃ出来ない最適化って多そうな。 ベクトル化されたクラスを使えば少しはよくなったりするのかね。
漏れ程度のアセンブラの知識では、iccの自動ベクタ化を上回る速度は出なかったよ。 まぁ、人間ならではの分岐予測やループ回数予測はできるけどね。 #でもそれらはプロファイリング最適化やプラグマ指定でも同じことができるわけだけど。 少なくともループの中身だけをインラインアセンブラ化しても全く太刀打ちできないと思う。
>>137 Z80辺りなら殆どアセンブリの勝ちだな
スタックフレームまで展開してくれるコンパイラがあれば話は別だが
141 :
デフォルトの名無しさん :2006/10/12(木) 02:43:18
はげ
142 :
デフォルトの名無しさん :2006/10/13(金) 16:18:52
C言語をアセンブラに変換するにはどうすればいいですか?? はじめたばかりなので分かりやすくお願いします.
マルチなのはいけないと思います
>>137 実際試したわけじゃないが、たとえばbyteを上下のニブルに対応するASCIIコードに
変換する関数なんかは、アセンブラなら十進補正命令使って効率よく書けるけど
Cのコンパイラでそこまで知恵が回る奴はないだろうな。
147 :
デフォルトの名無しさん :2006/10/19(木) 01:02:30
コンパイラを作るのにアセンブラって必要なの?
必要ではない
149 :
デフォルトの名無しさん :2006/10/20(金) 01:21:25
いまさらアセンブラを勉強して何になるの? 組み込み系のしごとでなけりゃ、使うことねーよ。
>>149 趣味の人は大いに役立つ。
ていうかC言語の理解の助けにもなる。
チートコードとか?
152 :
デフォルトの名無しさん :2006/10/20(金) 10:53:49
>>149 32bit同士の掛け算は結果が64bitになる。
Cでも書けるが時間が4倍かかってしまう。
これは遅すぎて耐えられない。
153 :
デフォルトの名無しさん :2006/10/20(金) 11:02:16
>>152 たった4倍
10秒が40秒になるんだったら遅すぎて耐えられないだろうけど
1/100msecが4/100msecになったところでたいした変わらないだろ
>>152 何が遅いって?
誰が何を耐えられないって?
>>153 もちろん10秒が40秒になるケースの話だろ。
こういうときアセンブラは役に立つ。
呼出回数が多い部分はアセンブラで書くことを検討すべきだな。
呼び出し回数を減らすのが先
>>160 馬鹿の発想だね
まあ馬鹿でないのならまともなプログラマの発想とは思えん
まともじゃない、というのは理念的には正しくても非現実的ということだ。
まあたぶん学生クンがアルゴリズムの講義で習ったことを そのまま言ってるんだろうけどね。 もちろんアルゴリズム上の工夫で計算量を減らすのは用途によっては致命的重要だけど、 そんなのこの話の自明の前提だろうに。
呼び出し回数を減らしても、一億回が五千万回にしかならないこともあるのだ。 一億回が27万回に減ったとしても、呼び出された部分を高速化することには意味がある。
一億回が五千万回になるなら十分にやる価値はあると思うが
呼び出し回数を減らした後の話じゃないのか?
プロファイルして決めろ馬鹿ども
呼び出し回数を減らすのはそもそも最初にやることだろ。 そんなことは自明なんだよ。 その上で最適化の必要があるのならやらないと。
へたくそなCはアセンブラに劣る。 設計を知らない奴に何もできない。
170 :
デフォルトの名無しさん :2006/11/22(水) 04:15:10
ロボットのプログラムって今でもアセンブラ?
どのロボットだよ
お前のことだよ
はわわ〜わたしですか?
10年前だけどCだったよ。
MINDSTORMSはNQCとかRobot CとかCに似たのが多いな。 面白いやつだとドトネトのサブセット実装とか。
カブロボはJavaだよ
PICは Cよりもアセンブラで書くのが一般的なんですかね?
インテル86系の話ね。 DISK-BIOS位だと、アセンブラで書いた方が小さくて速いコードが書けた。 しかし、先日MS-Windowsのディスクドライバを逆アセンブルしたら、ある意味で非 人間的な最適化が掛かっていてビックリした。 要は、バイト数の少ない命令を使うことと、分岐をできるだけ減らすことで高速化 (というか正確には分岐予測失敗によるパイプラインの乱れをなく)してあるんだ が、人間だとこんなコト考えつくかよ、と思うような論理演算と算術演算を使って、 条件分岐をなくしてあった。 コンパイラも進化したものだね。
やっぱPICマイコンには Cがいい?
PICマイコンより78K使った方がいい。
181 :
デルフォトの名無しさん :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行目でエラーが出るんだが何故だろう?
>>181 全角スペースを表示できるエディタを使おう。
Oと0の判別し易いフォントを使おう。
擬似命令について勉強し直そう。
これはひどい
184 :
デルフォトの名無しさん :2007/02/12(月) 17:18:50
うわ
187 :
デフォルトの名無しさん :2007/04/09(月) 15:20:54 BE:203011182-2BP(77)
age
まぁ、OS作るのにはアセンブラのほうが良い
んなこたーない。
なにごともアセンブラで作れればそれに越したことはないんじゃないの 容量の制限やアセンブラにしか出来ないこと以外は生産性とのバランスの問題らよ。
>>190 >生産性とのバランスの問題らよ。
が解っていながら
>容量の制限やアセンブラにしか出来ないこと以外は
この作為的な前提条件は一体。
生産性は大して変わらないが移植性が明らかに落ちるのが問題
>生産性は大して変わらない 構造化されてないスパゲッティコードばっかし書く人ならそうだな
>>193 馬鹿が背伸びして話題に参加することないのにw
192の言っていることは疑念の余地無く正しいし、それが分からないとしたら
アセンブラでコーディングしたことがないんだろうな。
>>194 が背伸びしてる馬鹿であることは疑念の余地無いな。やったことないだろ。
他人のコードを読んだり、改修することまで視野に入れれば
処理系によっては構造化マクロがあるのは知ってるが
足し算を1行追加するのなんてたあいもないが、
アセンブリだと下手すりゃレジスタの割り当てを変え
しないといけないことだってある。
>アセンブラでコーディングしたことがないんだろうな。
ないよ。アセンブリ言語でコーディングはたまにやるけど。
アセンブラはバイナリコードの生成に使う。
ダンゴ如きに同意なんぞしたくはないが、これには全面同意せざるを得ない。
環境と規模による気も駿河。 レジスタが非常に直交性のいい奴か、逆にレジスタが非常に少ない奴だと そのあたりを気にしなくていい(気にしようが無い)から慣れてればどんどん組んでいける。 いわゆる80系(Z80とか8086あたり)の奴が一番難しいんじゃないかな。 それでもダンプでデバッグできる人がいたりするから、 凄腕なら実は生産性が変わらなかったりして。 最近アセンブラレベルで扱う必要があった石が、これの両極端なんだよね。 片方はそもそも扱えるリソースが少ないのに直交性の高いレジスタが16個。 方や16bitのアキュムレータが二つ、インデックスが二つだけで選びようが無い。 当然PCやSPは別にあるけど。 関係ないが、仕事の回路図に乗っかってた32bitの石のデータシートを見たら、 レジスタセットがZ80の拡張で吹いた。まだこのアーキテクチャ生きてるんだ。
>>194 こいつアセンブラでしかコーディングしたことないのか
16bit時代のWindows3.0だってアセンブラで書かれているのはほんの一部でしかない。
明らかに移植性より生産性を重視しての選択だろ
アセンブリ言語はコードを書くための生産性もそうだが
バグつぶしにかかる時間が高級言語に比べ明らかに落ちる
アセンブラはやったことあるけど高級言語の苦手なロートルって リアルで知ってる
>>200 そういうロートルにSIMD書かせたらいいんじゃね?w
>>197 >それでもダンプでデバッグできる人がいたりするから、
特定のニモニックを覚えているだけのレベルなのか、
アセンブラ要らずのレベルを指しているのかによっても違うが。
>>199 >明らかに移植性より生産性を重視しての選択だろ
ここは「移植性と生産性」って書かないと何の反論にもならないんじゃないの?
アセンブラのコードの移植性が高い、と言ってる人間が誰かいるか?
まあいいや。
さすがにアセンブラと、例えばCを比べたときに、
生産性や可読性がまったく変わらないとまではいえないけど、分野によっては
それほど大差がなかったりするのは経験上事実だと思う。
(逆にいうと、複雑なデータ構造をこねくりまわすようなプログラムは
確かにアセンブラでは辛い場合が多いとは思う。)
もちろんCみたいに文法の足枷がないぶん、ループや分岐といった「構造」が
浮き彫りになるようなコーディングスタイルをきっちり決めないとそういうわけには
いかないと思うけど。
203 :
199 :2007/04/18(水) 00:24:31
>>202 に反論するけど別に
>>194 に反論してる訳じゃないし
第三者的な位置から言ってみただけ
ちょっと
>>194 が狭い世界しか知らない風なのに
「馬鹿」呼ばわりしたのもムカついたし
それに
>>192 から逆上って読めば理解できるかと思ったから
あえてクドくかかなかっただけ。
204 :
199 :2007/04/18(水) 00:38:59
ごめん今焼酎やりながら書いてるからなんか変になっちまったが アセンブラの互換性の無さはは当たり前過ぎるし 昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと 想像した上で、Cで書くメリットの中に移植性は眼中になかったと思ったからさ まだ書いてること変かな?
>>204 >昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
AlphaやMIPSやPowerPCのWindows NTのこともたまには思い出したあげて下さい・・・
箱○はWindows XP Embeded EditionのカスタムPPC64版が動いてる
Windows CEのことも・・・あ、ドリームキャストは忘れてください。
うちじゃ白黒二台とも現役なのに……
>>208 黒って何だ?
#白はDreamCastなんだろうけど。
サターンのことじゃないのか?あれOS載ってたっけ
PS3かとおもった<黒いの
初代箱はWindows 2000のカスタム版だな
214 :
208 :2007/04/21(土) 03:34:29
>>211 そそ。最後のチャンスと思って買ったのよね。
215 :
デフォルトの名無しさん :2007/04/21(土) 08:38:56
俺がアセンブラを使った例 1、キャリー・ボローを利用する場合 例:多倍長加算、DDA・DDS 2、回転系の命令を使いたい場合 3、32x32=64の掛け算を使いたい 4、コルーチン等のコンテクスト保存や飛ばしリターンなんかのテクニック windowsだとコルーチンは自前だとスタック複数確保とか綺麗に出来ないしスレッドで十分 飛ばしリターンは例外で十分だろけどさ 5、PCだとRDTSC
> 32x32=64の掛け算を使いたい これは最適化で使ってくれるコンパイラもある。
>>216 俺がそれを知ったのは、とあるCソースのコメント
DDA Digital Differential Analyzer DDS Direct Digital Synthesis ?
219 :
デフォルトの名無しさん :2007/04/21(土) 11:38:25
32x32は1024だよな
アセンブラスレなんだから 32x32は9C4かも判らんし1244かも判らん そもそもxが何かも判らん
32bit整数かける32bit整数の結果を64bit整数に保存する命令を使いたい、の意味だと受け取ったが
そんなの解っててネタレスしてるんだろうが無粋な八目
八目鰻は鰻じゃないらしいね。
voidさんがいると聞いて飛んできました
あれは魚のうちでもとりわけ下等な奴らしいぞ
八目鰻の目は二つ
メクラウナギってのは名前変えるんだっけ
メクラ>227って名前になるらしい
当然、「目の不自由な人のような鰻」となります。
割り込みのレスポンスがシビアなときには、とりあえずのコードをCで書いて コンパイラにアセンブラ吐き出させて手で最適化するのはよくやる。 主に出入り口のレジスタ退避を減らすとかだけどね。 俺の仕事ではブロック入出力が多いんで、コンパイラが当ててくれなかった 組み込みループ命令とかを使って組みなおすことも多い。
SHなんかは、Cである程度最適化(構造体のサイズを届く範囲にするとか)した後、 吐かれたアセンブラを必死で最適化したつもりのコード(多少サイズは小さい)が 実行させたら元より遅くなってしまったり・・・・
RISCマシンでアセンブラなんて、狂気の沙汰だ。
VLIWはちょっとイヤだがRISCならいけるだろ
レジスタ沢山持ってるCPUだと、
割り込みで大量にレジスタ保存するコストが大きく
かつC言語は、レジスタを大量に使うように最適化されているので、
割り込みはアセンブラで書かなければいけないという事になりがち・・・・という話かな
>>230 >>231 はSHは命令のロードとデータの読み書きを巧くCコンパイラなら配分してくれるが
自作だとコードが短くなってもパイプラインが乱れてストールする事になることもあるという事だろ
SHは型番でそのあたりの事情が違うから、そのあたりの最適化はコンパイラに任せた方がいい。
最近のSHはレジスタバンク持ってるから、割り込みもC言語でOK
235 :
デフォルトの名無しさん :2007/05/30(水) 22:31:00
Cで書いたら変数型の制約がうっとうしくてやってられんような場面ではアセンブラ便利。 つーか先にアセンブラ覚えた人間がC使うと、厳格な変数型チェックにぶち切れることになる。 「杓子定規にも程があるだろこのお役所コンパイラがぁ〜〜〜〜!!」とか何度叫んだやら。 逆にCから覚えた奴がCの「初めに変数型ありき」の感覚でアセンブラ使っても 大して速くも短くもならんし、ほとんどメリット無いだろな…
C言語程度の緩い型チェックでぶち切れるなよ
俺なんかvoid*が怖くてしょうがないよ
型チェックはバグを減らしてくれるよ
警告だけはしてくれるわな。バグを減らすのは相変わらずプログラマの仕事だが。 ま、警告だけでも大助かりなんだけどね。 警告がでたら闇雲にキャストしてコンパイラを黙らせる輩の気が知れん。
>>234 漏れはCの型チェックで切れたことは一度もないぞw
Javaと勘違いしてるんじゃないのか?
なら、こういうことしなければならない面倒くささかな? union U { int i; unsigned char b[4]; };
>>241 そんな環境依存コードを書くぐらいならはじめからアセンブラを使う
244 :
デフォルトの名無しさん :2007/06/02(土) 10:09:40
>241 文字列の解析なんかだともっと顕著だよな。 一度に4バイト照合出来るCPUでも、 C言語は1バイトずつ4回比較しろって思想で作られてるから。
>>241 それビッグエンディアンじゃないと使い物にならん
なんで? エンディアンが問題になるのは違いが見つかるときだけだろ? ほとんどのケースでは違いがないことの方が多い 全ファイルにまたがって違いがあるならそれを比較する意味すらない
馬鹿ばっかりだな
そろそろ UTF-32 の議論に移るべきだと思う
>>247 納期間近の夜中に泣きながら原因を探し回ってようやく気が付くんだからほうっといてあげようよ
>>246 strcmpは一致するかしないかだけじゃなくて、違う場合は大小値
リトルエンディアンだと大小値が必ずしも一致しない
"hage と samaを32ビット
ミスった strcmpは、一致しない場合は正か負かの値でどっちが大きいかを表すように仕様で決まってる。 "hage" と "sama" を32ビット値として評価した場合 ビッグエンディアンでint32としてすると先頭が上位になるから後者のほうが大だから strcmpの仕様通りになるが リトルエンディアンだと先頭の方が下位になるから前者のほうが大
>251 それこそ環境に依存しているんじゃないの? 共用体でプログラムを組む場合、それこそ限られた環境で動かすからあんまり当てはまらない
>>251 ソートする為の比較なら別だが
字句解析や、構文解析での比較なら、同じである事と一意に大小が比較できる事が要件なので
一意に決まるならどっちだろうと問題ないさ。
1バイトしか入力無い場合に他のバイトにゴミが入るような馬鹿な事をしていない限り
しかしエンディアンの違いってホントいい迷惑だよ。 共用体もビットフィールドもその他も・・・・
>>254 ビットフィールドもMSBから設定されるもののあればLSBから設定されるのもあって混乱する。
複数の仕事を同時にするときは注意w
型の違う物同士を扱わなければ何も問題ないんだがな
>>256 共用体の時点で異なる型でアクセスする訳でしょ。
ハードウェア周りは、同じペリフェラルでもバス幅とエンディアンが同時に変わると
レジスタのビットアサイン変わるから面倒。
ifdefだらけになってもややこしくなるから結局共用体もビットフィールドも使えない。
ハード周りでこそ使えると便利なんだけどなぁ。
>共用体の時点で異なる型でアクセスする訳でしょ。 まずはその発想を捨てれ。どこぞのスレでも話題になってたが、それは規格違反だ。
「型」という概念を持つ限り、ビットやバイトの並びはC言語の範疇ではない。 そこでアセンブラが使えるわけだ。
260 :
デフォルトの名無しさん :2007/09/30(日) 17:02:13
特技にイオナズンとありますが・・・
262 :
デフォルトの名無しさん :2007/10/24(水) 17:00:27
C言語で再起はできるけど、アセンブラでも再起ってできますか??
Cがどうやって実行されているか
できるできないで言うと出来るんだろうけどやる気がしない。 ループでええやん。
アセンブラに出来ない事ってのはCPUで出来ない事と同義
再起不能(リタイア)
>>262 出来るはず
昔授業でハノイの塔を
再帰(再起じゃなくて再帰)で解くの作ったことがある
いや、出来るのはみんな知ってるから
アセンブラで再帰が不可能ならCコンパイラはどうやって実現してるんだよw
cの吐くASM見てもいいんだけど、キモは必要な情報は全てレジスタ渡しかスタックに積むこと。 静的な記憶を持つと破綻の元。
レジスタってのは「静的な記憶」と等価だと思うんですけどねw
その言い方なら記憶装置は全て静的じゃん。レジスタは動的に保存・復元するでしょ。 スタックだって静的な記憶を動的に使う手法のことだし。
dynamic・staticは、そこで持ち出す必要ないだろ。
暇なのでLSIC-85の再帰コードを貼ります void movedisk(uchar n, uchar a, uchar b, uchar c) { if( n > 1 ) movedisk(n-1,a,c,b); printf("move piece %d from %d to %d\r\n",n,a,b); if( n > 1 ) movedisk(n-1,b,a,c); } void main(void) { uchar n; printf("枚数は? "); scanf("%d",&n); movedisk(n,1,2,3); }
CSEG %5 "hanoi.c" movedisk_: PUSH B %6 PUSH D PUSH PSW CPI 1+1 JC __2 LXI H,4 DAD SP MOV L,M PUSH H DCR A LXI H,10 DAD SP MOV C,M CALL movedisk_ POP B __2:
%7 POP PSW POP D PUSH D PUSH PSW LXI H,4 DAD SP MOV L,M MVI H,0 PUSH H MOV L,E MVI H,0 PUSH H MOV L,A MVI H,0 PUSH H LXI H,Z7 PUSH H CALL printf_ POP B POP B POP B POP B
%8 POP PSW POP D CPI 1+1 JC __3 LXI H,4 DAD SP MOV L,M PUSH H MOV C,E DCR A LXI H,2 DAD SP MOV E,M CALL movedisk_ POP B __3:
%9 POP B RET Z7: DB "move piece %d from %d to %d",0Dh,0Ah,0
main_: PUSH B %12 LXI H,Z11 PUSH H CALL printf_ POP B LXI H,0 DAD SP PUSH H LXI H,Z12 PUSH H CALL scanf_ POP B POP B
%13 MVI L,3 PUSH H MVI C,2 MVI E,1 LXI H,2 DAD SP MOV A,M CALL movedisk_ POP B %14 POP B RET Z11: DB "枚数は? ",0 Z12: DB "%d",0
ふ〜、連投規制に引っかかって2日がかりになってしまった。 あと、printf_とscanf_のEXTRN宣言が足りないぐらいかな。 movediskのパラメータをucharにしたのは、intだと8085では重いから。 わりと素直なASMコードになってるとおもう。今度85の仕事やるとき仕込んで動かしてみよう。
>>275 のmovedisk()のprintf文 printf("move piece %d from %d to %d\r\n",n,a,b); は間違い。
printf("move piece %d from %d to %d\r\n",n,a,c); ・・・(最後がc)でした。
284 :
デフォルトの名無しさん :2008/02/24(日) 17:30:06
>>281 バイナリからそのようなはどのようにすればわかりますか?
「バイナリからそのような」はどうやっても判りません。
>>284 ; 8085命令コード こんな資料を作ってます。
00 NOP
01FFFF LXI b,65535
02 STAX B
03 INX B
・・・(略)全ての8085の命令をアセンブルして、左端の欄でsortすればこの表が得られます。
FD DB 0FDH ; JX5 addr
FE80 CPI 128
FF RST 7
バイナリの、どこか開始点が判れば、そこからバイト毎にこの表を引いて、命令後に直せます。
287 :
デフォルトの名無しさん :2008/02/25(月) 07:22:36
>>160-
呼び出し回数の話してるけど、
一箇所のループで複数の関数を呼び出している場合、
同じ関数を繰り返し呼び出すようにするだけでキャッシュ効率が上がり、10倍くらい早くなる。
一つ一つの命令ロジックよりもキャッシュ効率のほうがよっぽど大事。
>>152 64ビットの精度が必要ならコンパイラだろうがアセンブラだろうがまったく同じ。
精度を落とした場合もまったく同じ。
違うとか言ってるやつは書き方を知らないだけ。
288 :
デフォルトの名無しさん :2008/04/27(日) 20:06:03
age
289 :
デフォルトの名無しさん :2008/07/19(土) 09:50:44
PCじゃなくて独自基板(Z80,H8,H8S,SH3,M32C,T900,etc.)の開発の視点だが 仕事だったら可読性や生産性や移植性の問題があるからアセンブラは避けるなあ 高速化が必要になっても大抵はアルゴリズムとコードの改良で対応できるし
290 :
デフォルトの名無しさん :2008/07/19(土) 10:50:00
ZSNESのコードはじめて見たときは驚愕した
291 :
デフォルトの名無しさん :2009/01/18(日) 08:26:17
292 :
デフォルトの名無しさん :2009/03/05(木) 15:57:24
ポインタの型が鬱陶しい。 アセンブラの感覚でアドレスに座標の4倍を加算したつもりが 16倍を加算してしまったり。
それ、馬鹿なだけじゃんよ・・・。
vista 36bitOSでアセンブラを使う方法を教えてください 独習アセンブラとか色々参考書は読みましたが、なんか起動できないです 当方プログラムに関してあまり知識はありません
296 :
デフォルトの名無しさん :2009/06/20(土) 15:14:23
あげます
297 :
デフォルトの名無しさん :2009/06/20(土) 15:20:08
それをゆうなら、Vista 32bit OSだろ? アセンブラをダウンロードしてインストールすればいい。
「言う」は終止形・連体形が「ゆー」となる不規則変化動詞なので、「ゆう」と表記するのは全く問題ない。 古くは「いふ」「ゆふ」の両方の表記が見られた。 何で日本人が「いう」と書かないといけないと思い込んでるかというと、 「現代仮名遣い」によって「『言う』は常に『いう』と書け」と例外規定されているからだが、 日本語は日本国だけで使用される言語でもないので、 日本語を使用するにあたって、日本政府の決めた表記法に必ずしも従う必要はない。
突っ込んだら負けかなっと思っている
アンガウル州人は黙ってろよ
>>300 日本語が公用語の国って日本以外にあるの?
なにゆってんの?w
「公用語として使う国」という電波をどこから受信したか知らんが、 日本国内であっても従う義務がないのは確かだな。
>>303 70年ばかり時間を遡ればさにあらず
アルアルヨ〜
>>305 義務も知らんのか。伊達に草生やしてないな。
>>307 何で「義務」なんて言葉を使ってるのかきいてるんだよ。
俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
従う必要があるとかないとかそんな話始めから誰もしてないっつーの。
「ゆう」がいいなら勝手に使ってなw
>>308 俺は
>>303 のオナニー解釈を揶揄しただけなんだが。
>俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
>>303 がその「指摘」なの?
俺は文言一致論者だから言うわゆうと書くよ。
じゃあ言わないはゆわないか
>>311 いや、標準的な発音(もちろんこれも勝手に決められたものだが)でわ、「言う」は終止形と連体形の時に「ゆう」となるが、
未然形では「いわ」と発音するのが正しいとされているので、俺は「ゆわない」とわ書かない。
しかし仮に「言わない」お「ゆわない」と発音する人がいれば「ゆわない」と書いてもいいと思う。
>>312 つまりあんたは、「お」と「を」の発音を区別できないわけだ。
IDないから誰が誰だか分からんが、
>>313 のレスだけ飛び抜けて(ry
続きは「言うと書くかゆうと書くか・・・」で脳内に新スレ建ててそっちでやってくれ。
てにをはのなってない奴のいうことを真に受けてもアレだしな
>>309 すまんが
>>303 は失言だった。すまん。取り消させてくれ。
>
>>303 がその「指摘」なの?
いや,
>>299 のことだ。
「ゆう」もありってのは勉強になったよ。ありがとな。
ここまでにする。
酸っぱい葡萄の話はこれにて終了か 何が文言一致論者だ ただの文盲じゃん
319 :
デフォルトの名無しさん :2009/06/23(火) 14:28:56
TASMとNASMで同一の命令が展開されたバイナリコードが 両者違う場合があるのですが、何故ですか?
80(x)86のコード体系には冗長性があるため。 たとえば、ソースorデスティネーションがAXの場合の専用のコードがあって それを使うか使わないかとか。
321 :
デフォルトの名無しさん :2009/06/23(火) 14:49:45
>>320 レスありがとうございます。
それについて詳しく載っているサイトや書籍等がありましたら教えていただきたいのですが、
322 :
デフォルトの名無しさん :2009/06/23(火) 20:41:14
高速化の鬼になりたいのですが、何から学べばいいでしょうか? 皆さんと対等に話せるレベルになりたい
英語
324 :
デフォルトの名無しさん :2009/06/23(火) 22:02:35
え・・
325 :
デフォルトの名無しさん :2009/06/23(火) 22:09:56
7:Socket774 :2009/06/16(火) 14:43:17 ID:qZWzEFM3 [sage] ここの掲示板って知ったかぶりでメーカーの商品の批判ばっかりしてる奴ばっかりだね。 どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか? お前らまともに勉強してから文句言え。
326 :
デフォルトの名無しさん :2009/06/23(火) 22:22:59
>>326 そりゃ、日本語じゃろくな情報ないってことだろ。
リファレンス読むのに英語力必須だお 昔のCPUは簡単だったが、今じゃ命令の実行時間の予測が難しいんで、適当に力任せで俺は書いている。
329 :
デフォルトの名無しさん :2009/06/24(水) 01:35:33
成る程、しかしまずは基礎からやろうと思うのですが NASMを使うのとVSがはくアセンブリを見ながら勉強 どちらを先にすればいいと考えますか?
適当に最適化の本買ってテクニックを知れよw
331 :
デフォルトの名無しさん :2009/06/24(水) 02:43:45
VSがはくアセンブリなんて、基礎から遠いところにあると思うがな・・・。
アセンブリレベルの最適化を学ぶということは、CPUアーキテクチャを学ぶこととほぼ同義。
インテルのサイトからマニュアル落としてこいよ。
>>319 のような質問をするってことは、「80386/80486プログラミングガイド」辺りを読んで
より造詣を深めたほうがほうがいいかもしれない。最適化の話は全く出てこないが。
その後はせいぜいSIMD命令くらいだし。
334 :
デフォルトの名無しさん :2009/06/24(水) 17:15:46
>>332 はじめて読む486ではいけませんか?
絶版になっていたので、
勉強するには内容が不十分であると言わざるを得ない。
>>333 わかりました。ではやはり買ったほうがいいということですね。
詳しく探してみます。
はじめて読む486は、他の「はじめて読む(石の名前)」と違って、 基本的なマシン語やアセンブラを知ってる人を対象として、 プロテクトモードを活用する話がメインになっているので、 ちょっと特殊。 はじめて読むPentiumならおk。
SSE最適化から動画編集・エンコードソフト関係のスレもいい。 プラグイン作者なんかに詳しい人間がごろごろいる。
アセンブラやるならAVRだよ
341 :
デフォルトの名無しさん :2009/07/09(木) 22:07:24
アセンブラによる高速演算技法という書籍は、どのような内容でしたか?
342 :
デフォルトの名無しさん :2009/07/14(火) 19:20:47
逆アセンブルのコツを教えてください。 命令単位ではわかっても全体で何やってるのかわかりません。 定型文とかあるんですか。
逆コンパイルならともかく、逆アセンブルは、究極的には丁寧にトレースする だけだと思うんだが。 逆アセンブルしたものを、どう解釈するか、なら色々知識とか必要かもだけど。
どこからコードが始まってるか分からないときに ずれたまま逆アセンブル開始した場合 ずれたことに気付くためには何をすれば良いですか
ノッポさんを探す そしてスレ違いだから消えろ
>>342 C/C++辺りを有る程度熟知した上で慣れる事。自分で書いたコードがどう変化するかを何度か見れば多少理解できる。
あるけど、コンパイラとコンパイラのバージョンとコンパイルオプションと前後の文脈に依存する。その辺の癖は慣れるしかない気がする。
>>344 プリフィックスが変だったりムダにLOCKとかの指定がついてたり、jmp先が命令の狭間になってないかで見る。
つっても逆アセンブラってわりとその辺間違えることは少ないようにも思うが。
>>345 こういう話好きなんで誘導お願いします。
>プリフィックスが変だったりムダにLOCKとかの指定がついてたり、jmp先が命令の狭間になってないかで見る。 自分で自分を書き換えるタイプのプログラムだと 命令の狭間にjmpしててもおかしくはないような気もする いまどきのCPUでも出来るのかどうかはしらないけど
>>347 そゆのは例外でしょ。同じコードに複数の意味を持たせる場合も有るし、そういうガチガチに手を加えてある箇所は手で位置を指定しなおさないと。
広範囲の自己書き換えはパッカー(UPX等)とか耐タンパ手法とかで今でも使われてるから出来なくは無いかと思うけど、命令のキャッシュ機能はあるはず。
Win32APIにFlushInstructionCacheってのがあるけど、これはマルチプロセッサで命令キャッシュをクリアするモノらしい。
IFだけで実装無しってオチ・・・だったりしないよな?
349 :
デフォルトの名無しさん :2009/07/15(水) 04:30:53
やっぱ洋書とか読まないと厳しいですかね〜
どこから始まるか分からないってのは、要するにエントリポイントに関する知識が不足してるだけだと思うので PC向けならLinkers & Loadersを読んだらどうか 組み込みのROMとかならターゲットマシンかそのCPUのアプリケーションマニュアルに指定があるはず
ret と jmpってどう違うんですか?
>>352 そのページの記事のコピー元の投稿日が分らないし、英語苦手なんで単語拾っただけだが、親投稿自体は98年以前の記事の様に見えるが・・・
VC++6.0付属のMSDN Libraryを参照すると
>This function is valid only on multiprocessor computers.
>この機能はマルチプロセッサコンピュータのみで有効です。
で
>Windows 95 and Windows 98: The FlushInstructionCache function always returns TRUE.
>Windows 95 and Windows 98 support only single-processor computers.
>Windows 95 and Windows 98:このFlushInstructionCache機能は常に非0を返します
>Windows 95 and Windows 98はシングルプロセッサコンピュータのみをサポートします。
とのことだから、"Win9xでダミー関数なのは"公式らしい。
コメントの方だと広域ジャンプでパイプラインハザードが起きてパイプラインが破棄されるとかその辺の話をしている・・・のか?
MSDNだとマルチプロセッサで有効(もしくは有効にする予定)の機能らしいが、コメントでマルチ〜に触れてる奴がいないしちょっとアテにならん気がする。
95年代のCPU事情だとマルチコアはPC用途では考慮もされずワークステーションのごく一部実装されたマルチプロセッサで走るNT系のみをターゲットにしたAPI設計なのだろうけれど、現代のHT/マルチコアではどう作用するのだろう?
>>353 retはアトミックにスタックのポップを実行すると思われる。
pop ecx
jmp ecx
とかだとアトミックに実行されることは保障されないし、レジスタも一個浪費する。
あと、解析系のプログラムはretを期待するはずなのでその辺の違い。
どこが始まりだか判らないバイト列があったとして、retやjmpの後ろはサブルーチンの開始点 だろうと見当はつくと思うんだが、先頭の実行開始点はどうやって見つけるんだろう。
>>355 call xxxx を見つければいいんじゃね?
>>354 キャッシュを共有していない場合は悲しいことになる。
まあ普通はkernelの方でフラッシュしてるはずなので、
アプリケーションが気にする必要はない。
>>356 リセットベクタが指している実行開始点は、call命令の対象になってないでしょ。
そういう実行開始点はどうやって識別すればいい?
スタックポインタへのロード命令のパターンを見つけるのかな?
ASCIIprintableなcodeだけで書かれたcomファイルのウィルスってなかったっけ
361 :
デフォルトの名無しさん :2009/07/24(金) 17:02:00
セグメントを使ったオフセットによる1MB以上のメモリ番地へのアクセスを Windows XP上で実現するためにはどうすればいいですか?
XP上ではリニアアドレスが仕様だからできない
>>14 16ビットアプリとして作ってWindows XP上で動かす。
ところで、なんでそんな苦行をするの?
365 :
デフォルトの名無しさん :2009/07/24(金) 21:07:31
>>364 書籍に載っているソースコードだけを見て、それを理解したとは言えません。
小学校の理科の教科書に載っている実験結果を見て、その実験について
本当に理解した、といえるのか・・・
そういう点から私は、・・・はい
自分で書いたプログラム暴走させて HDD壊すようになって一人前
古代文献のソースコードを実際に試すのは勝手だが、現行においては全く役に立たんぞ。 現にSSE書きまくりのプロの俺だが、セグメントを使用したアクセスは扱った事がない。 x86アセンブラなんてコンパイルとリンクの仕方覚えれば十分。
368 :
デフォルトの名無しさん :2009/07/24(金) 21:49:41
成るほど・・・ では、最後に団子さんの考えを聞いて質問を終える事にします。団子さんは・・・ どう思われますか
できない子にみんなをあわせる今の教育
370 :
デフォルトの名無しさん :2009/07/25(土) 12:47:59
>>369 2011年からもっと酷くなりますよ
ですが、、ここでとやかく言っても仕方がないですよ
>>367 全くだな。今時x86の16ビットコードを書くとか無駄もいいところ。
OSのローダーを書きたいなら別だが、セグメントなんて糞。
アセンブリで書くと、そのプログラマーの指紋がつくので注意。
374 :
デフォルトの名無しさん :2009/09/27(日) 05:20:15
しらなかった
375 :
デフォルトの名無しさん :2009/09/28(月) 12:35:40
double f(double a) { return a + 1.0; } をアセンブラで書くとどうなる?
俺様アセンブラなら、 f load [paras]0, reg0 add1 reg0 store reg0, [rets]0 ret end f だな。
378 :
デフォルトの名無しさん :2009/09/28(月) 13:52:14
>>377 .globl __Z10myfunctiond
.def __Z10myfunctiond; .scl 2; .type 32; .endef
__Z10myfunctiond:
pushl %ebp
movl %esp, %ebp
fldl 8(%ebp)
fld1
faddp %st, %st(1)
popl %ebp
ret
やっぱりわけわからん
それは、putc() がわけわからん、と言っているのと同義だよ。 命令のリファレンスマニュアル見れば、わからないことなんでないだろう。
>>378 せめて、自分が使っているCPUが何で、どんなコンパイラでアセンブリ出力したのか位は書こうぜ。
つーか、>378でわけわからんのなら何やってもわからんだろ。
パソコンなら浮動小数点プロセッサーが付いてるCPUのこともあるだろうな。 俺のはクロスコンパイラだから、ソフトの加算ルーチン呼び出しがコンパイルされる。
382 :
デフォルトの名無しさん :2009/09/28(月) 20:51:03
dConst dq 1.0 f proc r:real8 fld r fadd dConst ret f endp やっとわけわかったわ
383 :
デフォルトの名無しさん :2009/10/09(金) 12:00:45
movs命令の説明の中に、DS:ESIが示すメモリオペランドをES:EDIが示すディステネーションアドレスへコピーする とあるのですが、 DS及びESセグメントがどうして出てくるのかがわかりません。ESIもEDIも32bitのレジスタであるのですから、 セグメント機構を使う必要はないだろう、と私は考えたのですが、、、
384 :
デフォルトの名無しさん :2009/10/09(金) 12:54:33
385 :
デフォルトの名無しさん :2009/10/09(金) 12:56:29
相対アドレスでアクセス。
386 :
デフォルトの名無しさん :2009/10/09(金) 13:09:05
なる程、ありがとうございます。
387 :
デフォルトの名無しさん :2009/10/14(水) 21:08:57
ストリング命令は何故、DS:SI及びES:DIで処理されるのですか?
そうゆう仕様だから
389 :
デフォルトの名無しさん :2009/10/14(水) 21:28:04
>>388 どうしてそのような仕様になったのですか?
そうする必要性がどこにあったのですか?
8086は例えばCXをループカウンタに使うLOOP命令とか、 AXがオペランドになる場合専用の短縮形命令コードとか、 そういう非対称な設計があちこちにある。 どうしてとか必要性とかじゃなくて、そういうものとして設計されてる。
あの時代はトランジスタを1個1個手作業で配置して結線じゃないの。 レジスタ決めうちして専用回路を作れば その他のレジスタを無視できるからセレクタと結線が少なくなる。
どんだけ巨大な8086なんだよ
どれでもできるようにしようと思うと、結局どのレジスタを使うかを指定しなくてはいけなくて、 その分だけ命令の数が増えるわけで 命令が増えた分だけプログラムが大きくなるわけで。
フラットモデルは楽だな セグメントを意識しないで済む
395 :
デフォルトの名無しさん :2009/10/14(水) 23:41:12
なるほど、ありがとうございます、 セグメント機構に関して私はもう一つ気になることがあります。 1MBのメモリにアクセスすることの出来るリアルモード時のセグメント機構について、 16bitのレジスタでは2^16=64kb, アドレスバスが20bitで2^20=1024kb 例えば、セグメントレジスタ群にコードセグメントというプログラムコードを格納する用途に使うものがありますが、 このコードセグメントレジスタに基点位置を設定し、オフセットアドレスを使ったところで基点位置から64kbまでの範囲しか利用できず もし実行したいプログラムが64kbyte以上であれば、それは実行出来ないものです。 これでは1MBという膨大なメモリを最大限に使う事が出来ていないように思われます。 1MBという膨大なメモリをリアルモード時では、どのようにして利用していたのでしょうか?
>1MBという膨大なメモリ 頭大丈夫?
(1) 小分けにしてfar jump/callする (2) 高級言語でFARモデルとかHUGEモデルを使う (3) あきらめて68000に乗り換える
398 :
デフォルトの名無しさん :2009/10/15(木) 00:03:54
>>397 00000--------------------コードセグメントプギャー
00100far jumpで00600ぷぎゃーすおぎゃ
00102--------------------データセグメントバロッシュ
00600,追加のプログラムコード
という具合でしょうか?
日本語で書いて。
>>397 普通はサブルーチン毎に適当にセグメント割り当てて、
それをfar callしてた。
一個の塊が64K越えることなんてないし。
というか64Kに収まらんコードをx86アセンブラで書く気力はないので、
コンパイラとリンカに全部お任せ。
どっちかってえと64K越えデータを扱う方がめんどかった。
farはセグメント自分で管理するのがめんどいし、
hugeはいちいち正規化するからおせえし。
で、今時こんな化石な知識は必要なのか?
普通は68kに行くだろJK
>>395 farポインタをつかう。farポインタはセグメントとオフセットをセットにして扱うポインタ。
メモリモデルによって、1つの配列の大きさが64kバイト以下に制限されるものと、64kを超えられるものがある。
>>392 LSIのマスクパターンのデザインのことを言ってるんだよ。
8086のころはCADがどばーっと配置してくれるとかそういう時代じゃないから。
406 :
デフォルトの名無しさん :2009/10/15(木) 18:48:00
つ DarkBASIC
32KBが広大だと感じた頃に戻りたひ.....
62256に換装して夢のようだと思ったあの日
boot ROM 8kb (0000-1FFF) SRAM 32kb (8000-FFFF) set sp copy BIOS to (8000-) jump to 8000 and switch ROM to SRAM 32kb (0000-7FFF) write vector (0000, 0066) and system call for CP/M (0003)
411 :
デフォルトの名無しさん :2009/10/15(木) 22:16:10
まぁ、メモリ 16M 抱えてる暴力的な WS ってな時代だったしな
412 :
デフォルトの七誌さん :2009/10/16(金) 09:51:05
http://tea-andorra.com/asenbura.jpg (1)プログラムの実行終了直後の記号番地HOGEの内容を10進符号付き整数で表すとどうなるのか
(2)EX03Qの実行終了直後の記号番地Xの内容を10進符号付き整数で表すとどうなるのか
(3)EX03Qの実行終了直後の記号番地FUGAの内容を10進符号付き整数で表すとどうなるのか
(4)EX03Qの実行終了直後の記号番地HENAの内容を10進符号付き整数で表すとどうなるのか
助けてください・・・
>>412 アセンブラの質問はアセンブラ質問スレへ、
アセンブラの宿題はアセンブラ宿題スレへ。
って、両方とも落ちているのか。ご愁傷様。
あー、機械語スレがあったか。 でもまぁ、その程度の課題でしかもなんのアセンブラかも書かないようじゃ相手にされないだろうけどね。
CASLの解説書で命令の意味をひとつひとつ確認していけばわかるだろ。 特に難しい部分があるわけでもないのに。
416 :
デフォルトの名無しさん :2009/10/16(金) 10:22:20
ロストテクノロジーか
命令を覚えるつもりが全く無いと言うことだよなぁ これで分かるならぴゅうた買ってきた方がいい EX03Q 開始 読む GR3 に X の内容を 読む GR1 に ONE の内容を 足す GR1 に GR1 を 足す GR3 に GR1 を 書く GR3 の内容を HOGE に 引く GR1 から GR1 を 書く GR1 の内容を HENA に 書く GR3 の内容を FUGA に 戻る X はドリームキャスト 119 ONE はドリームキャスト 2 HOGE はドリームキャスト 123 FUGA はドリームキャスト 1 HENA はドリームキャスト 1 終わる
虫つくろい FUGA はニンテンドーDS 1 HENA はニンテンドーDS 1
>>417 FUGAとHENEはドリキャスじゃなくてDSだぞ。
つ DarkBASIC
>>419 指摘サンクス
あやうくぴゅう太が落ちるところだったぜ
変にひねらなくていいから、さっさとコピペするだけで提出できるやつを書けよ。 お前らPGだろ?
マ板はともかく、ここはアマチュアも多いだろ。
baka
>>400 思い出したくねえなw
アセンブラ自体もう忘れたほうがいいような気もするんだが、
なぜか縁が切れないというか、なまじ知っているから使ってしまうんだよね。
コードインジェクション用にリモートプロセスに埋め込む関数を書いたりとか。
C#でバイナリコードを実行する方法を思いついちゃったりとか。
426 :
デフォルトの名無しさん :2009/10/17(土) 10:58:17
バイオススタートアップルーチンによって最初の512byteが0x07c0に読み込まれますが、 この場合コードセグメントの内容はどうなるのですか? 0x07c0、もしくは0?
427 :
デフォルトの名無しさん :2009/10/17(土) 11:06:47
ごめん、調べたら解った
428 :
デフォルトの名無しさん :2009/10/17(土) 23:05:34
アセンブリについて学ぶって事は、コンピュータアーキテクチャについて学ぶ事も同義ではないかなと最近思い始めました。 難しいですが、かなり充実した生活を送る事が出来ています。
429 :
デフォルトの名無しさん :2009/10/18(日) 00:02:30
jmpi命令について質問があるのですが、jmpiは指定して番地をコードセグメントに設定及びジャンプする命令なのでしょうか?
メモリの内容が飛び先になってるとか
環境も書かずに命令だけ書かれてもな。
432 :
デフォルトの名無しさん :2009/10/18(日) 07:40:46
>>431 すまない
コンパイルはLinux上、as86及びgccを使用しています
なぜかPC前提になってるし。。 リファレンスマニュアル見ると確実。
リファレンスマニュアル、、、がないです><
まず、as86なんてものを使うのをやめれ。
どうもjump intersegmentの略らしい。 つまり、ただのfarジャンプ。
jmpiとjneとかの他の命令を一緒にぐぐればすぐ出てくる。 Linuxブートアップソースコードの解析っていうPDFに書いてある リアルモードからプロテクトモードへ以降した直後の命令は、JMP命令でなければなりません。 このプロテクトモードでの最初のJMP命令は次のようにして作られます。 > db 0x66 ; オペランドのサイズリフィクス > db 0xEA ; これはjmpiのコード > dw 0x1000 ; プログラムの最初の番地のオフセット > dw 0x10 ; コードセレクタ これは「jmpi 0x1000:0x10」と同じです。このコードを実行すると、 コードセレクタ0x10で示すGDTのベースアドレスに0x1000を加えたアドレスの命令から実行が始まります。
なるほど、0xEAは単なるJMP FARだね。
バイナリ出してようやく分かるとか どんだけ機械語脳なんだよ
いや、一番確実にどの動作をするのか知ることができるし。
確かに出来損ないのスクリプトエンジンだと 逆汗したコードをアセンブルしても、同じバイナリにならないことがあったよ。
今回のはそういう話じゃないけどな
444 :
デフォルトの名無しさん :2009/10/19(月) 18:20:05
Intel社で予約されている割り込み番号が何処に載っているのか教えてください
447 :
デフォルトの名無しさん :2009/10/20(火) 15:43:25
ページング機構がまるで解らず行き詰まっております、 わかりやすく解説されているWebサイト等ありましたらお教えください。
Wikipedia
449 :
デフォルトの名無しさん :2009/10/20(火) 17:36:01
>>448 直感的に捉えたいと考えております、図とかモリモリの...
つ[google]
google画像検索はたしかに図とかモリモリだw ページングの図がたくさん出てくるが・・・果たして直観で理解できるものかどうか?
452 :
デフォルトの名無しさん :2009/10/20(火) 19:05:03
プロテクトモード------------------------- mov ax, [0100]論理アドレス? ↓ アドレス変換回路は、 「セグメントレジスタに格納されたセレクタ値と対になっているセグメントベース値を取り出す」 「そしてオフセットアドレス0100を加算してリニアアドレスを算出する」 ↓ ページテーブルを参照して実際の物理アドレスを計算 という具合でしょうか? リニアアドレスってのがいまいちなんだかわかりません。
セグメント化アドレスの対義語 アドレス空間全体が00000000〜FFFFFFFFで線形に番地付けされた、セグメント化されていないフラットな様子を表している
454 :
デフォルトの名無しさん :2009/10/20(火) 19:33:11
仮想アドレスは、物理アドレスが4GB未満の場合であっても4GBのアドレス空間を取り扱う事。。。 ということですか?
455 :
デフォルトの名無しさん :2009/10/20(火) 19:53:32
であれば、ページングがなければ4GBの仮想アドレス空間を保持出来ない ページングはオフに出来るようですが、オフにする状況といえばどんな場合がありますか?
アドレス空間というのは、指定できるアドレスの値全体または一部分を指す言葉 物理アドレスか仮想アドレスか、物理メモリをどれだけ搭載しているか、等は関係がない 今現在実際に使用中でないアドレス値の範囲を指して、空いているアドレス空間などと呼ぶが、 物理アドレス空間が空いてるなら、そこに新しいハードウェアとのI/Oをマップする余地があるかもしれないし、 仮想アドレス空間が空いてるなら、OSに要求してそこにページを割り当ててもらえるかもしれない
マシンの起動時はページングはオフになっている ページテーブルがまだ準備されていないので
458 :
デフォルトの名無しさん :2009/10/20(火) 20:18:08
>>456 こんがらがってしまいました、リニアアドレスっていうのは仮想アドレスと同じ意味ですか?
460 :
デフォルトの名無しさん :2009/10/20(火) 20:30:47
>>459 ええ、調べた上で聞いています。
ITPRO : -仮想アドレス空間は,プロセスごとに割り当てられた論理的なメモリー領域です。これは,連続したアドレスで示された領域であり,リニア・アドレス空間とも呼ばれます。
英語勉強しろw
462 :
デフォルトの名無しさん :2009/10/20(火) 20:45:28
463 :
デフォルトの名無しさん :2009/10/20(火) 20:55:10
リニアアドレスってのは、なんていうか、 僕がmov ax, [100] ↓ アドレス変換回路 ↓ 変換されるアドレスは全部連番に対応出来るぜ(リニアアドレス) 連番ってのがキーポイント?
464 :
デフォルトの名無しさん :2009/10/20(火) 21:09:37
あー、ひょっとしてセグメント化されていないアドレス?のことをリニアアドレス?
465 :
デフォルトの名無しさん :2009/10/20(火) 21:13:53
リニアアドレス→セグメント化されていないアドレス空間 物理アドレス→アドレスバス上でプロセッサが指定出来るアドレス空間 であっていますか?
466 :
デフォルトの名無しさん :2009/10/20(火) 21:20:00
ごめんなさい、見方ってのが結構重要だと感じました。 例えばアプリ側からだとリニアにアドレスが見える リニアにアドレス リニアアドレス、のような感じでしょうか? まぁまぁん〜かすかにわかるような感じが...
467 :
デフォルトの名無しさん :2009/10/20(火) 21:32:19
まとめます 1. -同一セグメント内ジャンプ→nearジャンプ 2. -セグメント化さてていないアドレス空間 3. -アプリケーションから見たらリニアなアドレス リニアアドレスふひひwwwという具合でしょうか?
仮想アドレス=プログラマが扱うアドレス 物理アドレス=プログラマの知ったことか ドライバやカーネルをいじる人はまた別よ。
1番間違えました
1. -セグメントオフセットがそのままnearジャンプ出来る(リニアアドレッシング?)
2. -セグメント化されていないアドレス空間
3. -アプリケーションから見たらリニアなアドレス
>>468 仮想アドレスとリニアアドレスというのは
仮想とリニアって単語の意味が違うように、なんていうか違うんだよ、という感じですか?
論理アドレス - プロセスから見えるアドレス 物理アドレス - CPUからアドレスバスから実際に出力されるアドレス 仮想アドレス空間 - ページングと仮想メモリが有効な時の論理アドレス空間 リニアアドレス空間 - ページングが有効な時の論理アドレス空間 であっていますか?
>>465 で合っている。
(セグメントまたはセレクタ) + オフセットで得られるアドレスがリニアアドレス。
ページング使っていないときは、リニアアドレスがそのまま物理アドレスとして扱われる。
ページングを使う場合、リニアアドレスから物理アドレスへの変換が行われる。
IntelのPDFにも書いてあるでしょ。
>>472 ページングが非有効なとき 論理アドレス空間=物理アドレス空間
ページングが有効なとき 論理アドレス空間≠物理アドレス空間
ありがとうございます。今からIntelのPDFを見てきます。
大抵の場合は、仮想アドレスとリニアアドレスは同じだと考えていい。 仮想アドレスのほうが一般的な言葉だけど、 IntelのPDFではリニアアドレスのほうをよく用いていたと思う。 セグメント・セレクタとオフセットのほうも見方によっては仮想アドレスであると言えるので、 x86固有の低水準な話をするときなどは、リニアアドレスの言葉を用いることが多い気がする。
8085で、strcpyみたいな機能で、区切りがコンマの奴が欲しくなった。LSIC85 MS/DOS #define MOVHD _asm_c("\n\tMOV\tA,M\n\tINX\tH\n\tSTAX\tD\n\tINX\tD\n") typedef void (*const t_parm2)(char*,char*);/* strcommaの最初のcall型*/ void strcomma(void) { /* 入出力:HL,DE = ソース、デスティネーションのポインタ */ do{ } while( (MOVHD)!=',' ); _asm_c("\n\tXRA\tA\n\tSTAX\tD\t; (DE)<--0\n");/*%sのトレーラchar*/ } 呼び出し側: ((t_parm2)strcomma(srcparm(buf+3,2),wk+7); /* src,dstのポインタ */ strcomma(); strcomma(); strcomma(); strcat(wk,"\r\n");コンマで区切られたパラメータを順に移動できてASM効率のコードが出た strcomma(char*src, char*dst) { みたいにc文法の関数書くと、移動コードの4倍ぐらい ポインタ変数の演算が出て、鬱陶しいし、重たいし。3Mの8085使ってるとこんな小技が効く(w
C言語及びx86アセンブリと学んできたのですが、このスレの住人からして次に覚えるべき言語は何が良いと思われますか?
C++
次はARMアセンブリだな
680x0
ふと思ったのですが、アセンブリ言語を真に理解するということはコンピュータアーキテクチャそのものを理解する事と同義ではないでしょうか
コンピュータアーキテクチャってのは周辺機器とかも含むと思うんだ
>>480 同じ命令セットでも色々なアーキテクチャのCPUがあるのだが
アーキテクチャという語が指す範囲と粒度は様々だからな
win7明日から発売だけど買うのかおまいら? 俺はMSDN会員だから既に入れてるが結構優秀で 不備はほぼ見られないからお勧めするよ 操作は慣れるまでちょっとかかるだろうけどVistaユーザなら すんなりいけるレベルじゃないかな このスレでVistaがメインPCのやつがいるかはわからないが。。
MSDN会員だが、既にWin8を待ちこがれている。
AVXってOS的にどうやってレジスタ待避やるんだろ。 CPU機能みて既存のOSで扱える? それとも特別なコードがいるのかなっと。 ふと新OSじゃないと扱えないのかな〜っと思った。
>>485 相変わらず MOV EDI,EDI は健在だな。
>>485 Windowsに注目する時代ではなくなった
>>489 とか言う奴が何年も前からいるわけだが。
AVX コンテキスト、で検索するとなんかOS側の対応が要りそうなふいんきだな
492 :
デフォルトの名無しさん :2009/10/22(木) 20:28:53
jne 1b jne 1fの違いがわかりませんお。
494 :
デフォルトの名無しさん :2009/10/22(木) 22:17:38
アセンブリのソースコードとC言語のソースコードがあり、 アセンブリのソースコードのほうで、 int_4096: /* 0x0000番地 */ org 0x1000 C言語のソースコードのほうで、 extern long intvel[1024];と宣言されているのですが、 こういう使い方って珍しいですか?
495 :
デフォルトの名無しさん :2009/10/22(木) 22:22:49
アセンブリのソースコードとC言語のソースコードがあり、 アセンブリのソースコードのほうで、 int_4096: /* 0x0000番地 */ org 0x1000 C言語のソースコードのほうで、 extern long int_4016[1024];と宣言されているのですが、 ..すみません、間違えました。。
496 :
デフォルトの名無しさん :2009/10/22(木) 22:45:37
。。。
497 :
デフォルトの名無しさん :2009/10/22(木) 23:00:39
>>496 すみません、正直に言います。
linux0.01のソースコードを今読んでいまして、
head.s内にて
.code32
.text
.globl idt,gdt,pg_dir,startup_32
pg_dir:
startup_32:
hlt // ここから処理が色々と、
head.h(0x0000000000000000)にて、
extern long pg_dir[1024];
としてpg_dirがC言語ソースコード中にて利用されているのです。
何を言っているのか全く分からないが全然珍しくない
499 :
デフォルトの名無しさん :2009/10/23(金) 12:06:08
in命令やout命令って割り込み関係ありませんか?
特権命令なので保護モードだと一般保護違反になるとか
outb %al,%dx jmp 1f 1: jmp 1f 1: jmp 1fのfとは一体何を表しているのでしょうか_?
16進数だろjk
>>502 1fを含むインストラクションがあるロケーションよりも前方(表示イメージだと下)にある最初に見つかったラベルの 1:
ラベルの前方参照(forward reference)を示してるんじゃないかなぁ。 てか、アセンブラ何? as86じゃないよね。
508 :
デフォルトの名無しさん :2009/10/23(金) 20:01:59
-----test.c #define _set_gate(gate_addr,type,dpl,addr) \ __asm__ ("movw %%dx,%%ax\n\t" \ "movw %0,%%dx\n\t" \ "movl %%eax,%1\n\t" \ "movl %%edx,%2" \ : \ : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \ "o" (*((char *) (gate_addr))), \ "o" (*(4+(char *) (gate_addr))), \ "d" ((char *) (addr)), \ "a" (0x00080000)) 上記をgcc -S test.c、にて出力したアセンブリリスト及び、上記をコンパイルしてobjdump -d test.cでのアセンブリリストが違うのですが どうしてですか?
509 :
デフォルトの名無しさん :2009/10/23(金) 20:53:19
あれ。。。いつもならすぐにレスが返ってくるのに皆様今日はどうなされたのですか?
511 :
デフォルトの名無しさん :2009/10/23(金) 23:28:46
。。。 ・・・ ... ・・・ …
三点リーダは二つ重ねるものだ
514 :
デフォルトの名無しさん :2009/10/24(土) 00:46:35
#include <stdio.h> static int local; int main(void) { int in=5, out; // 256 __asm__("movl $0x100, %edx\n\t"); // 破壊レジスタにedxを設定 __asm__("movl $1, %%edx\n\t" "incl %%edx\n\t" "movl %%edx, %0\n\t" :"=b" (out) :"a" (in) :"%edx" ); // edx = 2になってしまう、期待していた値は256 __asm__("movl %edx, local\n\t"); printf("edx = %d", local); return 0; } 破壊レジスタにedxを指定したのですが、拡張インラインアセンブラ内で変化させた値がそのまま表示されてしまいます。 破壊レジスタとは、拡張インラインアセンブラ内にて、この場合edxに変な数値を入れても拡張インラインアセンブラの処理が終われば 元に戻っていうという事ではないのでしょうか?
warosu
...?
asm文中でレジスタの自動割当する際、指定したレジスタを自動割当しないという宣言。 例をあげると、こう。 # ソース1 int in=1, out; asm("movl %1, eax; incl %eax; movl eax, %0;" :"=r"(out) :"r"(in)); # 出力1 movl %eax, %eax incl %eax movl %eax, %eax # ソース2 int in=1, out; asm("movl %1, eax; incl %eax; movl eax, %0;" :"=r"(out) :"r"(in) :"%eax", "%ebx", "%ecx", "%edx", "%esi"); # 出力2 movl %edi, %eax incl %eax movl %eax, %edi なお、全ての汎用レジスタを指定すると、 「冗談は顔だけにしとけよ。割り当てられるレジスタが無いじゃんか。」 とコンパイラが文句を言う。
518 :
デフォルトの名無しさん :2009/10/24(土) 10:30:50
#include <stdio.h> int main(void) { int in=1, out; __asm__("movl %1, %%eax\n\t" "incl %%eax\n\t" " movl %%eax, %0\n\t" :"=r"(out) :"r"(in) :"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi"); printf("in = %d, out = %d\n", in, out); return 0; } 破壊レジスタに指定されたeax,edi,ebx,ecx,edx,esiは、 出力オペランド及び入力オペランド(%0,%1)では使用されない ということでしょうか?
-Sつけて、asmのソースを見たら
520 :
デフォルトの名無しさん :2009/10/24(土) 15:06:45
何がしたいのかよくわからんのよね
522 :
デフォルトの名無しさん :2009/10/24(土) 15:28:14
>>521 :"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
この部分のエラーの事なら察してください
破壊レジスタにeax,edi,ebx,ecx,edx,esiのいずれかを指定した場合は、
出力オペランド及び入力オペランド(%0,%1)の演算等では使用されない
ということでしょうか?
そうだよ、たぶん。
524 :
デフォルトの名無しさん :2009/10/24(土) 15:34:56
>>518 > :"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
察して下さいとあるけど、一応。
この例だと割当可能な汎用レジスタが一つもないから、不可能な指示がある、と
コンパイラが泣き言を言って止まる。
いずれかを指定したならば、明示的・暗黙的を問わず、そのasm文中では破壊しては
いけない用途で使用済みと見なし、%0や%1への割当を行わないだけ。
足りなくなった場合は、使用可能なレジスタの再利用を試み、それが不可能ならば、
やはりエラーを吐いてコンパイル停止する。
あと、こういう違いがある。 int func(void){ register int i1 = 1; register int i2 = 1; asm("addl $1000, %eax;"); i1*=i2; return i1;} ↑の場合、i1 がeax、i2にedxが割当られてしまい、この関数は1000を返す。 int func(void){ register int i1 = 1; register int i2 = 1; asm("addl $1000, %%eax;" :::"%eax"); i1*=i2; return i1;} ↑の場合、i1とi2にeaxを割り当てるのを避けてくれるから、この関数は1を返す。
何がいいたいのか、わからん
529 :
デフォルトの名無しさん :2009/10/26(月) 21:47:00
セグメントベースとは、セグメントアドレスに対して*16を行ったアドレスの事ですか?
ここは学校じゃねえんだ
>>529 IA-32では動作モードによって異なる。
16バイト境界に整列することが推奨された32ビットアドレスである可能性もある。
インテルが無料でPDFを配布してるから、それを読んで。
会員登録とか面倒な事は一切無く、日本語で読める文書を無料で配布してくれてるから。
IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
下巻:システム・プログラミング・ガイド
上中下巻あわせて4つ、これらはダウンロードしていつでも参照できるようにしておくことが大前提。
533 :
デフォルトの名無しさん :2009/10/27(火) 01:06:45
「インテル 技術資料」でググれ。
自助努力を一切しない、できない者に明日は無い。
386以降では動作モードによらず内部レジスタであるセグメントデスクリプタキャッシュのセグメントベースとリミットが用いられる 従ってリアルモードでも一応32bitアドレスのアクセスが可能
>>533 IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
↑これで検索すると一発で出てくる。
日本語版あったのか…知らなかった
セグメントオーバライドプレフィックスで同じセグメントでのコピーにならないっけか?
転送元はDS以外を使えるけども、転送先はES固定。 そういや8086はセグメントオーバーライド+REPプレフィックス使うときは DI/EIで挟む必要があったなー、と今思い出した。
Z80にもインデックスオーバーライドプレフィクスwがあったな
セグメントレジスタが違っても同じアドレスを指してることはありうるわけで、 ブロックコピーの範囲が重なる問題には関係ないな。
>>542 0xddと0xfd?
インストラクションセットにない組み合わせも使えた辺りは確かにオーバライドプレフィックスのようだった。
545 :
デフォルトの名無しさん :2009/11/03(火) 23:49:40
ヽ、.三 ミニ、_ ___ _,. ‐'´//-─=====-、ヾ :::::::::/ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ :::::::::ゝ‐;----//::::::ヾ.、
|. \ :::}二. \ ::::::::|.r-'‐┬‐l l⌒::::| }
゙l / :: リ ̄ヽ / :::::::|l:::::::::::!ニ! !⌒:://
_______________/ _,ノ':::::::::::::::::ゞ)ノ./
` ー==--‐'´(__,. ..、  ̄ ̄ ̄ :::::::::::::::::i/‐'/ 菊池ビーーーーーーーーーーーーーーーーム!!!
i , .:::υ_,,_,,,,;;-=、ヾ i::::::::::::::::::::l、_/::|
! '!ヽ_=─'''" ,__) !::::::::::::::::::::|:::::::::::|
ヽ. ゙i ::フ二-r──'''",,,,i' ":::::::::::::::::::!::::::::::::::ト、
/ヽ;. |/二/''"''ヽ-‐'" / ,,:::::::::::::::::::::;!::::::::::::::::::::ヽ、
' i |‐、/ / /:::::::::::::::::/:::::::::::::::::::::::::::::ヽ、
/ | |'' ,.‐''i "::::::::::::::/:::::::/::::::::::::::::::::::::::: ^ヽ
" :l !,゙ヽ--‐─‐'''"ノ:::::::::::::::/::::::::/:::::::::::::::::::::::: `ーフ^ゝ〜ヽ、
,イ ..! \_ ,/:::::::::::::/.:::::::/ ::::::::::::::::: :::/ /.:::. `ー-、
-一⌒ `ヽ、 ....:::::::`、 ` ̄"'''":::::::::::;/.:::::::::::/ ::::::: ./、 /.::::. ー
http://changi.2ch.net/test/read.cgi/csaloon/1257171544/299 『騙すンじゃねぇ、ジパング板から来ちゃったじゃねぇか!!』
LSIC80で8085のコード。ringバッファをXX00番地に配置して、リード・ライトポインタをcharで持つ。 でも ring[rpointer] を参照するにはLXI H,ring で DEreg<--00rpointer を入れて DADする コードが出ちゃうんだよね。HL<--XXrpointer を入れて MOV A,M するような書式 書けないものかな。
つ emit あとは、行儀悪いけど #define ring 0xXX00 unsigned int hl; hl = ring | rpointer; a = *(char *)hl; とか。 ring[rpointer]は、リンクするまでringの値が確定しないので、 ど〜しても16bit足し算することになるんでないかい。
548 :
546 :2009/11/04(水) 13:39:39
char*をuintにキャストして or しても、DEに00rpointerを入れて16bitのor演算されちゃいます。 LDA rpointer ; return( ring[rpointer++] ); の最適化 MOV L,A INR A STA rpointer MVI H, HIGH ring MOV A,M ここまでを_asm_cで書いて、 } にしたらRETは出ました(w
549 :
デフォルトの名無しさん :2009/11/06(金) 22:54:08
あああああああああ アセンブラを書くとき、MIPSとSHの作り易さは異常 その中でも、俺の中ではSHが一歩リードかな 某スセ社の「プスプ」がMIPSでなくSH採用してりゃもっと良かったのに RISCのくせに命令が豪華でサイコー
あっちも面白そうなので見てます。ありがとう。
void ch1puts(_UBYTE* srcp) { /* 送信バッファ書き込みルーチン*/ register _UWORD Rx=c0s_wpt; // loop中はRegに持つ do { /* サイズ回 loop */ s0ring[Rx] = *srcp++; /* 1 キャラ put, srcp++ */ Rx = (_UWORD)((Rx+1)&(sizeof s0ring-1));// カウンタ更新 } while( *srcp ); c0s_wpt = Rx; // ringポインタ更新 SCI0.SCR.BYTE = 0xF0; /* TIE,TE ON */ } 石はH8S。まあ、ふつうに素直なringバッファに書き込むルーチンなんだが
引数はER0に乗ってきて、関数中ではそれをER2に持つ。*srcpをER0のまま使えるのに。 RxにE0を使い、loop中でE0→ER1に毎回ゼロ拡張が起きる。RxにR1を使えばloop前に E1を1回だけゼロにしとけば済むのに。&演算も R1=R1&07FF とワードになる。 R1H=R1H&7 でイイのに。これだからへうのコンパイラ嫌いなんだ。
ルール:R0,1,2は壊してよい。R3-R6は使うなら保存。これだけ。 俺ならこう書く register _UWORD Rx=c0s_wpt; MOV.W @_c0s_wpt:32,R1 EXTU.L ER1 do { L100: s0ring[Rx] = *srcp++; MOV.B @ER0+,R2L MOV.B R2L,@(_s0ring:32,ER1) Rx = (_UWORD)((Rx+1)&(sizeof s0ring-1)); INC.W #1,R1 AND.B #7,R1H } while( *srcp ); MOV.B @ER0,R2L BNE L100:8 c0s_wpt = Rx; MOV.W R1,@_c0s_wpt:32 SCI0.SCR.BYTE = 0xF0; MOV.B 0F0h,R0L MOV.B R0L,@H'00FFFF7A:8 } RTS これがいちばん自然なReg使いなのに
半角カナでコメントを書く奴は信用できない
そこに突っ込むか(w 左右の空き具合とかでアバウトに決めてる。
半角カナが混じってると馬鹿っぽく見えるのはなぜだろう
fjユーザによる洗脳だな 現在では携帯ユーザの総合的知性も絡んでくるかも
sizeof s0ringがどんな値かはコンパイラ君は考慮してくれんでしょ 共用体とか使うことで人的に最適化しないと
unionでlongとMSW,LSWにした構造体を定義すると、レジスタに持たずスタックに置かれました。 register _UDWORD Rx とすると、添え字のアドレス計算の箇所でRxから別のレジスタへの コピーが出て、Rxをオフセットに使いません。 結局、555の右側のコードを__asm { } ブロックの中に書きました。 ライフボートのコンパイラのほうがお利口だったなあ・・・
書き方が悪いような
>>562 553のcコードに対して提案を書いてみて。コンパイルしたlst貼るから。
union { unsigned int WORD; struct { uncigned char high; unsigned char low; } BYTE; } c0s_wpt; cos_wpt.WORD++; c0s_wpt.BYTE.high&=7;
565 :
563 :2009/12/21(月) 15:07:35
>>564 それに対しては
>>561 で悪くなる、と報告してます。lstは貼りますが・・・
void ch1puts(_UBYTE* srcp) { // CH1
_ch1puts:
SUBS.L #2,SP
typedef union {
unsigned int WORD;
struct {
unsigned char high;
unsigned char low;
} BYTE;
} t_wreg;
register t_wreg Rx;
Rx.WORD = c0s_wpt; // loop中はRegに持つ
MOV.L ER0,ER2
MOV.W @_c0s_wpt:32,R0
MOV.W R0,@SP
566 :
つづき :2009/12/21(月) 15:08:56
L4706: do { // サイズ回 loop s0ring[Rx.WORD] = *srcp++; // 1 キャラ put, srcp++ MOV.B @ER2+,R0H MOV.W @SP,E0 MOV.W E0,R1 EXTU.L ER1 MOV.B R0H,@(_s0ring:32,ER1) Rx.WORD++; INC.W #1,E0 MOV.W E0,@SP Rx.BYTE.high &= 7; MOV.B @SP,R1L AND.B #7:8,R1L MOV.B R1L,@SP MOV.B @ER2,R0L BNE L4706:8 } while( *srcp ); c0s_wpt = Rx.WORD; // ringポインタ更新 MOV.W @SP,R1 MOV.W R1,@_c0s_wpt:32
567 :
563 :2009/12/21(月) 15:14:18
あと、
>>554 では
>>553 のコードの展開形のうちダメな点を3点挙げています。
>>564 は1,2番目に対しては何も言っていませんね。3番目に対して的外れな提案しただけ。
最適化されてないようなコードだね。 hewはそんなコードを吐くんだ。
最適化オプションを付けてないか、抑止するようなオプションを付けてるか、なんじゃない?
570 :
デフォルトの名無しさん :2009/12/21(月) 18:40:32
SHかぁっくいぃ!
デバッグ中なので最適化してないんじゃない?
572 :
デフォルトの名無しさん :2009/12/21(月) 21:19:54
日立製のSH向けコンパイラは最適化スイッチはONにしないようにと注意書きされてるよね。 理由は最適化にバグがあるあら止まるかもしれんって内容だったと記憶してる。
最適化ONでデバッグしながら、書き方でコンパイラのバグを回避するんだよ
なんちゅう悲惨なコンパイラや・・・
575 :
567 :2009/12/22(火) 04:05:36
最適化オプションはサイズにしてます。元々コンパクトコード偏執狂なので、 コンパイラにはこれ以上最適化できないことが多いです。 ライフボートのコンパイラにかけたらもっとおバカなコードが出ました。
コンパイラの信頼度なんて本来その程度なわけで。 重要な箇所はアセンブリ言語で書くのが当然。
577 :
567 :2009/12/22(火) 11:34:57
ASMで開発を選ぶよりも、ROMRAM増やして1グレード上の石選ぶほうがトレンドでしょうね。 私のは趣味の領域だし。
趣味ならgcc使ってみるとか
579 :
567 :2009/12/22(火) 17:00:59
それは只でダウロできるのですか?80x86系?それなら仕事で使わないから要りません。 H8系は仕事で使う+趣味も兼ねて凝り倒すので、ライフボートとルネサス落としてますが。 ライフボートのコンパイラに同じコード食わせたら、個々のモジュールはおバカでもLINKした結果は ルネサスの1/4になりました。20995 bytes 対、5732 bytes。LIBの出来で勝負!みたい ですね。くっついてくるLIBを除いたuser部のコードは、ルネサス400h〜1005h、ライフB 400h〜103Bh ライフBのほうが僅かにおバカですが、大差ではない。 ライフBは、組み込み向けに、 「整数型変換だけの printf/sprintf のLIB」 を提供していて、これが効いています。 LIBの差で15KBですからね。まあ、今のROMは32KBや64KBが無いから、それが何? なんですけど(^^; とにかく小ささに燃えるシーラカンスPGのぼやきです(^o^) 火星に飛ばす8085をコードしたかったなあ・・・
gdlで検索してみて
仕事といったり趣味といったり バカは忙しいな
> それは只でダウロできるのですか? その「俺は頭悪いです」って自己紹介してるような文章をまずなんとかしたら?
整数専用printfくらい自分で書けとしか言いようが無い
gcc知らないとか技術者として駄目だろ・・・
gccなんて、使わない仕事の方が多いだろう。 使ってる人はそれしか使わないから、 みんなが使ってると錯覚するのかもしれんが。
使わなくても名前くらいは知っておこうよ、というレベル。
587 :
デフォルトの名無しさん :2009/12/23(水) 03:25:31
別にgcc知ってるくらいで威張ることも無いが 知らない奴は、恐ろしく狭い世界で生きてるんだろうなぁという予想は出来る 本当に哀れなのは誰なんだろうな
589 :
567 :2009/12/23(水) 06:25:21
いろんな反応が来てますね〜
>>580 ありがとうございます。
unix登場以前からPGやってたんだから、今の標準的な教養と違ってるのは自覚してます。
趣味を仕事にしていられるのは、いい境地だと思いますけど。2年程前まで年\700平均
ぐらい貰えてたし。ここ2年で \150 \100 ぐらいに減ってきたけど、年金が始まったし(w
今は下積み2足の草鞋+年金ほぼ3等分ですね。
今ライフボートの本見てるんだけど、表紙の写真が3.5インチのフロッピー。
591 :
567 :2009/12/23(水) 16:26:22
>>580 gdl 使ってみました。複数ファイルリンク機能とか無いみたいなので、全部ひとつの
ファイルにして読み込ませればいいですか? 割禁とかマシン依存な機能はどう書けば
いいのでしょう? 割り込み処理関数の書き始めも文法違うみたい。
展開したフォルダの中にマニュアルみたいのが見つからないんです。
割禁とかマシン依存な機能は自前で用意しないといけない h8 gcc で検索すると親切な人と出会えるかも
正直 "かも" はいらない; キモチワルイ;;
595 :
591 :2009/12/27(日) 15:15:23
>>594 もしかして私のことかな?ライフボートのcでH8Sのアプリを書いたのですが、
gdlという物を教わったのでそれで開発してみようとしたのです。
売り物のコンパイラと違ってnetのマニュアル見るとオプションが多すぎてパニクったり。
DEFファイルとか雛形を読んでstartupファイルやリンク情報やベクタ部の書き方とか、
どこに置けばよいか、など見当がついてきたところです。
今はlinkでerror: no memory region specified for loadable section `.data.align4 という
ので引っかかってます。h8rom.xというlink制御文ファイルのどこかがいけないんだと
思うんですが、これの文法が見当つかない。
596 :
591 :2009/12/27(日) 16:35:26
link制御文が1箇所、標準のフォルダのと違ってました。(.dataの中身が1行足りなかった) linkまで行ったので、割り込みハンドラ関数を書こうと思い、 void rxrdy0(void) __attribute__ (( interrupt_handler )); void rxrdy0(void) {/* SCI0受信 int. */ r0ring[c0r_wpt++] = SCI0.RDR; // ringバッファに格納 SCI0.SSR.BIT.RDRF = 0; // 割り込み要因 リセット } という関数を書いてみたのですが、-SでASMコード見るとこの関数が出てない。なんで?
SCI0.SSR.BIT.RDRF = 0; は思ってるコードが出ないかもしれないよ
598 :
591 :2009/12/27(日) 22:15:22
ライフボートとルネサスのcではBCLR命令が出たんですけどね。 上のほうにr0ring[c0r_rpt++]から読み出す関数はコンパイルされて命令出てるんです。
599 :
591 :2009/12/28(月) 00:27:21
linkが成功したときの暫定版でのサイズは、ルネサスより巨大でしたね。 関数の入り口出口で必ずスタックフレーム確保/返却とか、 引数のレジスタはそのまま使わず、関数内で使うレジスタに移すとか、 cの標準に従った展開するらしいので、しょうがないですね。 LIBもフルセットのが付いてくるみたい。 ルネサスもライフボートもそれなりの性能を 提供しているんだな、とおもいました。
-fomit-frame-pointer
601 :
591 :2009/12/28(月) 00:52:27
わを! そんなオプションがあるんですね。ありがとうございます。 最適化レベル2と3で、簡単な関数は手ASM並になりました。 割り込み関数も、起動しなおしたせいか、最適化レベルを設定し直したせいか、 出るようになりました。 後は割禁命令だな。3694.hファイル見てたら、 #define DI asm("orc.b #0xc0,ccr") #define EI asm("andc.b #0x3f,ccr") と、ありました。H8Sはbit7に対してこのマクロを書けばいいですね。 startupは、初期値コピー不要でRAMクリヤは後で実行したいから、JMP _main だけにします。 これで外回りは全部埋まったかな。
602 :
591 :2009/12/28(月) 01:32:15
BCLR/BSETは、LD mask ST 型で出るんですね。ここが残念
603 :
591 :2009/12/28(月) 03:48:50
なんか、いじってるうちに h8300-elf-gcc: no input files というエラーで失敗するようになった。ちゃんとファイルは開いてるのに。
>>602 volatileがついてるとそうなる。
volatileを外すとBCLR/BSETを使ってくれるけど、
書き方によっては最適化されて思ったコードがでなくなることがある。
gccのソースにパッチを当てれば、
volatile付きでもBCLR/BSETのコードを吐かせることは出来るけど
gccのビルドが大変かな
605 :
602 :2009/12/29(火) 03:40:53
ホントだ。iodefine.h見たら、ぼらちるついてます。DI/EIみたいにマクロにできませんか? #define BITON(x) asm("BSET @" #x "\n") とか・・・(これはLSIC85のマクロですが) 1行の |= とか &= をDI/EIで挟むのってうるさいですよね。
606 :
602 :2009/12/29(火) 04:43:33
ライフボートのcでは、初期値ゼロが不要な領域(ringバッファ)に別のセクション名を与えて、 デフォのセクション名の領域だけをクリヤする、ってことをできたんです。 GCCで似たようなことをするにはどういう手法がありますか?
607 :
602 :2009/12/29(火) 08:42:14
cのグローバルな変数はCOMMONに配置され、bssにはstaticな変数が配置されるみたい。 どうやらLINKまでたどりつきました。objcopy -I coff-h8300 -O srec a.out 167.MOT とやると、a.out: Invalid bfd target というエラーが出ます。これは何がいけないんでしょう?
608 :
602 :2009/12/30(水) 04:18:18
coffとかelfとかのファイル型式が理解できてないですが、-O srec a.out xxx.MOTで MOTに変換できました。BIT操作は素直に割禁使うことにしました。 RAMクリヤが必要な空間だけ隔離できないのがちょっと残念ですが性能上は問題無い。 でもRAM16Kのうち2Kもlibが使うし、ROMもアプリ6Kでlibが28K。どちらも余っているから いいけど、なんかグヤジー・・・
asm volatile ("bclr %1,@%a0:8": :"i" (&SCI0.SSR),"i"(6)) かな?
>>606 __attribute__ ((section ("bar")))
611 :
デフォルトの名無しさん :2010/01/06(水) 05:58:30
わを・・・
>>609 は605へのレスですよね。 ありがとうございます。試してみます。
612 :
611 :2010/01/06(水) 13:28:00
どちらもうまく行きました。
>>610 は変数毎に与える必要がありました。
セクションbarをbssの前にすることで、クリヤ範囲を大幅に減らせました。
barじゃなくて、.noclearとかにしたほうが...
614 :
デフォルトの名無しさん :2010/01/06(水) 21:48:46
キニシナイ!!
615 :
デフォルトの名無しさん :2010/01/06(水) 21:52:20
アセンシー
616 :
611 :2010/01/07(木) 05:01:00
>>613 あはは・・・そうですね。コピペをそのままLINKしてしまった。
617 :
611 :2010/01/07(木) 05:39:45
>>609 割り込み要因クリヤは割り込み処理の中だからムリにASMで書かなくてもいいかと
思い直しました。 でも609の書き方は理解したいので教えてください。
SCI0.SSR.BIT.RDRF = 0; // 割り込み要因 リセット の行を書く場合、
asm [volatile] ("BCLR %1,@%a0:8"::"i"(&SCI0.SSR.BIT.RDRF),"i"(6)) ; と書いて、
BCLR #6,@FFFF7C:8 になるんですか? volatileは必須ですか?
"i" がどこに展開されるか判らないのが不安です。
619 :
611 :2010/01/07(木) 08:41:36
ありがとうございます。そこは私もブックマークしてました。長すぎてなかなか読み切れない(w
620 :
611 :2010/01/07(木) 08:47:01
「C の式をオペランドとするアセンブラ命令」 の章あたりですね。
621 :
611 :2010/01/07(木) 09:10:53
asm volatile ("BCLR %1,@%a0:8"::"i"(&SCI0.SSR),"i"(6)); でコンパイル通りました。 ビットフィールドのアドレスを書いてはいけないと怒られました。 volatile はこの場合はつけなくても大丈夫なようです。
622 :
611 :2010/01/07(木) 09:12:46
Sファイルで、ポートアドレスが 16777084 とか10進で表現されるのは辛いですが、 これを16進で表現させる手段はありますか? 基数で検索が引っかからない・・・
>>621 ,622
パラメータ使わないときはこんな書き方になる
asm volatile ("bclr #6,@0xFFFF7C:8")
624 :
611 :2010/01/07(木) 15:03:46
612のときはその書き方で通しました。txend割り込み処理なんか push/pop 無しになります。 例えばcの上のほうで asm ("RDRF EQU 6") を書いて、下の方で asm ("bclr #RDRF,@・・・ なんて書き方も許されるのでしょうか?
>>624 gccのasmって、なんでもありみたいなところがある。
自分は関数の外でこんな書き方したことがある。
asm ("\n\
\t.equ\tB7\t,\t7\n\
\t.equ\tB6\t,\t6\n\
\t.equ\tB5\t,\t5\n\
\t.equ\tB4\t,\t4\n\
\t.equ\tB3\t,\t3\n\
\t.equ\tB2\t,\t2\n\
\t.equ\tB1\t,\t1\n\
\t.equ\tB0\t,\t0\n\
");
-Sオプション使うより
h8300-elf-gcc -O2 -fomit-frame-pointer -c sci.c -Wa,-L,-a=sci.lst
で,アセンブラのリスト出した方が見やすいかも
gccっていうより、gasの使い方を調べた方がいいようなところに来ちゃったね。
627 :
611 :2010/01/08(金) 16:36:03
そのオプションでアセンブリリスト.lstが得られました。ありがとうございます。 これだとポートアドレスなんか確認しやすいですね。 7F7A7250 BCLR #5,@16777082:8 ポートFFFF7Aと判ります。
>>608 newlibを-O2 -fomit-frame-pointerでビルドしなおせば、少し小さくなるような気が
-O2は太るでよ。 小さくしたいなら-Osだな。
630 :
608 :2010/01/10(日) 04:57:26
-O2は太るのは実感しました。データフロー解析?っていうのが適用されるみたいで、
task1{ core(&cont1); } task2{ core(&cont2); } みたいに、構造体を使って制御構造を
共有するタスクを複数書いたら、constの構造体が指す変数を直接使って同じ制御構造を
複数のタスクの中に展開形で書いたコードが出ました。
>>628 printfのフルセットが付いてくるのが本質なので、その手法は歌丸にワカメだと思います。
ライフボートは、整数型変換だけの代替printfを用意することで解決しました。
-finline-functions 単純な関数を呼び出し側に統合する を無効にしてみるとか
rx-elfだとこんな感じ asm volatile ("bclr %1,%0.B"::"Q"(IR215),"i"(IRn_IR_BIT))
IARのcで、extern _UWORD c0s_wpt,c0s_rpt; _UWORD ch1_empq(void) { return ((c0s_wpt - c0s_rpt)&2047); } はOKなのに、 そのlstの内容を.s37にcopyして、AH8 -ml -L でアセンブルするとエラーになるの。 MOV.W @c0s_wpt:32,R6 が Illegal effective address になる。 ど〜すりゃいいんじゃ!
634 :
633 :2010/01/22(金) 05:06:52
AH8だと、:32を明示的に書くといけないみたい。:32を書かないとOKになった。
635 :
デフォルトの名無しさん :2010/01/27(水) 05:05:42
アセンブラで書くなら特権レベルを変えたいぜ
特権レベルないマイコンの方が多いでしょ
画像処理では単純な処理を何回も繰り返すから、ほんの少しの最適度の差で処理速度が全く変わってくる。 だから部分的にアセンブラで書くことは良くあるよ。
SSEみたいなコンパイラで最適化が予想しにくいCPU命令を使ったりすることもあるしなぁ。
>>371 馬鹿か。
nProtectとかX-Trapみたいなゲームのセキュリティ機能をぶっ潰すのにそういう知識が必要なんだよ。
>>639 いつもいつも同じ台詞。聞き飽きた。
チート関係は升スレでやればいいだろ。
>>638 それ困ったよなあ
x64はインラインアセンブラ禁止とか困った事やってくれるし
MASMで書いている俺に隙はない。MASM自体に色々バグあるけどね!
644 :
デフォルトの名無しさん :2010/01/30(土) 15:45:55
TASMのほうがなんとなくすき
どうしてこれでn/3が計算できるのですか? mov eax,55555556 imul dword ptr [n] mov eax,edx shr eax,1f add eax,edx //eaxに答えが入る
これを別スレで質問したの自分だけど 勝手に人の質問をマルチにするのやめれ
n/3はn*(1/3)と直せるだろ じゃあn*(2^31/3)*2^31とも直せるわけだ
まちがwた n * ((2^31) / 3) / (2^31)ね・・・
あっちの解説のほうがわかりやすい
あっちって何処だよ。 探すのめどい
マルチ
分かりやすいもくそも マルチって書いてるからヒントくらいで十分だと思ったんだよ で、どこで解説されてるんですか?
数行になっても3で割るより速いのかな?
割り算の高速化はテーブル参照しかない?
パイプライン化でレイテンシ隠蔽するか、そもそも割り算しないのが高速化の定石
いや、/3と、*1/3+シフトでどっちが速いの? って素朴な疑問なだけなんですけど
最近のプロセッサだと、実行してみなけりゃわかんない。 実行してみてもわかんない。そんな感じ。
>>657 cpu次第。
で、asmコードをみてクロック数調べればいい。
パイプラインに入ってしまう大きさならクロック数見ても意味無くね?
1回しか実行しないとか、 周辺に演算結果による分岐がないなら、 そうだろうけど、演算速度気にするくらいだから、 多少は回すんじゃない? x86前提とも限らないし。
演算器が余りそうなやつを使った方が早いだろ。 いまどき論理CPUがないやつなんかないわけだから 実CPUで動くか論理CPUで動くかによっても違ってくるだろ。 当然実CPUで動くか論理CPUで動くかは、OSによってもその確率は変わってくる。 また、プログラムサイズが微妙なときはキャッシュに入りきるかどうかも影響してくるし 母数によっても違ってくるんじゃないかな。 86命令なら短いけど、 命令長が全部同じ長さのCPUとかでは命令が増えた分だけ大きくなるし。
663 :
デフォルトの名無しさん :2010/02/16(火) 22:46:02
invoke age
構造化アセンブリ言語のマクロ表記すら完全に無視して独自の記法を作り上げた挙句 その仕様を残さなかった団塊の弟子(ベビーブーマー) C/C++が読めないとお冠です。 Cでかいてコンパイラ掛けて読めよ。もう好きにしてくれ。 老人介護はたくさんだ
せめて日本語で書いてくれ
日本語本当に分かるか?
構造化コボルってのもあったような
OO COBOL すらあるぜ。
test
671 :
デフォルトの名無しさん :2010/03/09(火) 04:15:38
オブジェクトフォートランとか オブジェクトエイダとかもあるのかな
_UBYTE ringrd(void) { の最適化。IARのcだから返却値はR6L。 mov #ring,ER5 ; ER5 = FFxx00 mov @rpt,R5L ; + リードポインタ mov @ER5+,R6L ; これが最適化のミソ! mov R5L,@rpt ; return( r0ring[c0r_rpt++] ) rts [256]のringはLINKでFFxx00に配置する。cだとアドレス演算が出てこの倍
オブジェクトアセンブラはないの?
それはマクロアセンブラと何が違うんだい?
676 :
672 :2010/03/31(水) 04:04:16
俺にレスがついたのかと思ったらアンカー間違いか
CASLで素数求数してみた ロジックはすぐできた ディスプレイ表示で幽体離脱するほど苦しみ厨
素数サーバーを作って クライアントの画面に出せば良い
679 :
デフォルトの名無しさん :2010/09/17(金) 23:20:07
そうなの?
680 :
デフォルトの名無しさん :2010/09/19(日) 14:13:00
for(i=0;i<16;i++) a[i]^=(d[i]+c[i])%16; このプログラムをSSE2で書きたいのですがわかりません。 教えてください。よろしくお願いします。 C言語からインラインアセンブラで呼び出したいと思うのですが、 うまくいきません。 moveq d,%xmm0 moveq c,%xmm1 paddb %xmm1,%xmm0 moveq a,%xmm1 pxor %xmm1,%xmm0 配列のデータをレジスタにセットするところもわかりません。
>>680 > このプログラムをSSE2で書きたいのですがわかりません。
なにが、どう、わからないんだ?
> C言語からインラインアセンブラで呼び出したいと思うのですが、
> うまくいきません。
どううまくいかないんだ?
エラーがでるのか?でるならエラー内容は?
> 配列のデータをレジスタにセットするところもわかりません。
SSE2の前にアセンブリ言語はわかるのか?
64ビット環境だとそもそもインラインアセンブラ廃止されたような
683 :
デフォルトの名無しさん :2010/09/19(日) 15:55:49
x86アセンブラ入門という本を参考に高速化しようとしてるんですがアセンブラ はよくわかりません。 ただC言語で書いたプログラムをSSE2で書き変えたら早くなるだろうと思ってます。 アセンブラの命令は書いてあるのですがインラインアセンブラを使って書けない のです。丸投げで悪いのですが教えてほしいです。
それはさすがに丸投げ過ぎる SSE2とかいう以前の問題 まずはハロワ並みのコードをアセンブラで練習するべき
685 :
デフォルトの名無しさん :2010/09/19(日) 16:01:45
そもそも早くなるんでしょうか?
ベクトル化に適した処理と適してない処理がある ケースバイケースなのでなんとも言えない 十分独立した演算を行う場合でも、 レジスタに出し入れするのに複雑なデータ変換や余分なメモリアクセスが挟まると 場合によって遅くなったり
687 :
デフォルトの名無しさん :2010/09/19(日) 16:08:26
基本的に行列演算です。 データの配列の添え字を計算する16バイトの配列どうしの計算を paddbとpxorを使ってループなしで計算できるのではと思っています。
>ハロワ並みのコード ハローワーク並のコード?と一瞬納得してしまいかけて
Hello, world!
>>687 多分速くなるんじゃない
やってみないと何とも言えないけど
691 :
デフォルトの名無しさん :2010/09/19(日) 16:52:16
gcc -tfree-vectorize *.c で自動ベクトル化コードを生成する というオプションがあるので試してみたけど全然変わらなかった。
693 :
デフォルトの名無しさん :2010/09/19(日) 18:37:50
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3 早くなったとは体感できないけど、アセンブラソースは小さくなった。
-S でアセンブラのソースを出力して比較しようぜ
ループ構造のコードとかを適切に書かないと ベクトル処理向けには上手く最適化されないぞ。
696 :
デフォルトの名無しさん :2010/09/19(日) 18:58:33
これがベクトル化されれば夢のような話だ! for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)%255)+1]; d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])]; } }
697 :
デフォルトの名無しさん :2010/09/19(日) 19:30:36
int a[]={130, 160, 130, 193, 130, 211, 130, 241, 130, 160, 130, 169, 130, 241, 130, 196}; int b[]={131, 94, 131, 129, 131, 84, 131, 140, 131, 139, 131, 95, 131, 67, 131, 96}; int c[]={123,111,222,231,132,125,124,133,122,147,158,210,1,2,3,4}; int main(void){ int i; for(i=0;i<16;i++) a[i]^=(b[i]+c[i])%16; } $ gcc -O3 -ftree-vectorize -ftree-vectorizer-varbose=5 -mmmx -msse2 -S v.c[1P[1@e v.c:8: note: dependence distance = 0. v.c:8: note: accesses have the same alignment. v.c:8: note: dependence distance modulo vf == 0 between a[i_21] and a[i_21] v.c:8: note: vect_model_load_cost: aligned. v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 . v.c:8: note: vect_model_load_cost: aligned. v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 . v.c:8: note: vect_model_load_cost: aligned. v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 . v.c:8: note: vect_model_simple_cost: inside_cost = 1, outside_cost = 0 . v.c:8: note: not vectorized: relevant stmt not supported: D.1523_11 = D.1522_10 % 16 v.c:5: note: vectorized 0 loops in function. ベクトル化できない。なぜ?
698 :
デフォルトの名無しさん :2010/09/19(日) 20:49:25
こう書いたらアセンブラソースリストが2倍近く小さくなった。 for(i=0;i<16;i++) a[i]^=(b[i]+c[i])&0xff;
a[i]^=(b[i]+c[i])%16; a[i]^=(b[i]+c[i])&0xff; って同じことをするんですか
700 :
デフォルトの名無しさん :2010/09/19(日) 21:13:06
違うみたい
701 :
デフォルトの名無しさん :2010/09/19(日) 21:53:31
a[i]^=(b[i]+c[i])&0xf; の間違い。
>>696 そもそも、アドレスの遷移が複雑すぎて
ベクトル処理向きじゃないんじゃねえか?
テーブルがキャッシュに載りきるぐらいなら
別の方法で速くはなりそうだが。
>>698 0xFF は 255 だぞ。
703 :
デフォルトの名無しさん :2010/09/19(日) 22:01:23
255以下の数に変換したいだけです。 256は要らない。 行列の大きさは4kbyte位なのでキャッシュに入りそうです。 別の高速化でもいいので教えてください。 配列のメモリアクセスがボトルネックになっている可能性があります。
704 :
デフォルトの名無しさん :2010/09/19(日) 22:04:34
部分的にベクトル変換に成功しているのですが実行速度が-O3のみの 時より10倍くらい遅くなってしまいます。 なぜでしょう?
配列の中身は、256以上の時はあるのかい?
706 :
デフォルトの名無しさん :2010/09/19(日) 23:43:22
h[32][256] GF[256] FG[256] 配列はこれだけです。
配列をintで宣言してるけど、unsigned charで宣言は出来ないのかなと思って
708 :
デフォルトの名無しさん :2010/09/19(日) 23:50:45
unsigned charにすると自動ベクトル生成に失敗します。 -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
sse使わないと早くならないのかいな?
710 :
デフォルトの名無しさん :2010/09/20(月) 00:03:46
行列演算なのでループをなくしたいです。 128ビット演算なのでSSE2で最適化できるかと思ったのです。
データの中身は8ビットみたいだけど(intでも32ビット) 見間違いかな
712 :
デフォルトの名無しさん :2010/09/20(月) 01:45:36
データは8ビットで統一されてます。出力は8×32ビット
2個コードがあるから、どっちのことかわかんねえじゃねえか。
714 :
デフォルトの名無しさん :2010/09/20(月) 02:11:44
for(i=0;i<16;i++) a[i]^=(d1[i]+c[i])&0xff; こっちはintにすれば自動的にベクトル処理してくれます。ただ32ビット なので16個いっぺんに計算してくれているかどうかはわかりません。 本体部分が for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)&0xff)+1]; d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])]; } } です。SIMD以外でもキャッシュを工夫して高速化できればいいかと思います。 何かいい方法があったら教えてください。
スレタイに従うなら、アセンブラで書いた方がいいんじゃないの
716 :
デフォルトの名無しさん :2010/09/20(月) 09:13:39
次のようにして本体部分の自動ベクトル化も成功しました。 2秒ほど高速になりました。 for(k=0;k<500000;k++){ for(j=0;j<16;j++){ o=FG[a[j]]; p=FG[b[j]]; for(i=0;i<16;i++){ e1[j][i]=((o-1)+(h1[p][i]-1))&0xff+1; e2[j][i]=((o-1)+(h2[p][i]-1))&0xff+1; // d1[i]^=FG[mlt(o,h1[p][i])]; // d2[i]^=FG[mlt(o,h2[p][i])]; } } for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[j]^=GF[e1[j][i]]; d2[j]^=GF[e2[j][i]]; } } for(i=0;i<16;i++) a[i]^=(d1[i]+c[i])&0xff; for(i=0;i<16;i++) b[i]^=(d2[i]+c[i])&0xff; }
717 :
デフォルトの名無しさん :2010/09/20(月) 12:11:15
嘘です。18秒かかります。 GPGのAESは7秒 orz
718 :
デフォルトの名無しさん :2010/09/22(水) 09:23:22
#include <stdio.h> #include <stdlib.h> int main(void){ unsigned long long int a,b; a=strtoull("0x1111111111111111",(char **)NULL,16); b=strtoull("0x2222222222222222",(char **)NULL,16); a=a^b; printf("%llu\n",a); return 0; } このプログラムをMMXを使って最適化したいのですがわかりません。 アセンブラで書くしかないのでしょうか。
ここの掲示板って知ったかぶりでメーカーの商品の批判ばっかりしてる奴ばっかりだね。 どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか? お前らまともに勉強してから文句言え。
XCode 3.2.3 で Release | i386 構成でアセンブルすると どうも 64-bit でアセンブルされてるように見えるんだけど Debug | i386 構成だとちゃんと 32-bit でアセンブルされてるようだ Release 構成でも 32-bit でアセンブルされる方法はないのかな? OS: Mac OS X 10.6.6 CPU: Intel Core 2 Duo XCode: 3.2.3 (64-bit)
723 :
デフォルトの名無しさん :2011/02/11(金) 20:17:58
age忘れた
724 :
デフォルトの名無しさん :2011/02/16(水) 11:21:48
え?
725 :
デフォルトの名無しさん :2011/03/10(木) 07:16:19.45
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
http://sky.geocities.jp/ttl_ttl_ttl_pic/ NASMでC言語を作る NASMで高度な設計書類とNASMの簡単な利用方法のサイトです
C言語のHEADの作り方 DLLファイルの作り方が書いてあります
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
726 :
デフォルトの名無しさん :2011/03/10(木) 07:25:36.87
Rubyで書こう
×C言語を作る ○Cの下請け処理を汗で書く?
アホは逝け
は〜い、逝きますwww。
x86とAMD64(?)64bitのやつの逆アセンブルとアセンブルをプログラムから利用出来るようなライブラリってありませんかね? アセンブラインタプリタみたいなので利用したい
732 :
福盛俊明 :2011/03/27(日) 03:00:55.53
アハ〜♪”
>>731 ?
クロスアセンブラって知ってる?
インタプリタは無理だけど(てか、インタプリタ自体に32bit/64bitが有っても、ソースにbitは関係無いし)、バイナリ作るだけなら、理論上、16bitOS上でも64bitのバイナリ作れるよ
ちょっと調べればアセンブラは32bitでも64bitのバイナリ作れるのは有るんじゃ無い?
ちなみに、x86のgasにちょっと細工するだけで、GBA(ARM)向けのバイナリが作れます クロスアセンブラは簡単にアーキテクチャの壁を超えられる良い例ですね (アセンブラの場合、アーキテクチャの壁とハード仕様の壁、両方超える必要が有りますが)
ぐぬぬ
>>734 そうそうだから文字列をバイナリに変換するライブラリが欲しい
作れるだけでいいんです
例えばプログラムでアセンブラを変換してバイナリを生成して
メモリに投入して関数ポインタで呼び出して実行するみたいなことがしたい
もちろん逆もしたいので逆アセンブル機能も欲しい
要するにメモリ上で現在動いてるプログラムの関数をリアルタイムでデバッグしたい そういうレベルのデバッガを作ろうとしてて、アセンブラライブラリが欲しいんです
自分で作るしかないでしょ
俺はVSの逆アセで済ましてるな。作るの面倒。 理論上は、数値入りの命令は工夫が居るけど、全種類のデータあれば単純に検索だけで実装できるよね。
オペランドに計算式書けるようにするとかしなけりゃ 大した手間かからんべ 命令コード汚いと泣きたくなることもあるが
それもある 自分で実装すると変数やラベルまでやるのは大変だから ライブラリであると助かるんだよな
汗にライブラリってのがわからん
アセンブリ言語で書かれたライブラリ、にしろ アセンブリ言語から利用するライブラリ、にしろ 普通にあるものだと思うが
今時、そんな発想するんか?
JITコンパイルか動的バイナリ変換でもしたいのかと思った
Windowsの通常あり得ない方法でプログラムを動かしたりするのに バイナリをあらかじめ用意するとか出来ないし オフセットが変わるとごろっと変わってくるからね というかリアルタイムでメモリをいじって挙動を調べたりすることをやってるもんで まさにアセンブラのインタプリタが欲しいのですよ
ハッカーになりたいんだったら、こっそりやったほうがいいよ
そういうことをやりたいなら、一行アセンブラくらいサクッと 作れないとダメだろう
アセンブラは力技だから誰がやってもサクッとはいかないよ 何千行のソースは約束されてるし
アセンブラで一度実用的なプログラムを書いた経験があれば、Cの有り難さが身に染みて分かる
C言語で多くの実用的なプログラムを書いた経験が有れば、アセンブラのここぞというありがたさが身に染みてわかる
>>752 あほか
思いっきり機種依存の話をしてどうする
>>751 には同意出来るが、
>>752 には同意しかねるな
実用的なアプリ = 速度が要求されるアプリとは限らないし、移植性や保守性を考えたら、アセンブラは使わないに越した事はない
Cじゃ速度的に間に合わなくてCPUごとにアセンブラ使ってる俺涙目 ちなみに今度8種類目
C で書いてても、大事なところは objdump 等で アセンブラを確認してる。
cは 「抽象化されたアセンブラ」 である、ってのは至言だよな
節電が一番大事な世の中になってきた C、アセンブリ語、マシン語を紙に書く時代に戻るの?
休肝日をまねて休電日を作るとか。
コーディングなんて仕事全体の2割以下だろ。
そして唯一の楽しいフェーズなんだ。
昔のファミコンプログラマーはなんでもかんでもアセンブラーで書いて、すごいと思います。
当時の開発環境で C 使うのも、それなりに苦行な気も。
intが2バイトだったりとかいろいろ気をつかうからねぇ
アマチュア時代、MSXでC言語でゲーム作ったりしていました。 hello,worldをコンパイルするだけで4分ぐらいかかってました。その間フロッピードライブが ものすごい勢いで動き続けるのでいつか壊れるだろうと思ってました。 ゲームが完成する頃には総コンパイル時間が1時間ぐらいだったと思います。 完成したゲームをMSX-FANに投稿しましたが、採用されませんでした。 私の苦労は・・・。 ちなみに当時のソースをひっぱりだしててきて、Phenom II 3GHzという環境上で、CP/Mエミュ レータ+コンパイラでコンパイルしたら物の数秒でコンパイル完了しました。
数秒も掛かったのか。 CPUがざっと1000から1万倍、ディスクがざっと1000倍速くなっていることを考えると遅過ぎる。
>>766 あの時代だとBDS-Cあたりか
俺は耐えられなかったのでTurbo Pascalで遊んでた
>>767 Z80エミュレーターで走ってるんだから十分速いだろう
マルチコア使うアセンブラ、どう書いたらいいのか全然わからん。。。 誰かマルチコア cortex-a9 の使い方、 どこでどう勉強したらいいか教えてください。
マルチコアで書き方が変わることはありません。 atomicな処理が出来れば、ハマることはないと思うけど
シングルとして書いた処理をマルチスレッドにすりゃいいだけでは? 例えば0から100の処理をループする時に 偶数用スレッドと奇数用スレッドを用意してインデックスを渡して 後の処理内容はまったく同じ
>>769 メモリバリア・キャッシュ、
グローバルなリソースの排他、
プライオリティ インバージョン
の3つが解っていればあとは応用編。
単にスレッド3本走らせるだけなら
>>770-771 のとおり何も変わらん。
待ち合わは wfe とかか。
x86でリング3で実行出来るキャッシュフラッシュ命令はありませんか? INVDやWBINVDは特権命令なので実行しようとすると例外が出て止まります
リング3を解除すること考えたら
その状態でキャッシュフラッシュせにゃいかん状況が想像できない ハード絡みならそっちからフラッシュ要求だしてもらうべきだろう
>>774 そうですねデバイスドライバモドキを作ってそこで実行するかな
>>775 2つのアルゴリズムを比較したい時に前のデータがキャッシュに残っていたら
アレなので両方ともキャッシュをフラッシュしてから実行開始する簡単な方法が
あればと思いました
全く関係ない巨大配列を読み書きすれば、テストデータがキャッシュから追い出されるんじゃない?
その後キャッシュされるのに
>>779 それでいいんだよ
それぞれのアルゴリズムのテスト前にキャッシュから追い出せばいいわけ
今時のOSで、キャッシュフラッシュして何やりたいんだか 実行時間計測?
>>781 キャッシュフラッシュの用途で、それ以外何があると
なんだかなあ〜
何だよ ハッキリ言えよ
今時のOSでキャッシュフラッシュとか逝ってるところが
何なのよ?
787 :
デフォルトの名無しさん :2011/10/01(土) 21:24:40.70
Linux のアセンブラ割り込みじゃなくsysenter使ってx86 32bitタイプCPUで出来るんでしょうか? 色々ネットをgoogleで調べたのですが、良くわかりません。 Darwinと64bitタイプ向けのサンプルは発見できたのですが。
788 :
デフォルトの名無しさん :2011/10/01(土) 21:32:41.39
>>787 つづき
コンパイルして動作させようとしたのは、"hello world"を表示するものでした。
ソフト割り込み(かな int 0x80でシステムコールしてました)は上手く動作しました。
>>785 コンテキストスイッチの時にキャッシュ汚染されるから同じようなもんだろうが
>>787 cpuidのsep立ってればできる
今時のCPUなら全部対応していると思うが
791 :
uy :2011/10/03(月) 14:00:28.26
もうどんなときでもアセンブラでかくのは極力やめたほうがいいんだろうな
たとえそいつがかけても、そいつがいなくなったら誰もメンテできないという自体になる
アセンブラでやるっていうのは最終手段になりつつある
>>1 のいうように下手にかけば遅いし、
速いアセンブラコードかくには、アセンブラである程度何か書いた事がないと
コンパイラの最適化の下をいく
アセンブラで速いコードをかけるとか、
そんな技術者はもうほとんどいないし、これから若手がそういう人材になる見込みも
792 :
uy :2011/10/03(月) 14:03:04.75
きわめて薄い ただB言語やPascal言語と違って、上位互換が出てきたわけじゃなく 所詮、いまだアセンブラは奥の奥で使われているから、誰も使えない、誰もかけないなんて状況には ならないんだけどな、 本当の意味で正しくアセンブラ言語を発音できるやつは、いずれ絶滅危惧種になる 才能のないやつがプログラマとして生きるなら「ここ」だよ 「ここ」だけは才能がいらず、知識量だけでやっていける アセンブラはそういうもの ゴミみたいなやつでもできる あ、だけどバカにしているわけじゃないよ がんばれ
そのゴミみたいな奴の一人です(w 実際、古代の石でASM開発された奴の保守は私ぐらいしか出す先がありません。 狭い狭いニッチですが、フジツボみたいにしがみついてます。 趣味+実益(w
箱モノならアセンブラなんぞいっぱいあるだろ
Photoshopのフィルタってアセンブラで書かれてるって聞いたんですが本当ですか?
インラインアセンブラが使えないコンパイラしか持ってないとか そういう理由でもない限り、C/C++で書かない理由が見当たらない。
インラインアセンブラで書く、という意味を含めて、アセンブリ言語で書く可能性としては、 画像のピクセル毎の処理とかで、かつSSE命令を使うとか、飽和加算が必要とか、 いくつか可能性は考えられるけどね。けどまぁほんとにごく一部のコードに限られるはず。
ハッカーもやっぱりアセンブラでプログラム書いてるんじゃないかい? マシン語でプログラム書くの大変でしょ 修正するたびにjmpのアドレス値を全部書き換えなきゃいけないとか
汗でんでんはどうでもよくてマイクロアーキテクチャをどれだけ理解してるってところじゃないかな? シムとかプロフなしに速いループを書くのはやっぱり難しいよ。
16bitあたりならコンパイラよりも人の方がいいコードをかける それ以上はそんなことする気にもなれん
>>801 禁止しない限り人が書いたコードを最適化する RISC チップ用アセンブラもあることだしねぇ
ここでいってるビット数はOPコード長でいいんだよね?
>>803 バイトマシンであるところのx86は8bitかよと
内部バスのパラレル幅 でいいんだよね?
どうでもいい
ALUのbit長にきまっとろうが
今時、何Bit CPUと言う定義は意味がない。
>>804 可変長OPコードだぞ。
>>804 そうそう、x86は8ビットマシンに見えてしまって。
>>807 IBMの S/360,370は、ALUは32bitだったがアーキテクチャーは16bitだった。
たしかに、今では
>>808 が正解のようだ。
リセット直後にコード解釈のためフェッチするサイズだな
H8なんか同じ石でどっちでも動くようになってる。
ワロタ それイイな。 人がコンパイラを越えられなくなったら32bitね
22 名前:デフォルトの名無しさん[sage] 投稿日:04/10/11(月) 20:19:26
>>21 ARMは、そろそろ使用に耐えなくなる頃合だよん
DATとCLKでシリアル出力する関数を、速くするためにforを使わずのべたんで書いた。 ROTL R6 ; MSBから出力 石とASMはH8S BST #1,@P4DR BSET #0,@P4DR BCLR #0,@P4DR これをbit数分、並べた。forのカウントもしないし、cだとportを読んでmaskで変更して 書き戻すコードしか出ないから、cでは書けない関数の好例。
if (hoge & (1 << bit)) *P4DR | = 1; else *P4DR & = ~1; て書いたら bld #bit,RnL bst #0,@P4DR て最適化してくれるようになればいいんでないかと思う
今のところH8系のcではできないの。P4DR.1 = R6=rotlw(1,R6); とは書けるけど、 ROTL R6 BST #1,@P4DR ではなくR6→R5 R5からBLDでCYに取り出してBSTする。 c中にASMコードも書けないのでASMの関数コールを用意するしかなかった。 AduCという所のcはCYまで使えるので817の書き方ができるお利口さんだが、 すごくローカルな方言。
820 :
817 :2012/02/14(火) 04:38:59.09
当時のソフトボート社提供の<INH8.h>の中身は #pragma function = intrinsic(0) int rotlw (int count, int data); ・・・ void bset (unsigned char bit_no, unsigned long address); void bclr (unsigned char bit_no, unsigned long address); #pragma function = default これを真似してbset/bclrの辺りに void bst (unsigned char bit_no, unsigned long address); を書いてみたけど、BST命令は出ずに関数コールになった。 bset/bclrを書いたらコンパイラが狂い死にした(w ルネサスのcなら書けるんだけど。
動作周波数が遅いのか 速度を必要としてるのか データシートに書いてある最高速度で動かしたいのか 速さが必要ないのに汗で書くことも無いような ほんとに速さが必要になった時に汗でも書けるぐらいでいいんじゃねえの Cであがいて最後は全部汗とか、はまりパターンにならんように 最初にどっちで書くのがいいか見極めが必要なのかも
822 :
817 :2012/02/15(水) 04:09:34.73
前の世代の製品のときに、パルスがトロいって文句いわれたんですよ。 同じ部署の次世代製品だったから、企画の時からこれ以上出せない文句無しの 出してやろうと決めていました。動き出してから、書き込み速いねって誉められました。 動作周波数は、分周してuartの適切なレートが出る奴を選ぶので、CPUの最高より 若干低め:16.588とかの半端なクロックが使われます。 別の部署の製品では、seup/holdが4μのPLLでCPUが20MHzだったため、1パルス 毎にディレイかまさなくちゃいけなくて、なんかくやしかったり(w ハード屋さんに聞いたら、(回路をケチるためらしいんだけど)横浜コンチみたいな 波形なので、トロくさせることで確実にしてるみたい。
823 :
817 :2012/02/18(土) 05:03:46.97
>seup/holdが4μ 40μの間違いでした。
824 :
デフォルトの名無しさん :2012/04/30(月) 05:22:50.09
領海
今のCPUって単一スレッドでも多重パイプラインで複数命令実行してたりして 訳分からないnopとかいっぱい入ってるし、命令ブロックの配置とか 元のロジックの順番変わったりするしそんなの手作業でハンドアッセンブルなんて 不可能じゃないの?初期のペンティアムのUパイプだのVパイプだのの時点でもう 訳わからん
「今のCPU」って一口に言っても、Ivy Bridgeも、PICもあるから一概に言えん。
この文脈でそう言っちゃうのは馬鹿だろう。
「単一スレッドでも多重パイプラインで複数命令実行してたりして訳分からないnopとか いっぱい入ったりする、命令ブロックの配置とか元のロジックの順番変わったりする 今のCPUって、手作業でハンドアッセンブルなんて不可能じゃないの?初期のペンティ アムのUパイプだのVパイプだのの時点でもう訳わからん」 せめてこう書くべき