2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

アセンブラ… (・∀・)イイ!

1 :デフォルトの名無しさん:01/10/05 16:43
めくるめく16進数。
機械語萌え。20 D4 FF FF 50 E8 8A DC FF FF 68 10 20 00 00 8D
45 B4 50 8D 85 B4 FB FF FF 50 6A 00 E8 7B DC FF
FF 8B E5 5D C3 00 00 00 FF FF FF FF 02 00 00 00
0D 0A 00 00 55 8B EC 83 C4 F4 84 D2 74 08 83 C4
F0 E8 82 C4 FF FF 89 4D F4 88 55 FB 89 45 FC 8B
45 FC 83 C0 04 8B 55 F4 E8 2B CD FF FF 8B 45 FC
80 7D FB 00 74 0F E8 B5 C4 FF FF 64 8F 05 00 00
00 00 83 C4 0C 8B 45 FC 8B E5 5D C3 55 8B EC 83
C4 F0 53 33 DB 89 5D F0 84 D2 74 08 83 C4 F0 E8
34 C4 FF FF 89 4D F4 88 55 FB 89 45 FC 33 C0 55
68 61 69 40 00 64 FF 30 64 89 20 8D 45 F0 50 8B

2 :デフォルトの名無しさん:01/10/05 16:45
>1 機械語(マシン語)とアセンブラは違うと思われ….

3 :デフォルトの名無しさん:01/10/05 16:47
アセンブラ教えてください

4 :名無しさん:01/10/05 16:48
機械語は2進数と思われ・・・。

5 :デフォルトの名無しさん:01/10/05 16:50
アセンブリ ∽ 言語
アセンブラ ∽ コンパイラ
アセンブル ∽ コンパイル

6 :デフォルトの名無しさん:01/10/05 16:51
Borland ターボアセンブラ は
無料DLできますか。

7 :デフォルトの名無しさん:01/10/05 16:58
>>1がアセンブラとマシン語を混同しているので
----------------- 終了 ------------------

8 :デフォルトの名無しさん:01/10/05 17:00
>6 どうしても無料が欲しいの?

今なら1万5千円で買えるぞ
http://www.borland.co.jp/bcsuite/

DOSのC++コンパイラもついてるからワンダーウイッチにも使えるぞ

9 :デフォルトの名無しさん:01/10/05 17:06
アセンブラは業務で仕方なくとか、
どうしても高速化したいときとかに使う物で、
趣味でやるもんじゃねーよ。
やったら最後、地獄にハマるんだなこれが・・・

高水準言語でお気楽に構えている方が正解だぜ。

10 :デフォルトの名無しさん:01/10/05 17:09
nasmとかいろいろあるじゃん > フリーの

11 :デフォルトの名無しさん:01/10/05 17:28
未経験だけど、アセンブリ怖い。変な命令書いたらCPUやメモリが壊れたりしない?

12 :デフォルトの名無しさん:01/10/05 17:32
ハァ?

13 :デフォルトの名無しさん:01/10/05 17:33
>>11
CPUは壊れない
しかしメモリメチャクチャ
ハードディスクぐちゃぐちゃってことはよくある
ウイルスより被害大(たった数字が1違っただけなのに〜)
なんてことはざらにある

14 :11:01/10/05 17:34
>>13
どひー・・・。それでは手が出せないなぁ。恐ろしや。

15 :13:01/10/05 17:37
普通はメモリの被害だけで助かることが多い。
ハードディスクへアクセスするにはそれなりに敷居があるからね。

16 :デフォルトの名無しさん:01/10/05 17:53
Cで書こうがアセンブラで書こうが、危険性に大した差はない
HDDにアクセスって、デバイスドライバを書くのでもなければ
結局APIを呼ぶだけなので何が変わるわけでもない

17 :デフォルトの名無しさん:01/10/05 18:13
Cで書けるようなことをわざわざアセンプラでやる必要はない。
>>16
の言っている程度のことでアセンブラを使うのは間違いである。

18 :デフォルトの名無しさん:01/10/05 18:27
プロなら使ってもインラインのアセンブラくらいでしょ。
それも速度のためじゃなくてCじゃ書けない処理を行うため。
スーパースケーラーなCPUではパイプラインの動作を人間が
追いきれないので最適化でコンパイラに勝てるなどと思うのは
素人の浅知恵です。
もし、Cをアセンブラで書き直したら早くなったってのは元の
プログラムがダメだったってことだ。

19 :13:01/10/05 18:27
Cの最適化は最も適切な機械語コードを吐き出すわけではない。
部分的には最適化されていても、
全体を通してみると完全に最適化されいるわけではない。
アセンプラを使う理由はそこにある。
よってアセンブりコードはある程度複雑さを持っているということは自明であり、
複雑なことをするために相応の危険が伴う。

20 :13:01/10/05 18:32
>>18
あたりまえの事を言っているだけです。

21 :デフォルトの名無しさん:01/10/05 18:36
はじめて読むマシン語、
はじめて読むアセンブラ

なら最近でも入手可能。

http://www.ascii.co.jp/searchA/namazu.cgi?idxname=www.ascii.co.jp&query=%82%CD%82%B6%82%DF%82%C4%93%C7%82%DE

22 :デフォルトの名無しさん:01/10/05 18:40
>>19
別に危険は伴わないって
バグが発生しやすいだけ
何故アセンブラが危険を伴うと決めつけたがるんだ?

23 :19:01/10/05 18:46
>>22
アセンブラのバグ=危険なの!
あなたはアセンブラの経験が少ないのですか?
それともバグをあまりださない完璧な人だったのですね。

24 :デフォルトの名無しさん:01/10/05 18:53
>>23
Cで書こうがバグがあったら危険だろ
アセンブラ云々は関係ない

Cで発生せずアセンブラでのみ起こるような危険など発生させたことはないが
具体例を挙げてみてくれ

25 :デフォルトの名無しさん:01/10/05 19:00
>>13
>ハードディスクぐちゃぐちゃってことはよくある
無ぇよ
>ウイルスより被害大(たった数字が1違っただけなのに〜)
ハァ?

先入観と妄想が激しいようですな

26 :デフォルトの名無しさん:01/10/05 19:05
>>24
例えばメモリのA番地からB番地までをクリアするコードを書いたつもりが
ループの終了条件を間違えてB番地以降もクリアしてしまった場合。
Cのコードならばsegmentation faultやアクセスバイオレーションで終了してくれるが、
アセンブラならばそのままメモリの最後までクリアしてしまう。

27 :デフォルトの名無しさん:01/10/05 19:11
>>26
OS持っているメモリ保護機能はCで書こうがアセンブラで書こうが同じように動作する
アセンブラをなんだと思ってるの?

28 :デフォルトの名無しさん:01/10/05 19:17
なんか、最適化で人間はコンパイラにかなわないって言ってるやつが
またいるよ(*´Д`*)

だったら、なんでCPUのアナライザなんか売ってんだよ。
人間の最適化が必要だからだろ。

29 :デフォルトの名無しさん:01/10/05 19:22
1-44
グレート!

30 :13:01/10/05 19:22
>>27
わかった俺が馬鹿だった。80386以降はメモリ保護機能がついていたな。

31 :デフォルトの名無しさん:01/10/05 19:23
>>27
ニーモニック"変換機"だと思われ

32 :デフォルトの名無しさん:01/10/05 19:29
>>26
warata

33 :2:01/10/05 19:37
期待したんだがレベルの低いスレなのでsage

一般教養として身に付けとけ.アセンブラ判らないと
「キャッシュに載るように」なんてのも判らんだろ?

34 :デフォルトの名無しさん:01/10/05 20:00
>>29
俺も「グレート!」です。

35 :デフォルトの名無しさん:01/10/05 20:01
VC++のインラインアセンブラでジャンプテーブルを記述するにはどうしたらいい?

36 :デフォルトの名無しさん:01/10/05 20:02
コンパイラに最適化で勝てない人間はアセンブラ触らないで下さい、って言う発言はダメ?
ああ、もちろん手作業で最適化するのは時間が掛かるけどね。
x86アセンブラなら色々idiomあるし、触っても良いじゃない。

37 :デフォルトの名無しさん:01/10/05 20:04
>36
最適化なんてしなくてもいいように技術が進化してるんだから、過去の遺産は棄てなさいね。俺は32歳のプログラマーだけど、年収3000万だよ。

38 :デフォルトの名無しさん:01/10/05 20:09
君らが書く位のアセンブリのルーチンならCのソースコードレベルで最適化した
方が速いんだよ。
そりゃ中にはそれ以上のことをやる人はいるけど、アセンブラで動く物作った
位で得意になってるようなやつには吉野家のコピペ貼っちゃうぞ。

39 :デフォルトの名無しさん:01/10/05 20:16
>>37
自慢がしたいだけ?逝ってよし

40 :デフォルトの名無しさん:01/10/05 20:22
>>36 イディオムなぞに頼っていてはプロセッサ変わっただけで通用しなくなるよ。
Pen3->Pen4とかの違いでもうだめじゃん。

41 :デフォルトの名無しさん:01/10/05 20:22
>>9
>アセンブラは業務で仕方なくとか、
>どうしても高速化したいときとかに使う物で、
>趣味でやるもんじゃねーよ。
???
どっちかというと趣味でやる(やりたくなる)もんじゃないの?
高級言語だと靴の上から足を掻いてるみたいで気持ち悪い−もっとダイレクトに書いてみたい、という動機で。

42 :デフォルトの名無しさん:01/10/05 20:39
>>41
そういう方はどうぞやってください。

43 :デフォルトの名無しさん:01/10/05 20:57
ホビイスト(と限定しなくてもいいか)の知的探究心を満足させるものとしては最高だと思うよ。ソフトウエアの一番底、これより下はない、という所までのぞき見る事ができる訳だから。
ホビイストがプログラミングする動機は「面白いからやる、やりたいからやる」なわけだから、変な理由をつけて止める理由はないよね。
プロになった場合でもアセンブリの経験がないより、あった方がいいんでしょ、使わないまでも。
やりたい人はおおいにやりましょう。

44 :デフォルトの名無しさん:01/10/05 21:02
x86のアセンブラプログラマの方っているんでしょうか?
もしいたら、どんな仕事してるかおしえてちょ!!

45 :デフォルトの名無しさん:01/10/05 21:05
43の意見に賛成。
だけど、もう一方で普通の人はコンパイラに勝てないというのも正しいと思う。
そんなわけで、アセンブラを勉強するのに良い方法。
Cで簡単な関数を書いて、アセンブリソースを出力してみる。
これで勉強するとCでもアセンブラでも速いコードが書けるようになるよ。

46 :デフォルトの名無しさん:01/10/05 21:15
キャリー萌え

47 :キャリー:01/10/05 21:18
CPUの構成要素としてはただの1ビットに過ぎないがとてもカワイイ。

48 :デフォルトの名無しさん:01/10/05 21:22
>>37
最適化しなくていい世界に住んでるあんたは幸せだな。
世の中そういうところだけじゃないよ。

49 :デフォルトの名無しさん:01/10/05 21:23
物理的な構成要素としてはただの電圧の変化に過ぎないのがとてもピカチュウ。

50 :デフォルトの名無しさん:01/10/05 21:23
x86 アセンブラ勉強したいなら 今ならDelphiから入ったらいいかもね
インラインアセンブラ強力だし
 Delphiのコンパイラの最適化は 多少弱いから 使う価値あるしさ

51 :デフォルトの名無しさん:01/10/05 21:25
>>48
最適化はコンパイラがやってくれるので心配無用です

52 :デフォルトの名無しさん:01/10/05 21:26
>>51
あんたはタイトなループをCで書いて満足な速度出せますか?

53 :デフォルトの名無しさん:01/10/05 21:31
>>52
具体的にどんな処理を書くときの話?

54 :51じゃないけど:01/10/05 21:33
タイトなループが実行時間に大きく影響するようなプログラムを
書いて無い。

55 :デフォルトの名無しさん:01/10/05 21:34
そんなにコンパイラの最適化って優秀なのか?
2,3年前の話だけど、本を見ながらソースをアセンブラに書き直したら
何割も早くなった事がある。
素人のおれがやっても、そんなだからプロがやったらもっと
速くなるんじゃないか?
それとも、この2,3年の間に飛躍的にコンパイラの技術が発展したとか?

56 :デフォルトの名無しさん:01/10/05 21:36
ループを最適化する必要がある場合もあればない場合もある。
だがプロファイルもとらずに最初から高速化する奴はヴァカ

57 :デフォルトの名無しさん:01/10/05 21:40
56がいいこと言った。・
>>55 飛躍したのはCPUだよ。動作が複雑化して単純な最適化は通用しなくなったのさ。
今自分が使ってるCPUに実行ユニットがいくつ有って、パイプライン何段だか知ってる?

58 :デフォルトの名無しさん:01/10/05 21:42
アセンブラで最適化できる場合って
全く同じ処理を何度もする場合でしょ
そんなケースってほとんどない気もするけど
でも、今はいろいろCPUあるし・・・
だから意味ないと思う

59 :名無しさん:01/10/05 21:44
>37
100万くれ

60 :デフォルトの名無しさん:01/10/05 21:47
>>58
ゴゴゴゴゴルァ!!
自社ライブラリを各CPU毎にアセンブラで最適化する身にもなってみやがれ
氏ぬよもう

61 :デフォルトの名無しさん:01/10/05 21:48
MSやらBorlandのコンパイラなら、人間最適化のほうがまだまだ優秀。
インテルのコンパイラは見たことない。

62 :デフォルトの名無しさん:01/10/05 21:51
駄スレかと思ったら、けっこう議論が白熱しているね。

63 :デフォルトの名無しさん:01/10/05 21:53
>>61
また知ったか君が・・・
でも人間を最適化出来たらそれが一番だろうな

64 :デフォルトの名無しさん:01/10/05 21:54
>>62
内容は駄スレに値する程度のものしかありません
ここは抽象的な事を書いて知ったかするためのスレです

65 :デフォルトの名無しさん:01/10/05 21:55
>>61 >>63
どっちでもいいから、煽ってないでなにか根拠を示せよ。

66 :58:01/10/05 21:57
>>60
アセンブラで最適化する必要のあるライブラリーってなんですか?
DSP以外にあるんでしょうか?

67 :デフォルトの名無しさん:01/10/05 21:59
>>63-64
おまえが知ったかなんだろ?
アセンブラのコーディングなんてやったことないんだろ?
自分の部下にやらせているんだろ?

68 :デフォルトの名無しさん:01/10/05 22:01
具体例も根拠も示さず最適化がどうのと語っている時点で
このスレが知ったかの固まりの駄スレであることは明白だろう

69 :デフォルトの名無しさん:01/10/05 22:04
アセンブラは簡単に逆汗が通らない様なコードが書けるから、
パスワードの処理なんかに最適だと思うけど。
コンパイラなんかで書いていたら、すぐに解読されてしまうよ。

70 :キャリー萌え:01/10/05 22:05
PC(プログラムカウンタ)   王様
SP(スタックポインタ)    魔法使い
ステータスレジスタ/フラグ   貴族
アキュムレータ/汎用レジスタ  雑兵
裏レジスタ           伏兵
セグメントレジスタ       嫌われ者

71 :デフォルトの名無しさん:01/10/05 22:06
>>68
なぜ?
実際にアセンブラなんて使ったことなくても
コンピューターの仕組みがわかってれば
ある程度のことは予想つくのでは?
物理とか化学の勉強したことないの?
自然現象もその類

72 :デフォルトの名無しさん:01/10/05 22:08
>>69
実行中の状況をトレースされたら終わりだと思うが?

73 :デフォルトの名無しさん:01/10/05 22:08
>66
3D関係。リアルタイムだから間に合わなければ速くしなければ使い物にならないので。

あとLightwave, PhotoShopのプラグインなんかもコンパイラの対応していない
最新の命令(3DNOW!SSE2など)を使うためにアセンブラ使わざるを得ないんじゃないの?
よく知らないけど。

74 :デフォルトの名無しさん:01/10/05 22:10
>>71
予想で適当なことを書くことを知ったかと呼びます

75 :デフォルトの名無しさん:01/10/05 22:12
>>71
また、そういう意味のないたとえ話を…。
まぁ、机上の知識でもいいから、なんか具体的な話をしてみれよ。

76 :デフォルトの名無しさん:01/10/05 22:16
明日はこのスレは根拠となるアセンブラコードでごちゃごちゃしているかも・・・

77 :デフォルトの名無しさん:01/10/05 22:17
単純な例でアルファブレンドにしても、
3Dで複雑なワンスキンメッシュのモーフィングも
アセンブラ使わんとマトモな速度でないぞ

78 :デフォルトの名無しさん:01/10/05 22:17
>>73
>3D関係。リアルタイムだから間に合わなければ速くしなければ使い物にならないので。
リアルタイムならフレームレートを落とすだけ
ムービーを作るときなどのレンダリングならリアルタイムである必要はないので
間に合わないもへったくれもない
だから3D関係だからというのは当てはまらない

>コンパイラの対応していない最新の命令
これは確かにアセンブラを使わなければどうにもならないが

79 :デフォルトの名無しさん:01/10/05 22:21
昔のVRAMの構成で画像を1ドット左スクロールする場合とかアセンブリ使いたくなりそう。
今は構成が違うから関係なさそうだけど。

80 :デフォルトの名無しさん:01/10/05 22:21
>>78
リアルタイム描画が必要な状況では、
フレームレートが落ちてると見苦しい事が多いので、
無理をしてでも稼ごうとするもの。

レンダラのプレビューならそれでも良いんだろうけど、
デモやゲームだと見苦しいよ

81 :デフォルトの名無しさん:01/10/05 22:22
>>77
αブレンドは良く話題に出るがアセンブラを使わなくても高速化する方法は
そこらのゲーム作成系の掲示板でいつも話題が出る
後者はビデオカードの助けがないと、どっちみちまともな速度で動かない

82 :デフォルトの名無しさん:01/10/05 22:24
>>72
そのトレーサーが使え無い様にする事もできるのだが。

83 :デフォルトの名無しさん:01/10/05 22:26
>>81
その手の方法だと、トリッキーな演算するんで、逆に読みづらくなるよ。
それに、エロゲ作るんじゃないんだから、αブレンドだけで60fpsが出たからといって満足はしないよ。
フェード中にちびキャラいくつも動かしたいとか、要求はいくらでも出てくる。

84 :デフォルトの名無しさん:01/10/05 22:28
>>82
てゆうかロジックがばれたら破られるパスワードなんて実際には使い物にならない。

85 :デフォルトの名無しさん:01/10/05 22:28
3D関係はアセンブラで最適化できるほど、短い処理じゃないですよ

86 :デフォルトの名無しさん:01/10/05 22:29
誰も実際のコード出さんな。

87 :デフォルトの名無しさん:01/10/05 22:31
>>82
ロジックを解析しなくても、分岐を書き換えればそれで終わりです

88 :デフォルトの名無しさん:01/10/05 22:32
>>85
別に全部アセンブラ化するわけではないし(場合のよってはやったが)、
先にCでプロトタイプ作っとけば、特に困難なわけではない。
ともかく高速化の要求が現実にある以上やらざるを得ないんだよね。

なんか未経験妄想君っぽいんでもう相手にするのは控えるよ。じゃあね。

89 :A:01/10/05 22:33
SIMD使う為にアセンブラって言っても
X87FPUは全く知る必要は無いし、
Cで元のコード書いて、ループの中だけ
インラインアセンブラで置き換えれば良いだけと、
あんまりアセンブラの知識は必要なさそう。

90 :デフォルトの名無しさん:01/10/05 22:36
>なんか未経験妄想君っぽいんでもう相手にするのは控えるよ。じゃあね
逃走
>先にCでプロトタイプ作っとけば
そんなしょぼいプログラムですか・・・
現代の話じゃないそうです

91 :デフォルトの名無しさん:01/10/05 22:37
>>90 そんなしょぼいプログラムですか・・・

は?

92 :デフォルトの名無しさん:01/10/05 22:40
ひ?

93 :デフォルトの名無しさん:01/10/05 22:49
1ビットスクロール(指定されたメモリブロックを連続したビット列とみなして全体を1ビットシフトする)

ターゲットアドレスを変化させながら ローテート命令を必要回繰り返すだけ。

Cだとどうなる?

94 :デフォルトの名無しさん:01/10/05 22:52
今日はもう放置しておいた方がよろしいかと

95 :デフォルトの名無しさん:01/10/05 22:57
全部あぼ〜んしました。

96 :age:01/10/06 01:07
次の日になりました。

97 :デフォルトの名無しさん:01/10/06 01:39
cdqってどういう意味ですか。

98 :デフォルトの名無しさん:01/10/06 01:57
Convert Doubleword to Quadword

99 :デフォルトの名無しさん:01/10/06 02:54
>>93
とりあえずリトルエンディアンなら

int *p, ld = 0;
for (p = startp; p < endp; p++) {
int d = *p; *p = d << 1 | ld; ld = (unsigned int)d >> 31;
}
こんな感じ(ビット並びにもよるけど)。でも、最近のCPUならこの処理
のネックはローテイトには無いでしょう。考えなきゃいけないのは、
1.データのロードストア方法(Dキャッシュ周辺)
2.パイプラインストールの回避。これは特にCPUに依存。

って辺りで。といっても、私自身はアセンブラ不要なんて考えは
さらさら無くて、ハードに近い部分や、特定条件(引数の範囲が
特殊でそれによる最適化が出来たり)での有用性はあるし、業務でも
使っているので、このスレで頭ごなしに否定している人を見ると
「なんだかなぁ」とは思うんだけど。

100 :デフォルトの名無しさん:01/10/06 11:03
>>99
このスレで頭ごなしに否定している人ってどれのこと?
見あたらないんだけど妄想ですか?

101 :デフォルトの名無しさん:01/10/06 13:06
>>CDQ
EAX と EBX を合体させて、
EAX を上32ビット、EBX を下32ビットとして、計64ビットの
レジスタとして使うって事?

102 :デフォルトの名無しさん:01/10/06 13:46
>>101
違う。符号有り32bitを符号有り64bitに変換する命令。
EAXレジスタの最上位ビットが0の場合、EDXレジスタに 0x00000000 を入れる。
EAXレジスタの最上位ビットが1の場合、EDXレジスタに 0xFFFFFFFF を入れる。

こうして出来たEDXレジスタを上32bit、EAXを下32bitに使うことで
符号有り64bitとなります。

103 :デフォルトの名無しさん:01/10/06 18:57
マクロアセンブラってどうよ?

104 :_:01/10/06 21:41
VisualC++プロセッサパックってどうですかね?
3DNowの勉強したいんだけど、これは必須ですか?

105 :デフォルトの名無しさん:01/10/06 21:47
>>104
プロセッサパック入れるとML.exeも入るね。
必須と言うか入れると便利かも。
nasmでも良いけど、MASMに慣れてるならこの方が良いね。
本気で使うなら、win32.inc付いてないから、DDK落すのが良いね。
あと、MASMのinvokeにはバグが憑いてるから注意。

106 :デフォルトの名無しさん:01/10/06 22:04
高級言語が進出してきたとはいえ、組み込み系じゃアセンブラあたりまえ。

業務でJPEGデコーダ(ARM,C++)の高速化改造やってるが、
アセンブラ以前にアルゴリズムがヘボでバグで鬱。

107 :デフォルトの名無しさん:01/10/06 22:18
SH-4ってかっこよさげ。

108 :デフォルトの名無しさん:01/10/06 23:08
x86って組み込みで使うことってあるんすか?
そのときは結局PCアーキテクチャになんの?
それともBIOSやブートコードから自社内で作っていく?
そのへん興味あるんで業界の方お教えください。

109 :デフォルトの名無しさん:01/10/06 23:12
>>107
SH系はクール
ペンティアムのように熱くならない。
SHが良くなってペンティアムを超えて欲しい。
インテルを超えて欲しいね。

110 :109:01/10/06 23:13
無理だろうけど。

111 :デフォルトの名無しさん:01/10/06 23:20
インテルのCPUは基本的に高くて小回りがきかない。
なので組み込みではx86は少数派。
でも、無いことは無い。

BIOSやブートコードは0から作ることはめったに無いんじゃない?
会社の守備範囲にもよるだろうけど。
私はファームに半分足を入れたミドルウェ屋だけど、BIOSは基本的に
ハード屋さんの書くもので、よほどのことが無い限りは手を入れること
は無いです。

112 :デフォルトの名無しさん:01/10/06 23:33
>>111
レスThanksです、業界の方のお話は貴重です。
BIOSやりたいとか思うんすけど、日本じゃ難しそうですね。

113 :デフォルトの名無しさん:01/10/06 23:51
要するに実行速度は

出来る奴が書いたCコード >>>>> ドキュンの書いたアセンブラ

って事でイイ?

114 :デフォルトの名無しさん:01/10/06 23:52
>>113
それは間違いない。

115 :デフォルトの名無しさん:01/10/06 23:57
他社のハードのBIOS書いてもそれだけじゃ商売にならないしね。
大きな企業の専門部所とか入ればチャンスはあるのかな・・・?

116 :デフォルトの名無しさん:01/10/06 23:58
できるやつが書いたアセンブリ>>>>>>>>>>>>>できるやつが書いたCコード

117 :  :01/10/06 23:59
できるやつ>>>>>>>>>>>>>>>>>>「できる」シリーズ

118 :デフォルトの名無しさん:01/10/07 00:01
Ruby>>>>>>>>>>>>>>>>>>>>>>その他

119 :デフォルトの名無しさん:01/10/07 00:01
二段ばね>>>>>>>>>>>>>>>>>>>>>出切るやつ

120 :デフォルトの名無しさん:01/10/07 00:02
>>117
「できる」シリーズでプログラムかけるのか?(藁

121 :デフォルトの名無しさん:01/10/07 01:11
>104
バグ(?)有りにつき注意>VCPP
ただ3DNowやSSE使うなら便利なのでバグ(?)にだけ注意してれば大丈夫
リリースビルド時にebxが__asm{}前後で保持されないので
自力でpush ebx,pop ebxしておかないとバグる

122 :デフォルトの名無しさん:01/10/07 02:39
アセンブリだけで食っていけますか?

123 :デフォルトの名無しさん:01/10/07 03:52
アセンブリだけで生きていけますか?

124 :デフォルトの名無しさん:01/10/07 04:02
アセンブリだけでいけますか?

125 :デフォルトの名無しさん:01/10/07 04:09
カンブリアは古すぎます。

126 :デフォルトの名無しさん:01/10/07 04:51
昔はアセンブリ言語だけで生計をたてていた人もいたと思うけど。
いまでは絶滅したのでは。
普通はCもできるだろうからね。

127 :デフォルトの名無しさん:01/10/07 05:11
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!
Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!Rubyが最強!

128 :sage:01/10/07 07:07
>127 そんなにperlをバカにされたのが悔しいか?

129 :デフォルトの名無しさん:01/10/07 14:52
MMX使いたいのだけど何からやったらいーの?

130 :デフォルトの名無しさん:01/10/07 14:55
Z80>>>>Ruby

>>129 なんじゃそらw

131 :92:01/10/07 15:56
>>130 の不等号もなんじゃそらwだがな

132 :デフォルトの名無しさん:01/10/07 16:31
>129
x86アセンブラはどの程度使える?
ソコソコ使えるなら
取り合えずMMXテクノロジ最適化テクニック辺りでも買ってきて読めや
VC使ってりゃインラインアセンブラでMMXは普通に使える
それ以外の処理系ならVCに変えろ

133 :デフォルトの名無しさん:01/10/07 23:21
>>129
今月のC魔が買ってこい。

134 :デフォルトの名無しさん:01/10/08 00:13
>133
あんなのintelのpdfの既出情報ばかりで役に立たんうえに
MMX最適化部分については殆ど述べてないじゃん

135 :デフォルトの名無しさん:01/10/08 01:58
>>133
今更またMMXやってんの?
とりあえず漏れも>>134と同じく(?)Intelのpdfマニュアルお勧め
アプリケーションセンター逝けば、サンプルプログラムも結構ある。

136 :デフォルトの名無しさん:01/10/09 13:30
【確認】

ABS関数は大抵のコンパイラで

MOV EAX X
CDQ
XOR EAX EDX
SUB EAX EDX

と展開されると書いてありますが、

MOV EAX X
CDQ
XOR EAX EDX
INC EAX

ではだめなんですか?
X が -8 だとすると、

EAX = 1111 1000

ですよね。

CDQ してやると、上位1ビットが1なので

EDX = 1111 1111

で、XORすると

EAX = 1111 1000
EDX = 1111 1111 ( XOR
-----------------------
EAX = 0000 0111

で、最後に1を足す部分ですが、

EAX = 0000 0111EDX = 1111 1111 (SUB
---------------------EAX = 0000 1000

としないで、

INC EAX

ではダメなんですか?
こっちの方が早い気がするんですけど。

137 :デフォルトの名無しさん:01/10/09 13:33
では x=1 としましょう

CDQ ->EDX=0 EAX=1
XOR ->EAX=1
INC ->EAX=2

abs(1)=2 ですか?

138 :デフォルトの名無しさん:01/10/09 13:39
>ABS関数は大抵のコンパイラで

って どこで読んだの?

139 :デフォルトの名無しさん:01/10/09 14:01
cdqってキャリー立ったっけ?
立つなら、adc eax, 0で良いんじゃ?

140 :デフォルトの名無しさん:01/10/09 14:05
と、思ったけど、別にsubだろうがincだろうが速度に違いはねーわな

141 :デフォルトの名無しさん:01/10/09 14:18
>>138
http://www.infoeddy.ne.jp/~tensyo/prog/linealgo.htm#hypotenuse

142 :138:01/10/09 14:25
多くの と 大抵 じゃ ニュアンス違うなあ・・・ 多くのだったら了解だ

143 :デフォルトの名無しさん:01/10/09 18:40
c:\>debug
-a 100
2732:0100 mov dx,110
2732:0103 mov ah,9
2732:0105 int 21
2732:0107 mov ax,4c00
2732:010A int 21
2732:010C nop
2732:010D
-e 110
2732:0110 46.32 01.63 E8.68 08.21 D9.24
-r ip
IP 0100
:100
-g

144 :デフォルトの名無しさん:01/10/09 19:35
xorの例

(a+b) xor b か (a xor b)-b が
 bがbitがall1の時に aの2の補数を
 bが0の時 aを返します


(a xor ((a xor b) and c))
  c=0の時 aを
  c=-1の時 bを返します

145 :デフォルトの名無しさん:01/10/09 21:58
3D関係でCPUが非力なので浮動小数点計算なんざ重くて使えないときに
整数演算のためにアセンブラでイロイロ書いたなぁ。なつかしい(´ω`)
誤差は出るけどそれなりに高速で楽しかったYO!

146 :デフォルトの名無しさん:01/10/10 13:56
>>143
それ、2chのどっかの板で見た。

147 :デフォルトの名無しさん:01/10/10 18:13
x86でアセンブラやるには何がいいでしょうか?
gasはニーモニックが違うとかって聞くけど
x86系のアセンブラのいい本ないでしょうか?
とりあえずオライりーにはないよね
Linuxのカーネルソース読もうかとおもってるんだけどね
オライりーの詳解Linuxカーネルという本を買ってしまいました
眠気を誘う本だよね、みんな読んだ?
実際どれぐらいの人がカーネルソース読んでるの?
学生のうちに読んどけって聞くよね
セグメントとかページングとかはかなりの部分がx86がやってるらしいね
じゃ、やっぱx86系のアセンブラやらなきゃLinuxのカーネルソースは理解できないと

148 :デフォルトの名無しさん:01/10/10 18:15
Delphiやっておけば大丈夫

149 :デフォルトの名無しさん:01/10/10 18:28
>>147
NASMでいいんじゃない?リファレンスついてるよ。
入門編ならWebにいくつかある。
プロテクトモードの勉強するなら「はじめて読む486」がオススメ。

150 :デフォルトの名無しさん:01/10/10 18:49
>>149
どこどこ、教えて下さい!!!
「はじめて読む486」は読みました。
正直まともなレスがつくとは思ってなかったのでうれしいっす。

http://bw-www.ie.u-ryukyu.ac.jp/~j97010/minix/minix.html
http://www03.u-page.so-net.ne.jp/da2/h-takaha/internal/index.html
↑このへんとかwebでも結構情報入りますよね。

151 :デフォルトの名無しさん:01/10/10 19:31
今日C++といっしょにタダで落とした
ターボデバッガーのインストールしたけど
なんかMS−DOSって感じの画面
さあて旅客機でGOディスアッセンブルするど

152 :デフォルトの名無しさん:01/10/10 19:33
>>150
googleで調べてすぐに出てくるものを人に聞くのは関心しないなぁ。
ほれ。

本家:http://www.web-sites.co.uk/nasm/
日本語マニュアル(一部):http://guriponn.tripod.co.jp/others/japanise/nasmdoc0.html

アセンブラの入門も一個紹介。

http://hp.vector.co.jp/authors/VA000124/index.htm

自分で調べてみても分からなかったことだけ聞くべし。

153 :デフォルトの名無しさん:01/10/10 19:36
.text, .data, .bss の3種類のセグメントって要するになんですか?教えてください。

154 :デフォルトの名無しさん:01/10/10 19:41
嫌です

155 :デフォルトの名無しさん:01/10/10 19:43
>>153
次の言葉のうち、どれか知っていますか:
アーキテクチャ、アドレス空間、レジスタ

156 :デフォルトの名無しさん:01/10/10 19:45
>>152
すまんですな。

ちなみにあなたCPUのアーキテクチャとか頭に入ってる?
Linuxのカーネルソース読んだことある?

一般的なプロのプログラマーはどんなもんなんでしょうね。
自分はまだ学生ですが

157 :デフォルトの名無しさん:01/10/10 19:51
旅客機でGOディスアセンブル
push  ebp
mov  ebp,esp
push  FFFFFFFF
push  00406158
push  004038E8
mov  eax,fs:[00000000]
push  eax
とここまで来て思ったがintel8086ってスタックエリアに
定数そのままプッシュ出来たっけ?

158 :デフォルトの名無しさん:01/10/10 19:51
>>156
CPUのアーキテクチャねぇ。
俺はアセンブラは趣味程度にしか弄らないから
一般教養程度しか頭に入ってないな。
名前以上のことを知ってるのは
IA-32、IA-64、68k、MIPS、SHぐらいか。
PowerPCやAlphaのことはまったく知らんな。
R2000とかだったら内部ダイアグラムを読むぐらいはできる。
でもあくまでも教養の範囲なんで
いきなり組み込み系の仕事をやれとかいわれても困る。
Linuxは触ったことない。ソースを一目見て反吐が出た。
どうでもいいが少し口の聞き方に気をつけた方がいいぞ。

159 :デフォルトの名無しさん:01/10/10 19:56
>>156
何様のつもりだ。

160 :デフォルトの名無しさん:01/10/10 19:56
textはコードセグメント
dataはデータセグメント
bssは初期化されていないデータセグメント
データセグメントはスタックセグメントと重なる場合もある。(DS=SS)
セグメントは物理メモリをリニアに見た時の覗き窓で、
8086のレジスタ仕様の64kByteまでしか一度に(効率的に)
アクセスできない制限を緩和する役目をはたす。
64kというのは、レジスタの長さが16bitなので、65536バイトまで。

161 :デフォルトの名無しさん:01/10/10 19:56
>>158
結構知っとるやんけ
自分はLinuxをメインに使っている
Linuxの全てを知り尽くしたい
それでカーネルソースというわけ
そのうちemacsとかxwindowのソースも読んでみたい
口の聞き方は直らんのでゆるせ
くるしゅうない

162 :デフォルトの名無しさん:01/10/10 20:05
>>160
おいおい、セグメントって何だよ。
セクションだろ

163 :デフォルトの名無しさん:01/10/10 20:07
>>161
直らないんじゃなくて、直そうとしないだけ.

164 :デフォルトの名無しさん:01/10/10 20:22
厨は本でも読んどけ

165 :デフォルトの名無しさん:01/10/10 20:35
アセンブリブリウンコ

166 :デフォルトの名無しさん:01/10/10 20:36
大回転アセン・ブリブリウンコーーーーーーーーーーー!!!!!!!!!!

167 :デフォルトの名無しさん:01/10/10 20:45
CPUアーキテクチャを知らないのに
アセンブラっていうのもね・・・
動くコードしかかけないじゃん
x86系じゃ、わかってても高速化は無理みたいだけど
ところで、インテルのコンパイラよりも最適化できる人って
いるの?

168 :デフォルトの名無しさん:01/10/10 20:47
どういうとこ直したのか教えてください
x86系じゃない人も
具体的にどこらへんを直した時に
どの程度早くなったのか教えてください
当然比較したコンパイラを書いてもらえないと、
かなり意味ないんですが・・・

169 :デフォルトの名無しさん:01/10/10 20:48
>>167
動くコード以外に何を書くというのだ?

Intelのコンパイラもたいしたこと無い。
アレが完璧ならVTuneなんて売れるわけ無い。
つーか、VCよりも遅いこともあるし。

170 :166:01/10/10 20:50
少しはからんで欲しかった(泣

171 :デフォルトの名無しさん:01/10/10 21:09
ネタはプログラマ板でやれよな

>160
補足すると
 コンパイラが
text に コンパイルしたコードを吐く

data に static int x=0; みたいな変数を確保して かつ初期値を置く

bss には 初期化しなくていい変数を確保する

172 :デフォルトの名無しさん:01/10/10 21:11
>動くコード以外に何を書くというのだ?
誰が読んでも、コンパイラよりも最適化されたコードって意味だろ

>Intelのコンパイラもたいしたこと無い
Pentiumに最適化するしたい時って・・・他に方法あるの?

で、Intelのコンパイラに問題があるなら
どのへんが問題なのか教えてくれよ

173 :デフォルトの名無しさん:01/10/10 21:14
>>172
別に問題はないよ。
ただ、Intelのコンパイラが特別優れているというわけでもない。

174 :デフォルトの名無しさん:01/10/10 21:52
>>172
>>動くコード以外に何を書くというのだ?
>誰が読んでも、コンパイラよりも最適化されたコードって意味だろ

それを言いたいのなら「動くコードしかかけない」ではなく
「動くだけのコードしかかけない」と書くべきだろ。

172の文も日本語的におかしいし駄目だこりゃ。

175 :デフォルトの名無しさん:01/10/10 21:56
>>160-171
うわっ、とっても解りやすいです。
ありがとうございました。

176 :デフォルトの名無しさん:01/10/10 21:58
日本語大事だよ。仕事でプログラムやるならプログラミング言語以上に。

177 :デフォルトの名無しさん:01/10/10 22:06
>176 そりゃそうなんだけど、そういう話ふるなら プログラマ板でやってね

>>157
 それ 8086 のコードじゃ無いじゃない 386以後のコードだよね?

178 :デフォルトの名無しさん:01/10/10 22:24
レベル低い

179 :デフォルトの名無しさん:01/10/10 22:36
アセンブラで書くような処理を 低レベルって言うんだよ>>178

180 :デフォルトの名無しさん:01/10/10 22:48
>>176
他のやつがソフトウエア工学をあまり知らなかったせいだと思われ
単なる動くコードっていうのは、
ソフトウエア工学でいう、まともな設計がなされてないコードの事
慣用表現のひとつだよ

181 :デフォルトの名無しさん:01/10/10 22:51
>>180
じゃぁ、優良なコードは動くとは言わんのか?
ソフトウェア工学には 動くコード なんていう言葉の定義があるのか?

182 :デフォルトの名無しさん:01/10/10 23:01
>>181
おい、あほまるだしだぞ?

183 :デフォルトの名無しさん:01/10/10 23:06
3流童貞大学院生802警報です。すいませんが非難おねがいしまーす。(ワ

184 :デフォルトの名無しさん:01/10/10 23:12
>>180
「単なる動くコード」と「動くコード」では意味合いが違うぞ。
もったいぶらないで「動くだけのコード」とか書こうぜ?

185 :デフォルトの名無しさん:01/10/10 23:41
Windowsで目覚まし時計作りたいんです
アセンブラで作れますか?

186 :デフォルトの名無しさん:01/10/10 23:43
802、童貞3流大学院生なら作れるのだが、、、うーん。どうだろう俺には無理だ。
802師匠に作ってもらうとイイ

187 :デフォルトの名無しさん:01/10/10 23:44
>185 パソコンの電源入れっぱなしでいいなら作れますよ 

188 :デフォルトの名無しさん:01/10/11 00:09
http://hp.vector.co.jp/authors/VA000124/index.htm

こことってもいいのですがちょっと古めですよね。
似たようなアセンブラ初心者向けのページがあれば教えてください。

189 :デフォルトの名無しさん:01/10/11 00:12
>>188
3日経つと古いのか?

190 :七誌興奮型:01/10/11 00:28
CASL !! CASL !! CASL !! CASL !!
CASL !! CASL !! CASL !! CASL !!
CASL !! CASL !! CASL !! CASL !!
CASL !! CASL !! CASL !! CASL !!

191 : :01/10/11 00:31
>185
いくらなんでもWindowsでは無理。
カシオやセイコーに就職しましょう。

192 :デフォルトの名無しさん:01/10/11 00:53
>>147
gas のニーモニックは NASM, MASM などとは違いますが、基本的に一対一に
対応します。変換規則も単純ですから、どっちで勉強しても良いです。

> セグメントとかページングとかはかなりの部分がx86がやってるらしいね
Linux の仮想記憶のコードは x86 アーキテクチャにべったり依存していて極めて
ダサい(他のアーキテクチャでは、頑張ってソフトウェアで x86 をエミュレートして
いる)ので、勉強のために読むのは薦めませんけど。

193 : :01/10/11 01:23
MOVZX ECX,word ptr [EDI]
は、
mov ecx, 0
mov cx,[edi]
という意味なのですか?

194 :デフォルトの名無しさん:01/10/11 09:49
アセンブラスレここしか
ねーじゃねーかよ!!!

いかにマイナー言語かがわかるな。

195 :デフォルトの名無しさん:01/10/11 09:56
マイナーか否かなんて大した問題ではないのにな。
アセンブラ以外でMMXのコード書いてくれよ

196 :デフォルトの名無しさん:01/10/11 10:01
>193 その理解で可

使う道具としてのアセンブラだけ で食うなら
1)DSPの類 ただしコーデング技術よりノウハウで食べるんだけどね
2)4ビット系 ただし競争相手は世界なんで・・・・

かな・・・ まあご飯食べたい為の仕事なら外の仕事がいいかも

197 :デフォルトの名無しさん:01/10/11 18:57
>>195

ホラヨ。今は組み込み関数でも書けるんだよ。

__m64 m1;
m1 = _mm_xor_si64(m1, m1);

ちなみに、IntelC/C++Compilerもしくは、
VisualC/C++ + VisualC/C++ ProcessorPackでコンパイル可能。
GCCとかも最近は似たようなのを搭載しつつある。

肝心の性能だが、MMXでは、
適当にインラインアセンブラで書いたコードよりは速いのを吐いてくれる。
アセンブラできちんとパイプライニングしたものよりは多少遅い。

SSEに関しては、はっきり言ってとりあえずインラインアセンブラで書いてみました
程度の投げやりなコードでもアセンブラの方が断然速い。
まだコンパイラが成熟してないのか。

ただし、組み込み関数といえど、ほとんどアセンブリとニーモニックなので、
速度を追求してかいていくと
__m64 mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7;
とかレジスタ分の変数用意して、それだけしか使わず、
パイプラインも考慮して書いたりとかするようになるから、
結局アセンブラで書いた方が楽だったりする。

198 :デフォルトの名無しさん:01/10/11 19:02
>>195

ホラヨ。今は組み込み関数でもかけるんだ。

__m64 m1;
m1 = _mm_xor_si64(m1, m1);

IntelC/C++Compilerまたは、
VisualC/C++ + VC ProcessorPackで使える。
最近は、GCCとかでも似たようなのを実装しつつあるらしい。

気になる性能のほうは、
MMXに関しては、何も考えずに適当に書いたインラインアセンブリのコードよりは
高速なコードを吐き出してくれる。
ちゃんとパイプライニングしたアセンブリコードの方が少し速い。
SSEに関しては、はっきり言って何も考えずに書いたアセンブリコードの方が
大分高速に動作する。まぁ、どうしてもアセンブリが理解できない人向け?

この手の組み込み関数使ってても、
速度を追求して逝くと、結局はレジスタの数とか
ニーモニックとの対応やパイプラインを考えていくと、
ほとんどアセンブラと変わらん内容になってしまうので、
あんまり使い物にならんが。

199 :197==198:01/10/11 19:03
むぅ、回線切れたので書き込めてないと思ったが、
ちゃんと書き込めてたのか。2重投稿(しかも微妙に内容違う)スマソ。

200 :デフォルトの名無しさん:01/10/11 19:40
>>197
インテルコンパイラに入ってる ivec.h なんかのベクタクラスライブラリを使うと

Is16vec4 m1; // 16bit符号付き整数×4
m1 = m1 ^ m1;

こんな風に直感的に書けるね。

201 :197:01/10/12 00:13
>>200

そだね。でも、所詮は↑の組み込み関数のラッパーに過ぎないから、
直で組み込み関数使った方が実行速度は速いかな?
あと、実際には同じmmレジスタを8bitx8で扱ったり16bitx4で扱ったりとか
する場面が結構出てくるから、そういうときベクタクラスだとやりにくいかも。

202 :1:01/10/13 03:09
しかし、このスレ結構伸びてるな。
アセンブラスレに飢えていたのか?

203 :デフォルトの名無しさん:01/10/13 05:38
>>191
なんでやねん!!

204 :デフォルトの名無しさん:01/10/15 12:03
MASMとVC++のDOSでのコンパイラをリンクさせるにはどうすればいいんだろうか
入門以前の事について書いてるページとかないよね

205 :デフォルトの名無しさん:01/10/15 13:56
>>204
DOSでって、16ビットコンパイラの話をしているのか?

206 :デフォルトの名無しさん ?:01/10/15 15:27
>>203 なんでやねん禿堂。
秋月で買い物すればいいような気が。

207 :デフォルトの名無しさん:01/10/15 15:32
>>204
ふつーにOBJファイルを生成したあとにリンクさせればいいじゃn

208 :デフォルトの名無しさん:01/10/15 16:01
>>204
public
_
呼び出し規約
とか、その辺?

209 :デフォルトの名無しさん ?:01/10/15 17:27
>>208
「MASMと…コンパイラをリンク」って書いてあるから
オブジェクトファイルをリンクさせるのとは
違う意味らしいよ。

>>204
Makefile を作っておいて、
nmake に Makefile を食わせればよい。
「入門以前」というより、ビルドを速くやるための浦和座というか…
裏技かよ?>漏れ

210 :デフォルトの名無しさん:01/10/15 17:53
>>204
まず日本語入門サイトを探せ

211 :204:01/10/15 18:31
おお、レスありがとうございます。

>209
そうなんです、それなんです。
でもlink.exeが上手く動かずに必ずエラーが出るんです。
C++をvcvars32やってDOSで使ってたんですが、DOSではclしかできないんでしょうか…

>210
すみません。
プログラム始めたばかりなので質問しようにも知識が足りなくて。

212 :デフォルトの名無しさん:01/10/16 01:33
下のコードはDelphiのインラインアセンブラですが、
なぜloop1の方が速いのでしょうか?
命令数はLoop2の方が少ないのに。
loop1は↓にあります。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=049229

@@loop1:
MOVZX EAX, byte ptr [ESI]
MOVZX EBX, byte ptr [ESI+1]
MOV DL, byte ptr [EDI + EAX]
MOV DH, byte ptr [EDI + EBX]
MOV byte ptr[ESI], DL
MOV byte ptr[ESI+1], DH

DEC ECX
LEA ESI, [ESI + 2]
JNZ @@loop1

@@Loop2:
mov ax, [esi]
mov ax, [edi + eax]
mov [esi], da
add esi, 2

dec ecx
jnz @@Loop2;

213 :デフォルトの名無しさん:01/10/16 02:16
>212

loop2のdaってなんだ?
あと、処理が全然等価に見えないのだが?
俺がバカなだけか?

しいて言うならloop2はPpro系(Ppro,P2,P3等)のCPUだと部分レジスタストールに
該当するので遅くなる

あとloop2は486とクラシックPentiumでアドレス生成インターロックも
発生するかな?

Pproの部分レジスタストールは確か5クロックぐらいだったと思うので
JNZを除くloop1のクロック数が8として
同様にJNZを除くloop2のクロック数がまぁ見えてる範囲で9クロックだな

P2、P3のみに限ればloop1は十分な速度だ
それ以外のcpuも考慮する場合は
MOVZX EAX, byte ptr [ESI]
MOVZX EBX, byte ptr [ESI+1]

XOR EAX,EAX
MOV AL, byte ptr [ESI]
XOR EBX,EBX
MOV BL, byte ptr [ESI]
にするべきだ

まぁなんにしろ>212よ
お前にはアセンブラは向かないから理解するのを諦めろ

214 :213:01/10/16 02:18
グハ…ミスった
MOV BL, byte ptr [ESI]→MOV BL, byte ptr [ESI+1]
逝ってくるわ

215 :デフォルトの名無しさん:01/10/16 02:39
>>212
ediには64KB(256x256)の置換テーブルがあるってことかな。
これによるキャッシュ溢れも原因かもね。

loop1もloop2もそうだけど、1ループあたりの処理データ量が少ないなあ。
一回分ぐらいはunrollしてもいいと思うけど。

216 :212:01/10/16 02:55
>loop2のdaってなんだ?
axの間違いでした。

>処理が全然等価に見えないのだが?
リンク先を見れば分かりますが、
loop1は1バイトX256個 のテーブルを使っています。
そこで
loop2では2バイトX65536個のテーブルを使ってやってみたのです。

Delphiのコードはこんな感じです。

// Sの長さは偶数とする。
procedure Test7(var S : string );
var
 ConvTbl: array[Word] of Word;
 I: Integer;
 P: PWord;
begin
 for I := low(ConvTbl) to High(ConvTbl) do
  ConvTbl[I] := I;

 ConvTbl[PWord(PChar('AC'))^] := PWord(PChar('CA'))^;
 // スキップ...

 P := Pointer(PChar(S));
 for I := 1 to length(S) div 2 do
 begin
  P^ := ConvTbl[P^];
  Inc(P);
 end;
end;

217 :212:01/10/16 03:21
関数の全ソースを載せておきます。
Test8(下のソース)を20回ぐらい連続して呼び出すと、
Test6と同じぐらいの速度になりました。
さっぱり分かりません。 Test6は↓にあります。
ttp://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=049229

procedure Test8(var S : string );
var
 ConvTbl: array[Word] of Word;
 I, Count, Len: Integer;  P: PWord;
begin
 for I := low(ConvTbl) to High(ConvTbl) do   ConvTbl[I] := I;
 ConvTbl[PWord(PChar('AC'))^] := PWord(PChar('CA'))^;
 ConvTbl[PWord(PChar('AT'))^] := PWord(PChar('TA'))^;
 ConvTbl[PWord(PChar('AG'))^] := PWord(PChar('GA'))^;
 ConvTbl[PWord(PChar('CA'))^] := PWord(PChar('AC'))^;
 ConvTbl[PWord(PChar('CT'))^] := PWord(PChar('TC'))^;
 ConvTbl[PWord(PChar('CG'))^] := PWord(PChar('GC'))^;
 ConvTbl[PWord(PChar('GA'))^] := PWord(PChar('AG'))^;
 ConvTbl[PWord(PChar('GC'))^] := PWord(PChar('CG'))^;
 ConvTbl[PWord(PChar('GT'))^] := PWord(PChar('TG'))^;
 ConvTbl[PWord(PChar('TA'))^] := PWord(PChar('AT'))^;
 ConvTbl[PWord(PChar('TC'))^] := PWord(PChar('CT'))^;
 ConvTbl[PWord(PChar('TG'))^] := PWord(PChar('GT'))^;

 P := Pointer(PChar(S));
 Count := Length(S) div 2;
 asm
  pusha
  mov ecx, Count
  mov esi, P
  lea edi, ConvTbl
  xor eax, eax
 @@Loop:
  mov ax, [esi]
  mov ax, [edi + eax]
  mov [esi], ax
  add esi, 2
  dec ecx
  jnz @@Loop
  popa
 end;

 Len := Length(S);
 if not Odd(Len) then
 begin
  case S[Len] of
   'A': S[Len] := 'T';
   'T': S[Len] := 'A';
   'G': S[Len] := 'C';
   'C': S[Len] := 'G';
  end;
 end;
end;

218 :212:01/10/16 03:36
>Test8(下のソース)を20回ぐらい連続して呼び出すと、
>Test6と同じぐらいの速度になりました。

毎回違う文字列でテストしたら、Test8は速くなりませんでした。

219 :212:01/10/16 03:49
>215
>ediには64KB(256x256)の置換テーブルがあるってことかな。
Loop1は256バイトの置換テーブルです。

Loop2は64K*64Kバイトの置換テーブルを用意して、
2バイトづつ置換しています。

220 :213:01/10/16 04:42
まずテーブルの生成ルーチンは外に出して静的にしろ
デカイテーブルをボトルネックになる関数内で作ってりゃ世話がない
アセンブラ以前の問題だ

あと128kのテーブルはキャッシュあふれする可能性が高い
というかあふれるだろ
テーブルはでかけりゃいいってモンじゃないぞ
CPUの1次キャッシュや2次キャッシュに巧く乗るように(極力1次キャッシュに乗るように)
してメモリ読込による遅延を隠蔽してやらんと場合によっちゃCPU演算した方が早くなるぞ

あとアセンブラ箇所のみ関しては部分レジスタストールしてるつってんだろ
それだけ聞いてわかんなかったら諦めろ
お前にはアセンブラは向いてないって言ってるだろ?
どうして『部分レジスタストール』でgoogle引くぐらいしないんだよ?
取り合えずfnami氏のHPでも見てこい
ttp://www.csl.sony.co.jp/person/fnami/asm.htm#PARTIAL
ttp://www.csl.sony.co.jp/person/fnami/asm.htm#STALL
CPUにもよるがちゃんと今のx86で手動最適化する技能を持った人間は
お前みたいなペアリング無視ペナルティー無視のコードは書かない
最近のCPUは短いコードを書けば速くなるわけじゃないんだよボウヤ
(無論無意味に長いのは問題外だが)

221 :212:01/10/16 06:32
なぜ、Test8を同じ文字列で20回ぐらい連続して呼び出すと速くなるのでしょうか?

部分レジスタストールについては今やっています。
220さんありがとうございます。

222 :212:01/10/16 06:42
@@Loop:
xor eax, eax
mov ax, [esi]
mov ax, [edi + eax]

これだけで部分レジスタストールは回避されるのでしょうか?

223 :213:01/10/16 08:10
純粋にキャッシュヒットしてるんじゃないか?>連続呼び出し
実はCPUがクルーソーとかいうオチを期待しているぞ(藁

>222
まぁ部分レジスタストールしてるのはそこだけだね
ただレジスタ衝突もしてるんで
 @@Loop:
  mov ax, [esi]
  mov ax, [edi + eax]
  mov [esi], ax

 @@Loop:
  xor eax,eax
  mov ax, [esi]
  mov bx, [edi + eax]
  mov [esi], bx
とするべき
対象CPUがP2以降ならAGIストールは発生しなかったはずなんで
AGIストールは無視する?
番地をレジスタに生成直後にその番地へアクセスするとストールする<AGIストール
上記なら
  mov ax, [esi]
  mov bx, [edi + eax] <ここでAGIストール
となる
なのでまずこういうコードは書かないよ<真にチューニングするべきルーチンでは

224 :デフォルトの名無しさん:01/10/16 08:12
繰り返すことで
プログラム/テーブル/入力文字列/出力バッファ
の全てが1次あるいは2次キャッシュに乗るからでないの?

テーブルは全体でなく、
入力文字列を処理するのに必要な分だけ乗ればいいことに注意。

225 :213:01/10/16 08:12
ちなみに言っておくと俺ならP2ではloop1以上の最適化はできない
(asm部分では考えうる限り最速のチューニングしてるよ
逆に言うとloop2をloop1に近い形にもっていくのが速度の秘訣だ)

あ〜ebpまで使えばなんとかなるかな?>loop2でも

Count := Length(S) div 4;
 asm
  pusha
  mov ecx,Count
  mov esi,P
  lea edi,ConvTbl
  mov ebp,ecx
 @@Loop:
  xor eax,eax
  mov ax,[esi]
  xor ebx,ebx
  mov bx,[esi+2]
  mov dx,[edi+eax]
  mov cx,[edi+ebx]
  mov [esi],dx
  mov [esi+2],cx
  add esi,4
  dec ebp
  jnz @@Loop
  popa
 end;

つーかdec ebpって美しくないなぁ(´Д`;)
4byte/10クロックでペナルティーは見受けられないから
loop1の2byte/8クロックよりは速いかな(ただし要大容量キャッシュ)

はっきり言ってアレだけど真面目な話
コンパイラの最適化に任せるべきだよ>212君
ペアリングとレジスタ衝突、様々なペナルティーとキャッシュ周りを
きっちり考えて最適化しないと逆に遅くなるからね>今のCPUは
コンパイラはその辺考えたコード結構吐いてくれるんで
現行のCPUに関する詳しい知識がないならアセンブラによる最適化はお奨めできないよ

226 :デフォルトの名無しさん:01/10/16 08:13
あちゃーsageそこねた

227 :デフォルトの名無しさん:01/10/16 08:14
loop1はまだunrollする余地があるので最適でないね

228 :213:01/10/16 08:24
まぁアンロールできるけど
実質的なチューニング的には殆ど終わったも同然でしょ?>loop1

229 :デフォルトの名無しさん:01/10/16 11:44
そうだね。 すでに1回アンロールしてるようなもんだし、さらにやっても1割かな

 それに、こういう場面じゃアセンブラで書いても 頑張っても2〜3倍程度しか
変わらない。
 同じ時間を割くなら もっと生産的な部分に注力した方がいいと思うな

それでも、どうしてもなんとか高速にしたいなら PCMPEQBで8バイト
同時に比較してはXOR・ANDマスクして置換すれば・・・・うーん
でも英大文字を英小文字にするとか一方向置換にしないといけないし
1ループで4回の置換作業が必要だから 速くなるかどうか判らないな

230 :213:01/10/16 13:35
>229
漏れも思って取り合えず考えはしてたんだが余計遅くなった(´Д`;)>pcmpeqb
movq mm0,[esi]

movq mm1,mm0
movq mm2,mm0
pcmpeqb mm1,mm4
pcmpeqb mm2,mm5
pand mm1,mm5
pand mm2,mm4
por mm1,mm2
movq mm3,mm1

movq mm1,mm0
movq mm2,mm0
pcmpeqb mm1,mm4
pcmpeqb mm2,mm5
pandn mm1,mm0
pandn mm2,mm0
por mm1,mm2
por mm3,mm1

movq mm1,mm3
movq mm2,mm3
pcmpeqb mm1,mm6
pcmpeqb mm2,mm7
pand mm1,mm7
pand mm2,mm6
por mm1,mm2
movq mm0,mm1

movq mm1,mm3
movq mm2,mm3
pcmpeqb mm1,mm6
pcmpeqb mm2,mm7
pandn mm1,mm3
pandn mm2,mm3
por mm1,mm2
por mm0,mm1

movq [esi],mm0
add esi,8
dec ecx
色々突っ込みどころ満載な上に動作確認もしてないんで
これに関する言及は勘弁してくれ(取り合えず並べただけなんで
最大の敗因は文字列に4本も使ってしまいmmxレジスタが足りなくなったことだ……

231 :pcode 本人:01/10/16 13:36
懐かしいね。
もう一度アンロールしても手間の割には早くならない。

「アセンブラで書けば速くなる」という迷信を砕くのが目的だった
から、アセンブラグルの方々、212 の無知を許してやってくれや。

232 :デフォルトの名無しさん:01/10/16 14:14
あと、MMX化すれば何でも速くなると思っている人も多い。
最近では「P4はSSE2最適化すれば何でも速くなる」と思っている人が多い。

233 :197:01/10/16 14:50
>>232

ある意味真でもあるんぢゃない?
少なくとも浮動小数点演算に関しては、
x87命令つかうよりもSSE/SSE2のスカラ演算命令の方が速いと
インテルが主張していたような。
その証拠(?)に、インテルのコンパイラには、浮動小数点演算を
x87命令を使わずにSSE/SSE2のスカラ命令を使うってオプションがついてた。

ちなみに、Pentium!!!で試したところ、実行速度に差違は見られなかった。
誰かPentium4で試してみてよ。

234 :デフォルトの名無しさん:01/10/16 15:31
>その証拠(?)に、インテルのコンパイラには、浮動小数点演算を
>x87命令を使わずにSSE/SSE2のスカラ命令を使うってオプションがついてた。

そんなオプションないよ。
x87とSSE/SSE2を併用するというオプションはあるけど。
またx87,SSE/SSE2併用オプションでコンパイルしてもほとんど速くならないケースは多い。
あとP4の場合、SSE/SSE2スカラの加算命令は、2クロック毎に1つしか実行できないから、
x87の加算命令の半分のスループットしか出ない。

235 :229:01/10/16 15:33
>>230 なるほどねえ。 で1方向置換じゃなくても出来そうだね


1回の交換が

1) @1 := @0 XOR "AAAAAAAA"
2) @2 := @0 XOR "TTTTTTTT"
3) @3 ;= pcmpeqb(@1,all0)
4) @4 ;= pcmpeqb(@2,all0)
5) @2 := @2 AND @3
6) @1 := @1 AND @4
7) @1 := @1 OR @2
8) @0 := @0 XOR @1

 でこれが1ループで2回必要だから、やっぱり改善にはならないかもねえ

236 :229:01/10/16 18:23
書いてみたら 230さんより少し短くてスムけど あんまり変わらない

movq mm0,[eax]

movq mm1,mm0
movq mm2,mm0
pXOR mm1, qword ptr tblA
pXOR mm2, qword ptr tblT
movq mm3,mm1
movq mm4,mm2
pCMpeqB mm3,qword ptr tbl0
pCMpeqB mm4,qword ptr tbl0
pAND mm2,mm3
pAND mm1,mm4
pOR mm1,mm2
pXOR mm0,mm1
{ 略 tblA/tblT のみ置換して繰り返し}
movq [eax],mm0

 tblAは'A'が8バイト続くデータ tbl0は値0のqwordデータ

237 :229:01/10/16 21:39
人にはアセンブラで時間を潰すなんて無駄と言いながらついやってしまう・・・

ちょっと短くなった

procedure ATCGchg8( p:PChar;cnt:integer);
const tblA:array[0..7] of Char=('A','A','A','A','A','A','A','A');
const tblT:array[0..7] of Char=('T','T','T','T','T','T','T','T');
const tblG:array[0..7] of Char=('G','G','G','G','G','G','G','G');
const tblC:array[0..7] of Char=('C','C','C','C','C','C','C','C');
const tbl0:array[0..7] of byte=($00,$00,$00,$00,$00,$00,$00,$00);
label lp;
asm
movq mm0, qword ptr tbl0
movq mm6, qword ptr tblA
movq mm5, qword ptr tblT
movq mm4, qword ptr tblG
lp:
movq mm7,[eax]
movq mm1,mm7
movq mm2,mm7
pXOR mm1, mm6
pXOR mm2, mm5
movq mm3,mm1
pCMpeqB mm3,mm0
pAND mm3,mm2
pCMpeqB mm2,mm0
pAND mm1,mm2
pOR mm1,mm3
pXOR mm7,mm1

movq mm1,mm7
movq mm2,mm7
pXOR mm1,mm4
pXOR mm2, qword ptr tblC
movq mm3,mm1
pCMpeqB mm3,mm0
pAND mm3,mm2
pCMpeqB mm2,mm0
pAND mm1,mm2
pOR mm1,mm3
pXOR mm7,mm1
movq [eax],mm7
dec cnt
lea eax,[eax+8]
jnz lp;
end;

呼び出し方
var buf:string;
begin
buf:='AGCT AGCT AGCT AGCT AGCT AGCT';
SetLength(buf,length(buf)+(8-length(buf) mod 8) );
ATCGchg8(@buf[1],length(buf) div 8);

238 :197:01/10/16 22:42
>>234

漏れの記憶違いか……?

確認のため、なんとか発掘した
v4.5の日本語マニュアルにはこう書いてあった。

>-Qkscalar デフォルトのx87 命令でなく、
>ストリーミングSIMD 拡張命令を
>使用して、すべての32 ビット浮
>動小数点演算を実行します。

日本語訳が間違えているのかもしれないが、
英語のドキュメントどっか逝ってしまって見つけ出せなかったので確認できず。
ちなみに、v5.0のドキュメントを見たら、-Qkscalarは載ってなかった。

239 :212:01/10/17 02:04
>>217の訂正
mov ax, [edi + eax] → mov ax, [edi + eax * 2]

テーブルの計算方法は間違っていました。
 type
  TWordTable = array[Word] of Word;

 procedure SetWordTable(var Table: TWordTable);
 var
  I: Integer;
  H, L: Char;
 begin
  for I := 0 to $FFFF do
  begin
  H := Char(Hi(I));
  L := Char(Lo(I));

  case H of
  'A': H := 'T';
  'T': H := 'A';
  'C': H := 'G';
  'G': H := 'C';
  end;

  case L of
  'A': L := 'T';
  'T': L := 'A';
  'C': L := 'G';
  'G': L := 'C';
  end;

  Table[I] := MakeWord(Byte(L), Byte(H));
  end;
 end;

240 :212:01/10/17 02:35
>>223
>純粋にキャッシュヒットしてるんじゃないか?>連続呼び出し
そのようでした。 同じ文字列(同じメモリブロック)がキャッシュに
入っていたみたいです。 UniqueStringで別のアドレスに確保すると、
速くなりませんでした。

AGIストールについても考えてみます。
ありがとうございます。


部分レジスタストールについて質問なのですが、
下の(1)と(2)で発生するのでしょうか?

mov ax, 0
inc ecx
mov ecx, eax // (1)直後でない

@@Loop:
mov ecx, eax // (2)ループ
mov ax, 0
jmp @@Loop

241 :212:01/10/17 02:48
また質問です。

http://www.sonycsl.co.jp/person/fnami/pentopt.htm#PPRO
の例で

MOV AL, [mem1] 1 uv
MOV AH, [mem2] 1 uv
MOV [mem3], AX 1
2 + 5(ペナルティー) = 7 clock

MOVZX EAX, BYTE PTR [mem1] 3
MOVZX EBX, BYTE PTR [mem2] 3
SHL EBX, 8 1 u
OR EAX, EBX 1 uv
MOV [mem3], AX 1
8 clock

なので、遅くなりませんか?

これは次のように変更するべき
でブラウザを検索すると見つかります。

242 :213:01/10/17 04:46
>240
ん〜(1),(2)ともしないと思うけど?

>241
Pentiumでは部分レジスタストールは発生しないよ?
もうチョッとよく読もうな
そこでの記載はPentiumProとPentium2(3)に関してだし
Ppro系CPUではMOVZXは1クロックだよ(P4では0.5クロック)
μopコード実行だからペアリングなんて概念自体が無いので>Ppro
逆にPentiumではmovzxは重い処理になるのでやるべきじゃない

・Pentium
MOV AL,[mem1];1uv
MOV AH,[mem2];1uv
MOV [mem3],AX;1
2クロック

MOVZX EAX,BYTE PTR [mem1];3
MOVZX EBX,BYTE PTR [mem2];3
SHL EBX,8;1u
OR EAX,EBX;1uv
MOV [mem3],AX;1
8クロック


・PentiumPro
MOV AL,[mem1];1
MOV AH,[mem2];1
MOV [mem3],AX;1+5
約8クロック

MOVZX EAX,BYTE PTR [mem1];1
MOVZX EBX,BYTE PTR [mem2];1
SHL EBX,8;1
OR EAX,EBX;1
MOV [mem3],AX;1
約5クロック

どっちのCPU向けに最適化するかによる
今時だとP2、P3が主流だと思うんでPpro向けの最適化のほうが好ましいと思う
Pentiumでの遅延を減らしたいなら
movzx eax,[mem]→xor eax,eax/mov al,[mem]
に展開するべき(さもなくばCPUによってル−チンを切り替えるか)

ちなみにP4だと何故か展開したほうが速くなるんだよね……>movzx

243 :デフォルトの名無しさん:01/10/17 07:56
完全にランダムなDWORD値を作る最速のルーチンを教えて

244 :デフォルトの名無しさん:01/10/17 16:40
>>243

真の乱数(規則性なし)は量子コンピュータ持ってきても作れませんが、何か……?
量子力学やカオス理論の世界ですら、
時間をパラメータとする規則性のある数列でしかないことがわかってるし。
自然界では時間は任意に変更できないから、
ある意味真にランダムであるとも言えるだけで。

つーか、ランダム性と処理速度とどっちを重視するのか言ってくれないと、
紹介のしようもない。

245 :Delあめ猫にゃ:01/10/17 21:54
もちろん完全にランダムじゃないけど
乱数種の一つとして

function RDTSCm:integer;
asm
 DW $310F //RDTSC
 XOR EAX,EDX
 IMUL EAX,65535
end;

246 :デフォルトの名無しさん:01/10/17 22:30
>>243
最近のPCならチップセットに乗ってる
ハードで完全にランダムな値、作れるんじゃないの?
漏れのマシンにはついてないけど。
http://developer.intel.com/design/chipsets/rng/faq.htm

レジスタ叩いて読むだけ。
>>244さんはこれでも満足できないのかもしれないけど

ソフトでやるのでは、回数が少なければ、
サイコロ振って乱数表作ってメモリに入れとけば、
規則性のない乱数列が作れるんじゃない。
周期性は避けられないが。

247 :デフォルトの名無しさん:01/10/17 22:44
ノイズ拾ってデジタルデータに変換するADCあたりを
シリアルポートにでもつなげ

248 :246:01/10/17 22:57
>>247
んならサウンドカードでええやん、

249 :デフォルトの名無しさん:01/10/18 00:22
>>248
24bit以上のデータを扱えるオーディオカードならな。
普通のサウンドカードだと、16bit、しかも低い値しか取れないから、
拡大すると荒い乱数しか取れない。

250 :212:01/10/18 07:03
213さん、重ね重ねありがとうございます。

215さんも224さんもありがとうございます。
キャッシュが・・・、と言われていたのに・・・。

251 :デフォルトの名無しさん:01/10/18 14:25
>>249
例えば32bitの乱数が欲しければ、サンプルの下位1bitだけを
使用するとして32個サンプリングすればよいんじゃないの?
(本当はもっと偏りがないようにうまくやったほうが良いが)

これなら16bitサウンドカードでも大丈夫だ。24bitのサンプル1個を
そのまま乱数に使うってのは頭が悪いとしか思えん。

252 :デフォルトの名無しさん:01/10/18 14:58
>>251
速度が遅くなんない?
どのぐらいかかるか知らないけど

253 :デフォルトの名無しさん:01/10/18 16:11
>252 というか WavInデバイスを使うってだけで1秒にせいぜい2*44.1K/秒 だからね
 M系列とかの乱数種に プログラム起動時に1回使うだけならともかく

254 :デフォルトの名無しさん:01/10/20 14:08
21 34 12 3E FF C9

255 :デフォルトの名無しさん:01/10/21 04:55
何クロックかかるとかどの資料を見ればわかりますか?

256 :デフォルトの名無しさん:01/10/21 05:05
Intelの資料に書いてあるけど、P6以降はあまり意味がないような・・・

257 :デフォルトの名無しさん:01/10/21 05:10
CPUが新しくなるほど遅くなってそうだね。

258 :デフォルトの名無しさん:01/10/21 08:45
>255 資料見るより 実際にコード書いて >>245 にあるRDTSCで数えさせる

259 :255:01/10/21 13:39
>>256
ありがとうございます。
えと、どの資料でしょうか?
上中下ある、インテルアーキテクチャ・・・は見てみました。

>>258
サンクス。確かに使えそうです。

260 :デフォルトの名無しさん:01/10/21 16:41
コンパイラについて

一番わかり易くコンパイラを解説した書籍を教えて?
ドラゴンブック?
岩波?

261 :デフォルトの名無しさん:01/10/21 16:55
>>260 ここで答えが出なければ

【コンパイラ・スクリプトエンジン】相談室
http://piza2.2ch.net/test/read.cgi/tech/981672957/

過去ログ
http://piza.2ch.net/tech/kako/987/987880355.html

262 :デフォルトの名無しさん:01/10/21 21:13
TESTBとTESTはどう違うの?

263 :デフォルトの名無しさん:01/10/21 22:51
どうしてコンピュータでは16進数なんでしょうか?

264 :デフォルトの名無しさん:01/10/21 22:56
コンピュータ内部では2進数。
2進数だと見づらいから、人間は16進数で見ている。

265 :デフォルトの名無しさん:01/10/22 08:31
LinuxでIntel2gas -gを使ってcpp→s→asmでできたコードを見てるのですが

void func(int a=0)は

add esp, -8
push dword 0
push dword 0
call func3_Fii
add esp, 16

void func2(int a=0, int b=0)は

add esp, -4
push dword 0
push dword 0
push dword 0
call func3_Fii
add esp, 16

と引数に使うスタックを4つにする理由はなんなんですか?
もっとたくさんにしてもコンパイラは8、12・・・て固定しようとするんですけど・・・。

266 :265:01/10/22 08:33
add esp, -8... は void func(int a=0)を呼び出す時のコードです・・・

267 :デフォルトの名無しさん:01/10/22 08:36
最近のx86CPUのデータバスは64bitだからです >265

268 :デフォルトの名無しさん:01/10/22 08:38
>>265
スタックを4つというのは、4バイトを4個ってことだよね?
それは16バイトアライメントです。

269 :265:01/10/22 08:54
なるー。この方がはやいんですね。
初めて読むMASMをみてLinuxで勉強してると細かい違いがいっぱい出てきて。
symdebみたいなのがあれば助かるのですが。。。
上のfnamiさんのページでHOW TO OPTIMIZE FOR THE PENTIUM PROCESSOR見てきたんですが、こりゃ道は長いぞっと(w;

ttp://www.csl.sony.co.jp/person/fnami/pentopt.htm

270 :デフォルトの名無しさん:01/10/22 10:08
>>269
「HOW TO OPTIMIZE FOR THE PENTIUM PROCESSOR」はよくまとまっているけど
内容が古い。読み終わったらすぐ、Intel のプロセッサマニュアルを読みなされ

271 :255:01/10/22 17:40
たとえば2のn乗になる数をかけるとき普通にmulを使うより
shift演算したほうが早いとか、そういうのはどのような資料からでしょうか?
>>258さんが言われるようにRDTSCで測定しているだけではありませんよね?

272 :デフォルトの名無しさん:01/10/22 17:46
>>271
Idiom

273 :デフォルトの名無しさん:01/10/22 17:53
>>271
ftp://download.intel.co.jp/jp/developer/jpdoc/iaopt_j.pdf
これのページ 1-5 とページ D-1

274 :255:01/10/22 18:18
>>273
ありがたう。気が付きませんでした。
単純なんですね。

275 :デフォルトの名無しさん:01/10/22 19:24
>267

マイコン向けのプロセサのデータバスもやはり64BIT?

276 :デフォルトの名無しさん:01/10/22 19:26
>264

Thanks

277 :デフォルトの名無しさん:01/10/23 07:11
関数の引数に関する話で「スタック私」という言葉が出てくるけど、
これは以下の認識でよいのですかね。

・ある関数fに引数を渡す方法のうちの一つである。

・すべての引数を全ての関数共通のスタックにPUSHし、関数fにはスタックのアドレスを渡す。 もしくは、すべての引数を関数f専用のスタックにPUSHし、関数fを呼び出す。

・呼び出された関数fは、自分の持ち得る引数の個数と
同じ回数だけPOPする。ただし、f(a,b) と定義されている関数の場合は、
b,a の順番でPOPする事になる。2回目以降のPOPで取り出される値は未定義である。

278 :デフォルトの名無しさん:01/10/23 07:34
SPはひとつ。
 呼び出し時、引数を共通のスタックにPUSHし、その後帰り番地をPUSHした後、関数fにgoto=JMPする

 呼び出された関数は、SPをBPに複製し、さらにSPを操作してローカル変数用の変数を確保する
 引数、変数の参照は BPからの相対参照とする

 関数終了時は、SP=BPと復元し 帰り番地を得た後、引数分のSPを 関数側で操作するか
 呼び出し側で操作するかする。

というのが今の普通のやり方

279 :デフォルトの名無しさん:01/10/23 07:35
ちなみに 詰まれたスタックを関数内部で破棄して帰るのがpascalスタイル
呼び出し側で破棄するのがcスタイル

280 :デフォルトの名無しさん:01/10/23 07:47
SPってスタックを指すアドレスのことですか

281 :デフォルトの名無しさん:01/10/23 07:58
>>280 SP=スタックポインタ
  ∧ ∧  ./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (;;゚Дメ)< それも判らんで質問してたんかい
  /  |  \_____________
〜(___ノ 

282 :デフォルトの名無しさん:01/10/23 07:59
SPはレジスタでしょう?

283 :デフォルトの名無しさん:01/10/23 08:31
スタック私

284 :デフォルトの名無しさん:01/10/23 08:33
スタックアドレスを保持するレジスタ

285 :デフォルトの名無しさん:01/10/23 12:54
アセンブラ勉強するならOSは何がいいの?

286 :デフォルトの名無しさん:01/10/23 13:00
>>285
X68000

287 :つーかレス番号が意味深(笑:01/10/23 13:04
>>286 それOSちゃう!
それをいうならHUMAN68KとかOS-9とか、、

288 :285:01/10/23 14:49
やっぱMSXじゃ駄目なのか・・・

289 :285:01/10/23 14:50
MSX-DOSだった。

290 :デフォルトの名無しさん:01/10/23 15:28
X68000 ってさ、奇数アドレスにアクセスするとエラー起きるんだよね
勉強はしやすいと思うが、使いやすいかどうか・・・・
MSXでも良いんじゃない?俺はどっちも好きよ

291 :デフォルトの名無しさん:01/10/23 15:32
アセンブラはdelphiを使うと使いやすいよ。
あとボーランドのBCC(フリー)でも内部記述できる。
要所要所だけアセンブルするのがよいのです。

あとNASMって結構よいです。作ったオブジェクトファイルを
コンパイラからリンクするのですがこれもdelphiで使えます

だからやっぱりインテル系だね。

292 :デフォルトの名無しさん:01/10/23 15:36
>>285
アセンブラは、ハードウェアに対する基本的な理解が前提となるから、コンピュータの論理設計
と合わせて勉強した方がいいと思う。「コンピュータの構成と設計」(パターソン&ヘネシー)を読
みつつ、MIPS エミュレータの SPIM で勉強とか。

293 :デフォルトの名無しさん:01/10/23 18:50
>>285
ハード(and/or OS)は古くて簡単な方がいいと言う事で
X68000などが挙げられたのだと思いますが、
環境が整うなら(アセンブラが調達出来るなら)
MSXなら尚良し、なのではないでしょうか。
VRAM,ROM,I/Oなどのアドレスが固定で
メモリマップの資料などが揃っていると
それこそマシンの隅々まで理解した気分になれます。
(今のマシンじゃ、○○ポートのアドレスは...なんてやり方出来ないと思う。)

294 :デフォルトの名無しさん:01/10/23 18:57
>292
早速コンピュータの構成 上 を買ってよんでいるのですが、
レジスタ等わかりやすく書いてありますね
MIPSを使ってあるので、Windowsユーザーでも
便利です。
ところで、私はVisualc++をもっているのですが、
これはどうでしょうか?

295 :デフォルトの名無しさん:01/10/23 19:00
アゼンブラは特にファームウエア用の用途が多いとききました。
ファームウエアを作成するとなったら、アゼンブラ以外に必要な
知識とかありますか?

296 :デフォルトの名無しさん:01/10/23 23:26
ところで >>1 のコードには、どんな意味があるのですか?

297 :デフォルトの名無しさん:01/10/23 23:31
>>296
0D 0A みっけ。
でも 00 とか FF とか多いな。

298 :デフォルトの名無しさん:01/10/24 01:35
>>295
ハードウェア。密接に絡むからね。

取り敢えず、デジタル回路の回路図は最低限読めないと。アナログ
も知っているとベター。

299 :あせんちゃん:01/10/24 01:36
8086アセンブラをやってて、その後Cに行ったんですけど、
なんかのバグとかで、Cが吐いたコードをアセンブラで読んで
原因がわかっちゃうときなんかは、あ〜無駄な経験じゃなかったな・・・
な〜んて、思うこともあり。

アセンブラレベルでは8086からたいして変化が無いので、
全然問題なく読むことできたし。

300 :デフォルトの名無しさん:01/10/24 01:50
元気ですかー!キリバンゲットいくぞー!
1ー、2ー、
300ダァァァァァァァ!

301 :デフォルトの名無しさん:01/10/24 17:51
6502アセンブラを学びたいのですが、解説してるサイトとかってありますか?
検索しても全然出てこない・・・。

もしくは、薦めの勉強方法ってありますか?
御教授お願いします。

302 :デフォルトの名無しさん:01/10/24 18:29
>>301
ttp://www.6502.org
ってそのものずばりのサイトがあったよ。
オペコードなどの説明もPDFファイルで見られる。

303 :tiger book:01/10/24 21:45
>デジタル回路の回路図は最低限読めないと
一応電気工学科なのですが、オラクルばっかりやっていて、すっかりわすれて
います。
デジタル回路を学ぶための良書教えて!

304 :343:01/10/25 15:50
age

305 :301:01/10/25 16:13
>>302
海外のサイトっすか、、、頑張って英語読もう。
レス有難う御座いました。

306 :_:01/10/26 11:31
「はじめて読む8086」で勉強しているものです。
ちょっと質問なんですが、昔はメモリ全部見れたんですよね?
でも今だと個別のプロセスごとにメモリ空間があってみれない
っていうのはなんとなく知ってるのですが、プロセスごとなら
最初の番地から最後までみれるんですか?
Cで

for(int i=0; i<100; i++) {
char* c = (char*)i;
printf("%d", *c);
}

っていうのはLinuxに怒られました。
全部見てみたいな・・・

307 :デフォルトの名無しさん:01/10/26 12:43
>>306 メモリマップはOS依存
あとCの言語仕様上0番地のアドレスはNULLポインタだから使えない。

308 :AAAAAAAAAAAAAA:01/10/26 16:31
アゼンブリってVC6でもつかえるの?
実際どうよ?

309 :デフォルトの名無しさん:01/10/26 16:49
アゼンブリはサポートしてません。

310 :デフォルトの名無しさん:01/10/26 18:48
>295
・そのCPUに対してのアーキテクチャの理解
・周辺デバイスに対しての入出力制御の理解
・開発環境を構築するためのICEなどの機材の使用方法

この辺は必須のはずです。

311 :デフォルトの名無しさん:01/10/26 18:50
>290

奇数アドレスから「バイト単位」以外でのアクセス、です。
奇数アドレスでもバイト単位のアクセスならばアドレスエラーでは落ちないはずですよ。

82 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)