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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
めくるめく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
>1 機械語(マシン語)とアセンブラは違うと思われ….
3デフォルトの名無しさん:01/10/05 16:47
アセンブラ教えてください
4名無しさん:01/10/05 16:48
機械語は2進数と思われ・・・。
アセンブリ ∽ 言語
アセンブラ ∽ コンパイラ
アセンブル ∽ コンパイル
6デフォルトの名無しさん:01/10/05 16:51
Borland ターボアセンブラ は
無料DLできますか。
>>1がアセンブラとマシン語を混同しているので
----------------- 終了 ------------------
8デフォルトの名無しさん:01/10/05 17:00
>6 どうしても無料が欲しいの?

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

DOSのC++コンパイラもついてるからワンダーウイッチにも使えるぞ
アセンブラは業務で仕方なくとか、
どうしても高速化したいときとかに使う物で、
趣味でやるもんじゃねーよ。
やったら最後、地獄にハマるんだなこれが・・・

高水準言語でお気楽に構えている方が正解だぜ。
nasmとかいろいろあるじゃん > フリーの
未経験だけど、アセンブリ怖い。変な命令書いたらCPUやメモリが壊れたりしない?
ハァ?
>>11
CPUは壊れない
しかしメモリメチャクチャ
ハードディスクぐちゃぐちゃってことはよくある
ウイルスより被害大(たった数字が1違っただけなのに〜)
なんてことはざらにある
1411:01/10/05 17:34
>>13
どひー・・・。それでは手が出せないなぁ。恐ろしや。
1513:01/10/05 17:37
普通はメモリの被害だけで助かることが多い。
ハードディスクへアクセスするにはそれなりに敷居があるからね。
Cで書こうがアセンブラで書こうが、危険性に大した差はない
HDDにアクセスって、デバイスドライバを書くのでもなければ
結局APIを呼ぶだけなので何が変わるわけでもない
Cで書けるようなことをわざわざアセンプラでやる必要はない。
>>16
の言っている程度のことでアセンブラを使うのは間違いである。
プロなら使ってもインラインのアセンブラくらいでしょ。
それも速度のためじゃなくてCじゃ書けない処理を行うため。
スーパースケーラーなCPUではパイプラインの動作を人間が
追いきれないので最適化でコンパイラに勝てるなどと思うのは
素人の浅知恵です。
もし、Cをアセンブラで書き直したら早くなったってのは元の
プログラムがダメだったってことだ。
1913:01/10/05 18:27
Cの最適化は最も適切な機械語コードを吐き出すわけではない。
部分的には最適化されていても、
全体を通してみると完全に最適化されいるわけではない。
アセンプラを使う理由はそこにある。
よってアセンブりコードはある程度複雑さを持っているということは自明であり、
複雑なことをするために相応の危険が伴う。
2013: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
>>19
別に危険は伴わないって
バグが発生しやすいだけ
何故アセンブラが危険を伴うと決めつけたがるんだ?
2319:01/10/05 18:46
>>22
アセンブラのバグ=危険なの!
あなたはアセンブラの経験が少ないのですか?
それともバグをあまりださない完璧な人だったのですね。
>>23
Cで書こうがバグがあったら危険だろ
アセンブラ云々は関係ない

Cで発生せずアセンブラでのみ起こるような危険など発生させたことはないが
具体例を挙げてみてくれ
25デフォルトの名無しさん:01/10/05 19:00
>>13
>ハードディスクぐちゃぐちゃってことはよくある
無ぇよ
>ウイルスより被害大(たった数字が1違っただけなのに〜)
ハァ?

先入観と妄想が激しいようですな
>>24
例えばメモリのA番地からB番地までをクリアするコードを書いたつもりが
ループの終了条件を間違えてB番地以降もクリアしてしまった場合。
Cのコードならばsegmentation faultやアクセスバイオレーションで終了してくれるが、
アセンブラならばそのままメモリの最後までクリアしてしまう。
>>26
OS持っているメモリ保護機能はCで書こうがアセンブラで書こうが同じように動作する
アセンブラをなんだと思ってるの?
なんか、最適化で人間はコンパイラにかなわないって言ってるやつが
またいるよ(*´Д`*)

だったら、なんでCPUのアナライザなんか売ってんだよ。
人間の最適化が必要だからだろ。
29デフォルトの名無しさん:01/10/05 19:22
1-44
グレート!
3013:01/10/05 19:22
>>27
わかった俺が馬鹿だった。80386以降はメモリ保護機能がついていたな。
>>27
ニーモニック"変換機"だと思われ
>>26
warata
332:01/10/05 19:37
期待したんだがレベルの低いスレなのでsage

一般教養として身に付けとけ.アセンブラ判らないと
「キャッシュに載るように」なんてのも判らんだろ?
>>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万だよ。
君らが書く位のアセンブリのルーチンならCのソースコードレベルで最適化した
方が速いんだよ。
そりゃ中にはそれ以上のことをやる人はいるけど、アセンブラで動く物作った
位で得意になってるようなやつには吉野家のコピペ貼っちゃうぞ。
>>37
自慢がしたいだけ?逝ってよし
>>36 イディオムなぞに頼っていてはプロセッサ変わっただけで通用しなくなるよ。
Pen3->Pen4とかの違いでもうだめじゃん。
41デフォルトの名無しさん:01/10/05 20:22
>>9
>アセンブラは業務で仕方なくとか、
>どうしても高速化したいときとかに使う物で、
>趣味でやるもんじゃねーよ。
???
どっちかというと趣味でやる(やりたくなる)もんじゃないの?
高級言語だと靴の上から足を掻いてるみたいで気持ち悪い−もっとダイレクトに書いてみたい、という動機で。
>>41
そういう方はどうぞやってください。
ホビイスト(と限定しなくてもいいか)の知的探究心を満足させるものとしては最高だと思うよ。ソフトウエアの一番底、これより下はない、という所までのぞき見る事ができる訳だから。
ホビイストがプログラミングする動機は「面白いからやる、やりたいからやる」なわけだから、変な理由をつけて止める理由はないよね。
プロになった場合でもアセンブリの経験がないより、あった方がいいんでしょ、使わないまでも。
やりたい人はおおいにやりましょう。
44デフォルトの名無しさん:01/10/05 21:02
x86のアセンブラプログラマの方っているんでしょうか?
もしいたら、どんな仕事してるかおしえてちょ!!
43の意見に賛成。
だけど、もう一方で普通の人はコンパイラに勝てないというのも正しいと思う。
そんなわけで、アセンブラを勉強するのに良い方法。
Cで簡単な関数を書いて、アセンブリソースを出力してみる。
これで勉強するとCでもアセンブラでも速いコードが書けるようになるよ。
キャリー萌え
47キャリー:01/10/05 21:18
CPUの構成要素としてはただの1ビットに過ぎないがとてもカワイイ。
>>37
最適化しなくていい世界に住んでるあんたは幸せだな。
世の中そういうところだけじゃないよ。
物理的な構成要素としてはただの電圧の変化に過ぎないのがとてもピカチュウ。
50デフォルトの名無しさん:01/10/05 21:23
x86 アセンブラ勉強したいなら 今ならDelphiから入ったらいいかもね
インラインアセンブラ強力だし
 Delphiのコンパイラの最適化は 多少弱いから 使う価値あるしさ
>>48
最適化はコンパイラがやってくれるので心配無用です
>>51
あんたはタイトなループをCで書いて満足な速度出せますか?
>>52
具体的にどんな処理を書くときの話?
5451じゃないけど:01/10/05 21:33
タイトなループが実行時間に大きく影響するようなプログラムを
書いて無い。
55デフォルトの名無しさん:01/10/05 21:34
そんなにコンパイラの最適化って優秀なのか?
2,3年前の話だけど、本を見ながらソースをアセンブラに書き直したら
何割も早くなった事がある。
素人のおれがやっても、そんなだからプロがやったらもっと
速くなるんじゃないか?
それとも、この2,3年の間に飛躍的にコンパイラの技術が発展したとか?
ループを最適化する必要がある場合もあればない場合もある。
だがプロファイルもとらずに最初から高速化する奴はヴァカ
56がいいこと言った。・
>>55 飛躍したのはCPUだよ。動作が複雑化して単純な最適化は通用しなくなったのさ。
今自分が使ってるCPUに実行ユニットがいくつ有って、パイプライン何段だか知ってる?
58デフォルトの名無しさん:01/10/05 21:42
アセンブラで最適化できる場合って
全く同じ処理を何度もする場合でしょ
そんなケースってほとんどない気もするけど
でも、今はいろいろCPUあるし・・・
だから意味ないと思う
59名無しさん:01/10/05 21:44
>37
100万くれ
>>58
ゴゴゴゴゴルァ!!
自社ライブラリを各CPU毎にアセンブラで最適化する身にもなってみやがれ
氏ぬよもう
61デフォルトの名無しさん:01/10/05 21:48
MSやらBorlandのコンパイラなら、人間最適化のほうがまだまだ優秀。
インテルのコンパイラは見たことない。
駄スレかと思ったら、けっこう議論が白熱しているね。
>>61
また知ったか君が・・・
でも人間を最適化出来たらそれが一番だろうな
>>62
内容は駄スレに値する程度のものしかありません
ここは抽象的な事を書いて知ったかするためのスレです
>>61 >>63
どっちでもいいから、煽ってないでなにか根拠を示せよ。
6658:01/10/05 21:57
>>60
アセンブラで最適化する必要のあるライブラリーってなんですか?
DSP以外にあるんでしょうか?
>>63-64
おまえが知ったかなんだろ?
アセンブラのコーディングなんてやったことないんだろ?
自分の部下にやらせているんだろ?
具体例も根拠も示さず最適化がどうのと語っている時点で
このスレが知ったかの固まりの駄スレであることは明白だろう
アセンブラは簡単に逆汗が通らない様なコードが書けるから、
パスワードの処理なんかに最適だと思うけど。
コンパイラなんかで書いていたら、すぐに解読されてしまうよ。
70キャリー萌え:01/10/05 22:05
PC(プログラムカウンタ)   王様
SP(スタックポインタ)    魔法使い
ステータスレジスタ/フラグ   貴族
アキュムレータ/汎用レジスタ  雑兵
裏レジスタ           伏兵
セグメントレジスタ       嫌われ者
71デフォルトの名無しさん:01/10/05 22:06
>>68
なぜ?
実際にアセンブラなんて使ったことなくても
コンピューターの仕組みがわかってれば
ある程度のことは予想つくのでは?
物理とか化学の勉強したことないの?
自然現象もその類
>>69
実行中の状況をトレースされたら終わりだと思うが?
>66
3D関係。リアルタイムだから間に合わなければ速くしなければ使い物にならないので。

あとLightwave, PhotoShopのプラグインなんかもコンパイラの対応していない
最新の命令(3DNOW!SSE2など)を使うためにアセンブラ使わざるを得ないんじゃないの?
よく知らないけど。
>>71
予想で適当なことを書くことを知ったかと呼びます
>>71
また、そういう意味のないたとえ話を…。
まぁ、机上の知識でもいいから、なんか具体的な話をしてみれよ。
76デフォルトの名無しさん:01/10/05 22:16
明日はこのスレは根拠となるアセンブラコードでごちゃごちゃしているかも・・・
単純な例でアルファブレンドにしても、
3Dで複雑なワンスキンメッシュのモーフィングも
アセンブラ使わんとマトモな速度でないぞ
>>73
>3D関係。リアルタイムだから間に合わなければ速くしなければ使い物にならないので。
リアルタイムならフレームレートを落とすだけ
ムービーを作るときなどのレンダリングならリアルタイムである必要はないので
間に合わないもへったくれもない
だから3D関係だからというのは当てはまらない

>コンパイラの対応していない最新の命令
これは確かにアセンブラを使わなければどうにもならないが
昔のVRAMの構成で画像を1ドット左スクロールする場合とかアセンブリ使いたくなりそう。
今は構成が違うから関係なさそうだけど。
>>78
リアルタイム描画が必要な状況では、
フレームレートが落ちてると見苦しい事が多いので、
無理をしてでも稼ごうとするもの。

レンダラのプレビューならそれでも良いんだろうけど、
デモやゲームだと見苦しいよ
81デフォルトの名無しさん:01/10/05 22:22
>>77
αブレンドは良く話題に出るがアセンブラを使わなくても高速化する方法は
そこらのゲーム作成系の掲示板でいつも話題が出る
後者はビデオカードの助けがないと、どっちみちまともな速度で動かない
>>72
そのトレーサーが使え無い様にする事もできるのだが。
>>81
その手の方法だと、トリッキーな演算するんで、逆に読みづらくなるよ。
それに、エロゲ作るんじゃないんだから、αブレンドだけで60fpsが出たからといって満足はしないよ。
フェード中にちびキャラいくつも動かしたいとか、要求はいくらでも出てくる。
>>82
てゆうかロジックがばれたら破られるパスワードなんて実際には使い物にならない。
85デフォルトの名無しさん:01/10/05 22:28
3D関係はアセンブラで最適化できるほど、短い処理じゃないですよ
86デフォルトの名無しさん:01/10/05 22:29
誰も実際のコード出さんな。
>>82
ロジックを解析しなくても、分岐を書き換えればそれで終わりです
>>85
別に全部アセンブラ化するわけではないし(場合のよってはやったが)、
先にCでプロトタイプ作っとけば、特に困難なわけではない。
ともかく高速化の要求が現実にある以上やらざるを得ないんだよね。

なんか未経験妄想君っぽいんでもう相手にするのは控えるよ。じゃあね。
89A:01/10/05 22:33
SIMD使う為にアセンブラって言っても
X87FPUは全く知る必要は無いし、
Cで元のコード書いて、ループの中だけ
インラインアセンブラで置き換えれば良いだけと、
あんまりアセンブラの知識は必要なさそう。
90デフォルトの名無しさん:01/10/05 22:36
>なんか未経験妄想君っぽいんでもう相手にするのは控えるよ。じゃあね
逃走
>先にCでプロトタイプ作っとけば
そんなしょぼいプログラムですか・・・
現代の話じゃないそうです
>>90 そんなしょぼいプログラムですか・・・

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

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

Cだとどうなる?
今日はもう放置しておいた方がよろしいかと
全部あぼ〜んしました。
96age:01/10/06 01:07
次の日になりました。
97デフォルトの名無しさん:01/10/06 01:39
cdqってどういう意味ですか。
Convert Doubleword to Quadword
>>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に依存。

って辺りで。といっても、私自身はアセンブラ不要なんて考えは
さらさら無くて、ハードに近い部分や、特定条件(引数の範囲が
特殊でそれによる最適化が出来たり)での有用性はあるし、業務でも
使っているので、このスレで頭ごなしに否定している人を見ると
「なんだかなぁ」とは思うんだけど。
>>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の勉強したいんだけど、これは必須ですか?
>>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が良くなってペンティアムを超えて欲しい。
インテルを超えて欲しいね。
110109: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やりたいとか思うんすけど、日本じゃ難しそうですね。
要するに実行速度は

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

って事でイイ?
>>113
それは間違いない。
115デフォルトの名無しさん:01/10/06 23:57
他社のハードのBIOS書いてもそれだけじゃ商売にならないしね。
大きな企業の専門部所とか入ればチャンスはあるのかな・・・?
できるやつが書いたアセンブリ>>>>>>>>>>>>>できるやつが書いたCコード
117  :01/10/06 23:59
できるやつ>>>>>>>>>>>>>>>>>>「できる」シリーズ
Ruby>>>>>>>>>>>>>>>>>>>>>>その他
二段ばね>>>>>>>>>>>>>>>>>>>>>出切るやつ
>>117
「できる」シリーズでプログラムかけるのか?(藁
>104
バグ(?)有りにつき注意>VCPP
ただ3DNowやSSE使うなら便利なのでバグ(?)にだけ注意してれば大丈夫
リリースビルド時にebxが__asm{}前後で保持されないので
自力でpush ebx,pop ebxしておかないとバグる
アセンブリだけで食っていけますか?
123デフォルトの名無しさん:01/10/07 03:52
アセンブリだけで生きていけますか?
アセンブリだけでいけますか?
カンブリアは古すぎます。
126デフォルトの名無しさん:01/10/07 04:51
昔はアセンブリ言語だけで生計をたてていた人もいたと思うけど。
いまでは絶滅したのでは。
普通はCもできるだろうからね。
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が最強!
128sage:01/10/07 07:07
>127 そんなにperlをバカにされたのが悔しいか?
129デフォルトの名無しさん:01/10/07 14:52
MMX使いたいのだけど何からやったらいーの?
130デフォルトの名無しさん:01/10/07 14:55
Z80>>>>Ruby

>>129 なんじゃそらw
13192:01/10/07 15:56
>>130 の不等号もなんじゃそらwだがな
>129
x86アセンブラはどの程度使える?
ソコソコ使えるなら
取り合えずMMXテクノロジ最適化テクニック辺りでも買ってきて読めや
VC使ってりゃインラインアセンブラでMMXは普通に使える
それ以外の処理系ならVCに変えろ
>>129
今月のC魔が買ってこい。
>133
あんなのintelのpdfの既出情報ばかりで役に立たんうえに
MMX最適化部分については殆ど述べてないじゃん
>>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

ではダメなんですか?
こっちの方が早い気がするんですけど。
では x=1 としましょう

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

abs(1)=2 ですか?
>ABS関数は大抵のコンパイラで

って どこで読んだの?
cdqってキャリー立ったっけ?
立つなら、adc eax, 0で良いんじゃ?
と、思ったけど、別にsubだろうがincだろうが速度に違いはねーわな
141デフォルトの名無しさん:01/10/09 14:18
142138: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
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やっておけば大丈夫
>>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種類のセグメントって要するになんですか?教えてください。
嫌です
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ってスタックエリアに
定数そのままプッシュ出来たっけ?
>>156
CPUのアーキテクチャねぇ。
俺はアセンブラは趣味程度にしか弄らないから
一般教養程度しか頭に入ってないな。
名前以上のことを知ってるのは
IA-32、IA-64、68k、MIPS、SHぐらいか。
PowerPCやAlphaのことはまったく知らんな。
R2000とかだったら内部ダイアグラムを読むぐらいはできる。
でもあくまでも教養の範囲なんで
いきなり組み込み系の仕事をやれとかいわれても困る。
Linuxは触ったことない。ソースを一目見て反吐が出た。
どうでもいいが少し口の聞き方に気をつけた方がいいぞ。
>>156
何様のつもりだ。
textはコードセグメント
dataはデータセグメント
bssは初期化されていないデータセグメント
データセグメントはスタックセグメントと重なる場合もある。(DS=SS)
セグメントは物理メモリをリニアに見た時の覗き窓で、
8086のレジスタ仕様の64kByteまでしか一度に(効率的に)
アクセスできない制限を緩和する役目をはたす。
64kというのは、レジスタの長さが16bitなので、65536バイトまで。
161デフォルトの名無しさん:01/10/10 19:56
>>158
結構知っとるやんけ
自分はLinuxをメインに使っている
Linuxの全てを知り尽くしたい
それでカーネルソースというわけ
そのうちemacsとかxwindowのソースも読んでみたい
口の聞き方は直らんのでゆるせ
くるしゅうない
>>160
おいおい、セグメントって何だよ。
セクションだろ
>>161
直らないんじゃなくて、直そうとしないだけ.
厨は本でも読んどけ
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系じゃない人も
具体的にどこらへんを直した時に
どの程度早くなったのか教えてください
当然比較したコンパイラを書いてもらえないと、
かなり意味ないんですが・・・
>>167
動くコード以外に何を書くというのだ?

Intelのコンパイラもたいしたこと無い。
アレが完璧ならVTuneなんて売れるわけ無い。
つーか、VCよりも遅いこともあるし。
170166:01/10/10 20:50
少しはからんで欲しかった(泣
ネタはプログラマ板でやれよな

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

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

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

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

で、Intelのコンパイラに問題があるなら
どのへんが問題なのか教えてくれよ
>>172
別に問題はないよ。
ただ、Intelのコンパイラが特別優れているというわけでもない。
>>172
>>動くコード以外に何を書くというのだ?
>誰が読んでも、コンパイラよりも最適化されたコードって意味だろ

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

172の文も日本語的におかしいし駄目だこりゃ。
>>160-171
うわっ、とっても解りやすいです。
ありがとうございました。
日本語大事だよ。仕事でプログラムやるならプログラミング言語以上に。
>176 そりゃそうなんだけど、そういう話ふるなら プログラマ板でやってね

>>157
 それ 8086 のコードじゃ無いじゃない 386以後のコードだよね?
レベル低い
アセンブラで書くような処理を 低レベルって言うんだよ>>178
180デフォルトの名無しさん:01/10/10 22:48
>>176
他のやつがソフトウエア工学をあまり知らなかったせいだと思われ
単なる動くコードっていうのは、
ソフトウエア工学でいう、まともな設計がなされてないコードの事
慣用表現のひとつだよ
>>180
じゃぁ、優良なコードは動くとは言わんのか?
ソフトウェア工学には 動くコード なんていう言葉の定義があるのか?
182デフォルトの名無しさん:01/10/10 23:01
>>181
おい、あほまるだしだぞ?
3流童貞大学院生802警報です。すいませんが非難おねがいしまーす。(ワ
>>180
「単なる動くコード」と「動くコード」では意味合いが違うぞ。
もったいぶらないで「動くだけのコード」とか書こうぜ?
185デフォルトの名無しさん:01/10/10 23:41
Windowsで目覚まし時計作りたいんです
アセンブラで作れますか?
802、童貞3流大学院生なら作れるのだが、、、うーん。どうだろう俺には無理だ。
802師匠に作ってもらうとイイ
>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では無理。
カシオやセイコーに就職しましょう。
>>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
アセンブラスレここしか
ねーじゃねーかよ!!!

いかにマイナー言語かがわかるな。
マイナーか否かなんて大した問題ではないのにな。
アセンブラ以外でMMXのコード書いてくれよ
>193 その理解で可

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

かな・・・ まあご飯食べたい為の仕事なら外の仕事がいいかも
>>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;
とかレジスタ分の変数用意して、それだけしか使わず、
パイプラインも考慮して書いたりとかするようになるから、
結局アセンブラで書いた方が楽だったりする。
>>195

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

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

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

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

この手の組み込み関数使ってても、
速度を追求して逝くと、結局はレジスタの数とか
ニーモニックとの対応やパイプラインを考えていくと、
ほとんどアセンブラと変わらん内容になってしまうので、
あんまり使い物にならんが。
199197==198:01/10/11 19:03
むぅ、回線切れたので書き込めてないと思ったが、
ちゃんと書き込めてたのか。2重投稿(しかも微妙に内容違う)スマソ。
>>197
インテルコンパイラに入ってる ivec.h なんかのベクタクラスライブラリを使うと

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

こんな風に直感的に書けるね。
201197:01/10/12 00:13
>>200

そだね。でも、所詮は↑の組み込み関数のラッパーに過ぎないから、
直で組み込み関数使った方が実行速度は速いかな?
あと、実際には同じmmレジスタを8bitx8で扱ったり16bitx4で扱ったりとか
する場面が結構出てくるから、そういうときベクタクラスだとやりにくいかも。
2021:01/10/13 03:09
しかし、このスレ結構伸びてるな。
アセンブラスレに飢えていたのか?
>>191
なんでやねん!!
204デフォルトの名無しさん:01/10/15 12:03
MASMとVC++のDOSでのコンパイラをリンクさせるにはどうすればいいんだろうか
入門以前の事について書いてるページとかないよね
>>204
DOSでって、16ビットコンパイラの話をしているのか?
206デフォルトの名無しさん ?:01/10/15 15:27
>>203 なんでやねん禿堂。
秋月で買い物すればいいような気が。
>>204
ふつーにOBJファイルを生成したあとにリンクさせればいいじゃn
208デフォルトの名無しさん:01/10/15 16:01
>>204
public
_
呼び出し規約
とか、その辺?
209デフォルトの名無しさん ?:01/10/15 17:27
>>208
「MASMと…コンパイラをリンク」って書いてあるから
オブジェクトファイルをリンクさせるのとは
違う意味らしいよ。

>>204
Makefile を作っておいて、
nmake に Makefile を食わせればよい。
「入門以前」というより、ビルドを速くやるための浦和座というか…
裏技かよ?>漏れ
>>204
まず日本語入門サイトを探せ
211204:01/10/15 18:31
おお、レスありがとうございます。

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

>210
すみません。
プログラム始めたばかりなので質問しようにも知識が足りなくて。
下のコードは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;
>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よ
お前にはアセンブラは向かないから理解するのを諦めろ
214213:01/10/16 02:18
グハ…ミスった
MOV BL, byte ptr [ESI]→MOV BL, byte ptr [ESI+1]
逝ってくるわ
>>212
ediには64KB(256x256)の置換テーブルがあるってことかな。
これによるキャッシュ溢れも原因かもね。

loop1もloop2もそうだけど、1ループあたりの処理データ量が少ないなあ。
一回分ぐらいはunrollしてもいいと思うけど。
216212: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;
217212: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;
218212:01/10/16 03:36
>Test8(下のソース)を20回ぐらい連続して呼び出すと、
>Test6と同じぐらいの速度になりました。

毎回違う文字列でテストしたら、Test8は速くなりませんでした。
219212:01/10/16 03:49
>215
>ediには64KB(256x256)の置換テーブルがあるってことかな。
Loop1は256バイトの置換テーブルです。

Loop2は64K*64Kバイトの置換テーブルを用意して、
2バイトづつ置換しています。
220213: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は短いコードを書けば速くなるわけじゃないんだよボウヤ
(無論無意味に長いのは問題外だが)
221212:01/10/16 06:32
なぜ、Test8を同じ文字列で20回ぐらい連続して呼び出すと速くなるのでしょうか?

部分レジスタストールについては今やっています。
220さんありがとうございます。
222212:01/10/16 06:42
@@Loop:
xor eax, eax
mov ax, [esi]
mov ax, [edi + eax]

これだけで部分レジスタストールは回避されるのでしょうか?
223213: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次キャッシュに乗るからでないの?

テーブルは全体でなく、
入力文字列を処理するのに必要な分だけ乗ればいいことに注意。
225213: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に関する詳しい知識がないならアセンブラによる最適化はお奨めできないよ
あちゃーsageそこねた
loop1はまだunrollする余地があるので最適でないね
228213:01/10/16 08:24
まぁアンロールできるけど
実質的なチューニング的には殆ど終わったも同然でしょ?>loop1
そうだね。 すでに1回アンロールしてるようなもんだし、さらにやっても1割かな

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

それでも、どうしてもなんとか高速にしたいなら PCMPEQBで8バイト
同時に比較してはXOR・ANDマスクして置換すれば・・・・うーん
でも英大文字を英小文字にするとか一方向置換にしないといけないし
1ループで4回の置換作業が必要だから 速くなるかどうか判らないな
230213: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レジスタが足りなくなったことだ……
231pcode 本人:01/10/16 13:36
懐かしいね。
もう一度アンロールしても手間の割には早くならない。

「アセンブラで書けば速くなる」という迷信を砕くのが目的だった
から、アセンブラグルの方々、212 の無知を許してやってくれや。
あと、MMX化すれば何でも速くなると思っている人も多い。
最近では「P4はSSE2最適化すれば何でも速くなる」と思っている人が多い。
233197:01/10/16 14:50
>>232

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

ちなみに、Pentium!!!で試したところ、実行速度に差違は見られなかった。
誰かPentium4で試してみてよ。
>その証拠(?)に、インテルのコンパイラには、浮動小数点演算を
>x87命令を使わずにSSE/SSE2のスカラ命令を使うってオプションがついてた。

そんなオプションないよ。
x87とSSE/SSE2を併用するというオプションはあるけど。
またx87,SSE/SSE2併用オプションでコンパイルしてもほとんど速くならないケースは多い。
あとP4の場合、SSE/SSE2スカラの加算命令は、2クロック毎に1つしか実行できないから、
x87の加算命令の半分のスループットしか出ない。
235229: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回必要だから、やっぱり改善にはならないかもねえ
236229: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データ
237229: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);
238197:01/10/16 22:42
>>234

漏れの記憶違いか……?

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

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

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

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

これは次のように変更するべき
でブラウザを検索すると見つかります。
242213: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
完全にランダムなDWORD値を作る最速のルーチンを教えて
>>243

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

つーか、ランダム性と処理速度とどっちを重視するのか言ってくれないと、
紹介のしようもない。
245Delあめ猫にゃ: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さんはこれでも満足できないのかもしれないけど

ソフトでやるのでは、回数が少なければ、
サイコロ振って乱数表作ってメモリに入れとけば、
規則性のない乱数列が作れるんじゃない。
周期性は避けられないが。
ノイズ拾ってデジタルデータに変換するADCあたりを
シリアルポートにでもつなげ
248246:01/10/17 22:57
>>247
んならサウンドカードでええやん、
>>248
24bit以上のデータを扱えるオーディオカードならな。
普通のサウンドカードだと、16bit、しかも低い値しか取れないから、
拡大すると荒い乱数しか取れない。
250212:01/10/18 07:03
213さん、重ね重ねありがとうございます。

215さんも224さんもありがとうございます。
キャッシュが・・・、と言われていたのに・・・。
>>249
例えば32bitの乱数が欲しければ、サンプルの下位1bitだけを
使用するとして32個サンプリングすればよいんじゃないの?
(本当はもっと偏りがないようにうまくやったほうが良いが)

これなら16bitサウンドカードでも大丈夫だ。24bitのサンプル1個を
そのまま乱数に使うってのは頭が悪いとしか思えん。
>>251
速度が遅くなんない?
どのぐらいかかるか知らないけど
>252 というか WavInデバイスを使うってだけで1秒にせいぜい2*44.1K/秒 だからね
 M系列とかの乱数種に プログラム起動時に1回使うだけならともかく
21 34 12 3E FF C9
255デフォルトの名無しさん:01/10/21 04:55
何クロックかかるとかどの資料を見ればわかりますか?
Intelの資料に書いてあるけど、P6以降はあまり意味がないような・・・
CPUが新しくなるほど遅くなってそうだね。
>255 資料見るより 実際にコード書いて >>245 にあるRDTSCで数えさせる
259255:01/10/21 13:39
>>256
ありがとうございます。
えと、どの資料でしょうか?
上中下ある、インテルアーキテクチャ・・・は見てみました。

>>258
サンクス。確かに使えそうです。
260デフォルトの名無しさん:01/10/21 16:41
コンパイラについて

一番わかり易くコンパイラを解説した書籍を教えて?
ドラゴンブック?
岩波?
>>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進数なんでしょうか?
コンピュータ内部では2進数。
2進数だと見づらいから、人間は16進数で見ている。
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・・・て固定しようとするんですけど・・・。
266265:01/10/22 08:33
add esp, -8... は void func(int a=0)を呼び出す時のコードです・・・
最近のx86CPUのデータバスは64bitだからです >265
268デフォルトの名無しさん:01/10/22 08:38
>>265
スタックを4つというのは、4バイトを4個ってことだよね?
それは16バイトアライメントです。
269265: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
>>269
「HOW TO OPTIMIZE FOR THE PENTIUM PROCESSOR」はよくまとまっているけど
内容が古い。読み終わったらすぐ、Intel のプロセッサマニュアルを読みなされ
271255:01/10/22 17:40
たとえば2のn乗になる数をかけるとき普通にmulを使うより
shift演算したほうが早いとか、そういうのはどのような資料からでしょうか?
>>258さんが言われるようにRDTSCで測定しているだけではありませんよね?
>>271
Idiom
>>271
ftp://download.intel.co.jp/jp/developer/jpdoc/iaopt_j.pdf
これのページ 1-5 とページ D-1
274255: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で取り出される値は未定義である。
SPはひとつ。
 呼び出し時、引数を共通のスタックにPUSHし、その後帰り番地をPUSHした後、関数fにgoto=JMPする

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

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

というのが今の普通のやり方
ちなみに 詰まれたスタックを関数内部で破棄して帰るのがpascalスタイル
呼び出し側で破棄するのがcスタイル
280デフォルトの名無しさん:01/10/23 07:47
SPってスタックを指すアドレスのことですか
>>280 SP=スタックポインタ
  ∧ ∧  ./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (;;゚Дメ)< それも判らんで質問してたんかい
  /  |  \_____________
〜(___ノ 
SPはレジスタでしょう?
スタック私
スタックアドレスを保持するレジスタ
アセンブラ勉強するならOSは何がいいの?
>>285
X68000
>>286 それOSちゃう!
それをいうならHUMAN68KとかOS-9とか、、
288285:01/10/23 14:49
やっぱMSXじゃ駄目なのか・・・
289285: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で使えます

だからやっぱりインテル系だね。
>>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 のコードには、どんな意味があるのですか?
>>296
0D 0A みっけ。
でも 00 とか FF とか多いな。
>>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アセンブラを学びたいのですが、解説してるサイトとかってありますか?
検索しても全然出てこない・・・。

もしくは、薦めの勉強方法ってありますか?
御教授お願いします。
>>301
ttp://www.6502.org
ってそのものずばりのサイトがあったよ。
オペコードなどの説明もPDFファイルで見られる。
303tiger book:01/10/24 21:45
>デジタル回路の回路図は最低限読めないと
一応電気工学科なのですが、オラクルばっかりやっていて、すっかりわすれて
います。
デジタル回路を学ぶための良書教えて!
304343:01/10/25 15:50
age
305301: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に怒られました。
全部見てみたいな・・・
>>306 メモリマップはOS依存
あとCの言語仕様上0番地のアドレスはNULLポインタだから使えない。
308AAAAAAAAAAAAAA:01/10/26 16:31
アゼンブリってVC6でもつかえるの?
実際どうよ?
アゼンブリはサポートしてません。
310デフォルトの名無しさん:01/10/26 18:48
>295
・そのCPUに対してのアーキテクチャの理解
・周辺デバイスに対しての入出力制御の理解
・開発環境を構築するためのICEなどの機材の使用方法

この辺は必須のはずです。
311デフォルトの名無しさん:01/10/26 18:50
>290

奇数アドレスから「バイト単位」以外でのアクセス、です。
奇数アドレスでもバイト単位のアクセスならばアドレスエラーでは落ちないはずですよ。
>>308
_asmで駄目か?
313デフォルトの名無しさん:01/10/30 23:31
あげ
314デフォルトの名無しさん:01/10/31 01:04
ペンティアムってインデックスレジスタとかあんの?
I/0マップは増えたの?
315デフォルトの名無しさん:01/10/31 03:09
レジスタの値が0かどうかを調べる場合
cmp eax, 0
よりも
test eax, eax
の方がコードサイズが小さい
という記述があったんですが、どうして小さいんでしょう?
どちらも一行に見えるんですが。
>315
cmp eax,0 →83 f8 00
test eax,eax→85 c0
「cmp eax,0」は3byte、「test eax,eax」は2byte
即値使うとコード(バイナリ)サイズがでかくなるので
この場合test eax,eaxのが小さい
317315:01/10/31 03:53
>>315
ありがとうございます。わかりました。

とだけ書くのはゴミレスなので私でもできるのを一つフォロー
>>6
http://www.microsoft.com/ddk/
というのがあります。私は今これで勉強中。
>>314
質問の意味がよく分からないんだけど。

「インデックスレジスタ」という名前のレジスタがあるの? という意味なら「ない」

アイゼロマップって一体何? マップは増えたり減ったりしないと思うけど。
あと、「増えた」って比較対象は一体何?
I/O空間のサイズという意味なら、8086のころからずっと64KBのはず。
319元本職:01/11/01 18:16
>>318

アゲアシとりスマソ。
アイゼロってなによ?
アイオーでしょ? <<Input/Outputだし

>8086のころからずっと64KBのはず。

リアルモードではそうだけど、プロテクトモードは?

>3.3.3. 拡張された物理アドレス指定
>IA-32 アーキテクチャは、Pentium Pro プロセッサ以来、
>最大64G バイト(236 バイト) の物理メモリのアドレス指定を
>サポートしている。プログラムまたはタスクは、
>このアドレス空間内の位置を直接アドレス指定することはできない。
>代わりに、プログラムまたはタスクは、最大4Gバイトのリニア・
>アドレス空間を個別にアドレス指定する。このリニア・アドレス空間が、
>プロセッサの仮想メモリ管理機構によって、
>より大きな64G バイトの物理アドレス空間にマッピングされる。
>プログラムは、セグメント・レジスタ内のセグメント・セレクタを
>変更することによって、この64G バイトの物理アドレス空間内で
>リニア・アドレス空間を切り替えることができる。
>拡張された物理アドレス指定を使用するには、
>プロセッサがプロテクト・モードで動作し、オペレーティング・
>システムが仮想メモリ管理システムを提供する必要がある
320318:01/11/01 19:29
>>319
いや、>>314の揚げ足取りのつもりだったんだけどね。
>>314をよ〜く見てみて。

で、拡張されてるのはメモリ空間の方で、I/O空間については現在でも、
プロテクトモードでも64KBだよん。

メモリマップドI/Oのデバイスではもちろんメモリ空間にI/Oポートが配置される
けれど、>>314では「I/Oマップ」とあったので、I/O空間
(IN, OUT命令でアクセスする方)についての話をしたわけです。
>>320
ああ、アイゼロマップだw
322_:01/11/01 23:25
コードセグメントのデータは書き換えられないの?
書きかえられます
324_:01/11/01 23:57
>>323
ありゃ。nasmで

SECTION .text
GLOBAL myfunc:function
myfunc:
mov DWORD[.integer], 8
ret

.integer DW 0

でcall myfuncしたら以降実行しなくなるんだけどなんでかな・・・
.text セクションって、読み込み専用属性なのでわ?
Win9x系とかの甘いOSならOKだろうけど、
NT計だと確実にAccessViolationで落とされそう。
326デフォルトの名無しさん:01/11/02 00:05
アセンブラは好きだけど、セグメントはカンベンしてほしい。
Windowsなら、書き換えるためのAPIがあったと思う。
328_:01/11/02 00:07
>>325
なるほど。.textセクションって言うべきだた。
どうもありがとう。
サンプルだけで理解するの大変だ・・・
329_:01/11/02 00:12
>>326
セクションならいいの?
(私全然アセンブラ分かってませんw)
WindowsのコードセクションならPEヘッダのコードセクションのヘッダのところにある属性を書きかえればいいだけだよ。
M$のリンカなら書くセクションの属性を変えるオプションがあったが・・。
NASMっつうことはALINK使ってるのかな。ALINKじゃ無理なんで、バイナリエディタで書きかえればいいYO
WinならVirtualProtect()とかで動的に書きこみ可能にするとか。
332デフォルトの名無しさん:01/11/02 02:19
アセンブリ言語は全く分からないが、
デバッガのためだけにでも勉強してみようと思う今日この頃
しかし実際のところ、.textセクションの値なんて書き換える必要あるのかな?
試しにやってみたいだけというのなら全く構わないんだけど。

もし本当に書き換える必要のあるデータなら、そもそも.textに置くこと自体が
間違ってるし、命令の自己書き換えなんてやったらキャッシュのせいで
うまく動かないような気がするんだけど。
x86にはもう興味ないね。
こいつが進化を妨げている。
>>334
IA-64のネイティブをコーディングしてみたら?
進化を感じるかも...
>>335
開発環境は手に入るかもしれないけど、
実行環境は個人が入手できるものじゃないだろ
337_:01/11/05 06:47
OS Linux, ASSEMBLER nasmで

SECTION .bss
integer resb 4

SECTION .text
mov [integer], DWORD 1

push DWORD[integer] ; (1)
call printarg ; 引数を表示するサブルーチン
add esp, 4

でintegerの内容 00000001が表示されるとしたら
(1)を

push DWORD[0] ; (1)
に変えたらintegerにアクセスできるかなーと思ったんですが
当然できないですよね・・・
実行時integerがどこに配置されるかはわからないのでしょうか?
どうしたら分かりますか?
カーネルの勉強でもしないと駄目なのかな。
338_:01/11/05 07:18
>>337
objdump -xでシンボルテーブルを見て080A04D8だったので
push DWORD[080A04D8H]にしたら行けました。
でも.bssの最初が080A04C0なのに間が空いてるのは何故ですか?
この区間は固定?
339_:01/11/05 07:50
>>338
ld にマップファイル吐かせるとわかりました。
先頭はcrtbegin.oが使ってるんですね。
その次に割り当てられていました。
そのまた次のlibc.aのbssまでの区間がちょうどコーディングで使った分だったのに感動。
当たり前だけど。
アセンブラって面白い・・・
340KITE:01/11/06 17:23
KITEボードの命令セットに関して長所と短所を教えてください。
341ななし:01/11/10 00:46
アセンブラ初心者なのですが
とりあえずarrowasmを手にいれて以下のようなコード
CR EQU 0DH
LF EQU 0AH

STACK SEGMENT STACK
DW 32 DUP(0)
STACK ENDS

DATA SEGMENT
MSG DB CR,LF
DB 'Hello MS-DOS world'
DB CR,LF,'$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MSG
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START

でコンパイルしてみました。
するとオブジェクトファイル***.objは
できたのですがこれをlink ***.objとすると、

LINK : error : Segment reference infixup record
test3.obj : fatal error LINK1123: failure during conversion to C0FF:
file invalid or corrupt
と出てしまい実行ファイルが作れません。
いろんな本に載ってるコードを何度も何ども
打ち込んでみているのですが、
どれもうまくいきません。
なにとぞお助けください・・・・
linkのオプション必要とか?
ちゃんと 16bit 版の link を使ってるか?
申し訳ないのですが!!!

アセンブリ言語というのは統一されたものですよね!

同じ処理をさせようとしても、CPUによって組みかたが違う場合がある
ってだけですよね!

「○○をアセンブラで組む」
「××アセンブラ入門」
この本に書いてあるアセンブリ言語はこのCPU専用なのか!!?と途惑ってます!
なわけなかろうと思いますが自信はありません。
345341:01/11/10 01:49
>342
そのあたりがよくわからないのですよ・
初めて読むマシン語、はじめて読むアセンブラ、MASM初級プログラミング
を買い込んできていろいろ読んでいるのですが・・・
>343
MicroSoftのlink ver5.12.8078です。
link.exeなので16bit版のはずなのですが・・・
346デフォルトの名無しさん:01/11/10 01:54
>>344
CPUによって違う。
>>346
あるCPU(仮にA)のAXとBのCPUのAXは働きが違うということでゴザイマすか!!?
348デフォルトの名無しさん:01/11/10 02:03
>>347
CPUによってレジスタの数も名前も違う。
CPUの設計そのものが違う。
いい具合に混乱してきましたで!!!

つまりはCPUによってAXの名称が、例えばAXVになったり
全く違う言葉になってしまうと、そういうことですか!!?
>>344
CPUによって(とういうかアセンブラによって)
ニーモニックも違う。jmpだったりbrだったり。
351デフォルトの名無しさん:01/11/10 02:08
そういうこと。
あ〜〜なるほど。
本当のホントに「そのCPUについて、モトから理解しなきゃいけない」
ってことなんですな。

ははー、なるほど。よくわかりました!!!
>>352
そゆことです。
R1,R2,R3...なんていう投げやりなレジスタ名も珍しくない。
どっちかというと86系の汎用レジスタの名前がこじつけだと思う。
つか、最近のほとんどのCPUはレジスタ名が数字だよね。
汎用レジスタの個々に名前がついてて、レジスタによって使える命令に
制限がある(直行性が悪い)のは、最近ではx86系くらいでは?
元の設計が古いから仕方ないが。
もうどうにでもなれ、みたいな(w
よっしゃ!できた!
>>352 は全然理解できてないに3000点
360デフォルトの名無しさん:01/11/10 05:01
>>352
勘違いされてるかもしれないので . . .
名前が違うのは重要じゃないです。
仕様そのものが違います。
C++ と java と Pascal と Lisp くらい違います。
CPU が違えばアセンブラは全く別の言語といってもいいと思います。
アセンブラがどんなふうになるかは CPUの設計しだいです。
361デフォルトの名無しさん :01/11/10 06:41
DATA1 DW 0005H
DATA2 DW 00FFH
RESULT DW 0

START:
  MOV AX,DATA1
  ADD AX,DATA2
  MOV RESULT,AX

AXにDATA1をいれてそれにDATA2を足して結果をRESULTに入れる
というコードを書いたのですが
MOV AX,DATA1
コレがきちんと動きません。
MOV AX,0005H
とDATA1の部分を即値で書くと動くのですが・・
同様に
ADD AX,DATA2
MOV RESULT,AX
もだめです。どうやら、
変数を使用して値を移動させようとするとだめみたいです。
なんででしょう?
>>361
NASMだと

MOV AX,[DATA1]

にしないとだめかも。
363デフォルトの名無しさん:01/11/10 09:14
初歩的な質問ですみません。
mov eax,[eax]
という命令をよく見かけるんですけど、これはどういう意味ですか?
[] は間接アドレス  Cでいう *演算子相当

つまり axで示すアドレスのメモリの値をaxに
>>361
362の他にはセグメントが違うとか。。。
symdebでステップ実行してみればよろし。
>>345
その link やっぱり 32bit 版じゃねーのか。
32bit でもファイル名は link.exe だ。
367デフォルトの名無しさん:01/11/10 17:50
CASLは、何て読むんですか?
カスル?キャッスル?
368:01/11/10 19:43
キャッスルだ
369でふぉ:01/11/10 19:46
キャッシーローラーってIBMの人はいってますよ
370デフォルトの名無しさん:01/11/11 00:41
「元気にご来店ありがとうございまーす」

『風邪ひいてるんだけどな』
371デフォルトの名無しさん:01/11/11 00:46
アセンブルなんて、結局めんどくさくなって、Cで書いたのをディセンブルして張り付けよ〜(ワ
372デフォルトの名無しさん:01/11/11 20:42
Pentium以降のCPUで16(or 8)bit整数演算を行う利点って、
32bitに比べてサイズが小さいからキャッシュに入りやすい、
ってことくらいでしょうか?
>>372
32bit環境下で16bit命令はオペコードにプレフィックスが憑くから、
命令サイズが1バイト増えてデコードが送れたりキャッシュミスしやすくなる
374372:01/11/11 22:49
>>373
サンクス。
すると、データ持っているときは16(or 8)bitで
実際に演算するさいは32bitでするのが良いのですね。
8bit命令にはプレフィクスつかないよ。
16bit命令と32bit命令はオペコードが同一のものなので、
プレフィクスの有無で判断してる。

それから、当然即値やアドレスをとる命令は、
16bitのものの方が短くなるよ、。
376デフォルトの名無しさん:01/11/12 00:04
SSEって使ったこと無いんだけど、レジスタを
8 x 16のpacked byteとして使えるの?
377372:01/11/12 01:17
>>375
>>372
>すると、データ持っているときは16(or 8)bitで
>実際に演算するさいは32bitでするのが良いのですね。

>それから、当然即値やアドレスをとる命令は、
>16bitのものの方が短くなるよ、。
の場合には16bitの方が良いってことですねー。

ありがとうです。
378デフォルトの名無しさん:01/11/12 21:08
アセンブ?を勉強しててふと思ったんですけど
よくCの教科書本で書いてある関数の再帰利用ってのは
アセンブリコード的にはスタックをがばがば使う駄目なコードなのかな?
呼び出す度にスタックが増えていくような気がするんですが違うのかな?
>>378
そう。
組み込みとかだと、スタックが数Kバイトしかないというのはざらにある。、
下手に教科書に載ってるようなアルゴリズムを実装すると、即死する場合が
あるので注意が必要・・・
380デフォルトの名無しさん:01/11/12 21:14
基本的にはその通りです。再帰するたびにスタックを消費します。
末尾再帰といって関数の末尾で再帰してる場合には、
(その関数のスタックはもうつかわないので)
スタックを再利用することができます。
もちろんそのとおり。
そしてよく教科書に書いてあることが、現実社会でよく使われるとは限らない。
382381:01/11/12 21:16
つーか、結構このスレ下の方にあったのに、同時に3人コミットするってどうよ。
再帰厨にひとこと言いたかったの
>>380
関数の末尾で再帰してる場合にスタックを喰うか否かは言語(実装)依存だろ。
これを定義してる言語はSchemeしか知らないけど。
>>384
そうだけど、最近のコンパイラは偉いからきっとやってくれるでしょう。
386デフォルトの名無しさん:01/11/12 23:28
何事も「やり方次第」
教科書に書いてあることもな。
>>385
期待しすぎ。
>>385
関数型言語とgcc以外はやってくれましぇーん。
意外とおバカな処理系ばっかり。
389378:01/11/13 01:30
>>382
罵倒なしにこんなに暖かくレスしてもらったの初めてで嬉しかったり(藁
これだけだとごみレスなのでお勉強したあせんぶ?のページのポインタ。
「@鈴希」
http://tt.sakura.ne.jp/~suzu/
読みやすくて最初に読むのにぐっどかと。
アセンブラで汎用機壊したいんですけど出来ますか?
Netscapeからバグを取り去りたいのですが!!!!!!
できますか!!!!!!!!
391と仲良くなりたいのですが!!!!
できますか!!!!
あの会社のバグというと、某氏のことか?
394デフォルトの名無しさん:01/11/13 03:34
あげちゃう

いろいろ見てるとmovbとかmovlとかあるんですが
b,lって何でしょうか?
b は byte で、 l は long?
396_:01/11/13 06:27
>>394
nasmを少ししか使ってないから良く知らないけど
たぶん転送する値の大きさを指定してるのでは?
movb 1バイト movl 4バイト ?

私も質問。LinuxとかWin2Kでスタックのサイズって限界あるの?
もちろん限界はあります
398_:01/11/13 06:38
なるー。それでヒープがあるのか。。。
また質問で申し訳ないんだけどヒープってどこにあるのかな?
OSが独自にアドレスもって管理してるの?
Cは独自に管理してるとか書いてあったけど
それと同じように自分のdataセクションとかに自分で作れないのかな。
ヒープはOSが管理してくれると思う。
>それと同じように自分のdataセクションとかに自分で作れないのかな。
何がやりたいのかいまいち分からん


それをプログラム
”それをプログラム”は無視してくれ。
401_:01/11/13 06:50
resbでデータセクションにでかくメモリとって、そこに
そのプロセス独自のヒープつくれないかなって思いました。
でも、よく考えたらそれじゃサイズが固定されてしまうのか。。。
うん。固定されてしまうね
403_:01/11/13 07:05
うーん。検索してると「詳細Linuxカーネル」っていう本が
メモリ管理詳しく書いてそうなので今度買って見ます。
アセンブラ知ると色々仕組みが分かるのがいいですね。
>398 セクションというのはアセンブラなら自分で定義する事が多いけどね
  そもそもセクションなんてない1パスなアセンブラもあるけど・・
>>401 それは組み込みなら既存ライブラリを使わなきゃならない時に使うよ。
 ソースがあったら、malloc 書き換えてstaticにしてしまうんだけどね
ところで、
>>398
スタックサイズに限界があるからヒープがある、と理解したように
読めるんだけど…。ヒープサイズにももちろん限界はあるよ。
そもそも使用目的が違うし。

Linuxの場合、メモリ空間の頭の方からtext、続いてdataセクションが
あってそれに続くbss(0で初期化されてるdata)が後ろのアドレスに拡張
できるようになっていて、それがヒープとなる。この拡張はbrk()や
sbrk()というシステムコールで行われるので、この辺のmanも見てみると
いいよ。

スタックは、メモリ空間の最後の方のアドレスから逆方向に伸びていく。
ヒープはユーザーが明示的に増やしてやらないと増えないけど、スタック
は使用されるにしたがってOSが自動的にメモリを確保して割り当ててくれる。
ヒープとスタックはメモリの両端から逆方向に向かって伸びていくので、
論理的な限界はアドレス空間の真中でお互いがぶつかるまでかな。
(shared libraryのことを考えない場合)
407デフォルトの名無しさん:01/11/13 15:43
>>404
自分で定義できるものなのか。凄い。
メモリ空間のパーティションみたいなものなのかな。

>>405
いいなー。なんかメモリを自由自在に操ってますね。

>>406
なるー。やっとヒープがどこにあるか分かりました。謝々!!

|----------------------------------|
| text |
|----------------------------------|
| data |
|----------------------------------|
| bss |
|----------------------------------|
| ヒープ |
| ↓(brk, sbrk) |
| |
| |
| |
| |
| esp |
| ↑ |
| スタック |
|----------------------------------|

こんな感じですか?
そういえばmalloc()で割り当てられたメモリに0が入ってるのって
bssセクションに割り当てられるからなのかぁ。凄いな。
408406:01/11/13 19:28
そうそう。そんな感じです。
実際には、ヒープとスタックの間の空間にshared libraryのtextとdataが
配置されているけど。
Linuxなら、cat /proc/<プロセスID>/maps とやるとそのプロセスの
アドレス空間の配置を見ることができるよ。

あと、余計なお世話かも知れないけど、確かに新たに拡張されたヒープの
中は必ず0でクリアされてるけど、だからと言ってmalloc()で確保する領域
が0でクリアされてるとは限らないので注意。malloc()はfree()で解放した
領域を再利用するけど、その際にわざわざクリアしたりしないので。
(それをやってくれるのはcalloc())
409_:01/11/13 21:03
>>408
おお、こんな風に見れるとは。ほんとLinux(UNIX)はプログラマーのためのOSですね。
ちょっと考えたんですけど、この仕組みならなんでメモリリークがあるんですか?
プロセスが消えた時全部消えそうな気がするのですが・・・

#今度のItaliumではehp(ヒープレジスタ)も欲しいかも。
>>409 #今度のItaliumではehp(ヒープレジスタ)も欲しいかも
こんなナンセンスなCPUいらない。
ItaniumってIA-64だっけ?
だったら汎用レジスタが128本もあるというバケモノという話だけど
プロセスが消えればね…。
LinuxもWindows NTもリークが問題になるのは終わらないプロセスの問題。
この言語勉強しようと思っているところです。

それで、アスキーのページから「はじめて読む8086」が消えているのですが、
ひょっとして絶版なのかな?
前に見た時、>>21からのリンク先には有った気がしたのですが。

どんなもんでしょうかね?   さげ
>>412
1週間ほど前に本屋に行った時は売ってたと思う。
絶版かどうかは知らんが、あるところにはあると思う
414デフォルトの名無しさん:01/11/14 19:22
Linux(x86)においてのアセンブリコードと実際に占めるバイト数の対応表ないですかね?
例えば関数の初期化処理の
push %ebp
mov %esp, %ebp
なら3byte、みたいな。
インテルのマニュアルを見るか、ディスアセンブルするか・・
話題ないなぁ
417_:01/11/17 07:45
Itaniumとか面白くないかな?
これとこれは組み合わせ可能だから、、、とか手でやるの?
Itaniumって、なんであんなにクロック周波数低いの?
800MHz程度じゃ、大抵の処理はがんばって最適化しても
Petium4 2GHzの方が速いんじゃない?
386が出た頃もそうだったように 64bit命令である事が重要なんだろう。きっと
レジスタたくさんあって組みやすそうだな。
286の方がセグメントの処理が軽いから、同クロックだと286の方が
速いというやつだね。20MHzの286を出してたのはIDTだったか、AMD
だったか・・・
レジスタの幅は64bitあっても多少便利な程度だけど、ポインタが64bitだと
すごく(・∀・)イイ!!。
うーん・・・・ハードディスクが4Gだと少ない時代だからなあ・・・・
425_:01/11/17 18:57
レジスタの数が多いのは嬉しいですね。あと複数の命令を1ステップで
実行できるとか、ちらっと雑誌で見たんですけどアレってプログラミング
が複雑にならないのかな?並列でしか意味ない?
>>425
その辺はコンパイラが面倒を見るという話らしい。
命令の同時実行は単純には今と同じ。
それを重視して設計をしたということ。
IA-64では幾つかの処理をひとまとめにした
バンドルという単位でプロセッサへのデータ入力が行われ、
1つのバンドルに含まれる処理は同時に実行される。
バンドルを構成するのはコンパイラの仕事になる。
427_:01/11/17 20:14
>>426
なるほど。ブラックボックスになって欲しくないな。
アセンブラ組むのが簡単ならいいんだけど・・・
>>427
アセンブリ自体はそう難しくはないと思うが、バンドルを手で構成するのは
地獄だと思われ。
429四歳:01/11/17 20:44
コード 9らっきんぐ 暇なときやっている人いる?
430_:01/11/18 11:47
アセンブラに興味がある方へ
書籍が少なくて戸惑うと思いますがアスキーの
「はじめて読む8086」「はじめて読むMASM」「はじめて読む486」を読みつつ
インテルにあるPentiumのマニュアル(pdf)を手元において
「gcc -S」が吐くコードを「Item2gas」でgasからnasmの形式に変えて読んだり
色んな所に落ちてるnasmのサンプル打ち込んでみたりしたら
思ったよりすぐ分かるようになりました。
Cでポインタとか分かってる人はすんなり頭に入ってくると思います。
お試しあれ。
431デフォルトの名無しさん:01/11/18 13:14
Item2gasが見つかりません。
すみませんが、ポインタを下さい。
Intel2gasじゃないのか?

www.niksula.cs.hut.fi/~mtiihone/intel2gas/
なるほど。
itemって何だろ? って悩んでたんですよ。
どうももありがとう >>432 >>430
434_:01/11/19 13:51
w
ネタになってるし。
intel2gasです。申し訳ない。
付け足すと国内のページではアセンブラの情報がすくない気がするので
英語のページで検索かけたほうがいいと思います。
http://www.linuxdoc.org/HOWTO/Assembly-HOWTO/index.html
http://webster.cs.ucr.edu/Page_asm/ArtOfAsm.html
がお勧め。あとnasmのマニュアルかな。和訳ページもあったっけ。
http://guriponn.tripod.co.jp/others/japanise/nasmdoc0.html
435名無しさん@お腹いっぱい:01/11/19 13:53
拡張子がasmのファイルってどうやったらアセンブラできるの?
436デフォルトの名無しさん:01/11/19 13:55
8051のアセンブラの勉強に役立つ
日本語のページ教えれ
437デフォルトの名無しさん:01/11/19 19:07
>>430
「gcc -S」でないとダメ?VC++なんだけど。
438_:01/11/19 19:54
VC++にもアセンブラコードを出すオプションはありませんか?
439デフォルトの名無しさん:01/11/19 20:59
>>438
SEなんでついてないのかな・・・
探したけど見当たらない・・・・
いい逆アセンブラってありません?できたらフリーで。
440439:01/11/19 21:01
SE?何書いてんだ俺・・・
アカデミックバージョンでした。鬱邪内ケド氏脳・・・
>>438
/FAs
>>435
nasm
>>435
窓ならMASM
>>443
窓でもnasm
445デフォルトの名無しさん:01/11/20 22:47
質問です。
仮想メモリで32ビットアドレス表現なんだけど
どうやってプロセッサは一般保護例外って判断できるの?
セグメントがページングに変わるから判断できないと思うんだけど・・・
>>445
ページングするから判断できる。
物理メモリに存在しないページを要求されたらプロセッサは
一般保護例外を出す。
それをOSが拾ってページを割り当てる。
割り当てるページが無かったらSegmentation Fault。
447はじめて読む6809:01/11/21 02:09
>>430
その3冊手に入れました。頑張って勉強してみます。
遅レス失礼しました。

ところで、「はじめて読むMASM」、
兄弟本、「はじめて読むマシン語」、「はじめて読むアセンブラ」も絶版?

はじめて読むシリーズ危うし。
>>446
一般保護例外(0Dh)でなくページフォルト(0Eh)だよ。
>>448 スマ フォローTHX
450デフォルトの名無しさん:01/11/21 23:31
なーる。ありがとうございます。
451デフォルトの名無しさん:01/11/21 23:39
もう一つ質問です。
ページフォルトであるページを物理メモリに割り当てますよね?
そしたらその割り当てられたアドレスはセレクタ+オフセットで
表されてるのですか?
それともやっぱり32ビットの仮想アドレス?

うーん。
要は仮想アドレスを使っていてどうやって
タスク間アクセス保護が出来るのかって事が知りたいのです。
物理的に隔離するんだよ>451
>>451
逆だよーん。ほんとはもっと複雑だけど、すごーく簡単に書くと
selector -> GDT or LDT -> base address
base address + offset -> page table -> physical address
で、タスクごとにpage tableをごにょごにょする。

詳しく知りたきゃ
http://developer.intel.com/design/pentium4/manuals/245472.htm
を読むべし。
454デフォルトの名無しさん:01/11/22 19:41
タスクごとにpage tableをごにょごにょする、ですか。
う〜ん。
う〜ん。
がんばって読んでみます。ありがとうございました。
やれやれ、レベルの低いスレですな :3)
456デフォルトの名無しさん:01/11/22 20:17
とにかく速い!マシン語ゲーム集
のモービィディックというゲームが面白かったです。
あの本の最後の笑い話の意味がわかったとき
道を踏み外したなと確信しました。
457デフォルトの名無しさん:01/11/22 23:30
アセンブラを勉強したいのですが、
http://www.vector.co.jp/vpack/filearea/win/prog/asm/index.html
ここから探した結果、
MASM 準拠で8086〜PentiumPro,MMX,3DNow! 命令に対応したマクロアセンブラ
http://www.vector.co.jp/soft/win95/prog/se183316.html
これが一番よさそうなのですが、どうですか。
458デフォルトの名無しさん:01/11/22 23:41
>>457
ダウンしましたが、
「通常はVC++といっしょに使ってください」
と書いてあったので、やっぱりだめみたいです。
NASMでええやん。
460___:01/11/22 23:47
でもhmx-12,13には何かひきつけられる物があるんだが?
461デフォルトの名無しさん:01/11/23 08:19
>447

は?マジで絶版?うそだろ
462デフォルトの名無しさん:01/11/23 12:49
>457, 458

それは、NWSA というアセンブラだけど、有償版には、
統合開発環境(デバッガ、逆アセンブラ付き)があって、
リンカも付いてくるので、Visual C++ がなくても単体
で開発できるよ。

アセンブラの統合開発環境で、ライセンス的に合法なのは、
これくらいかもしれないから、それなりに価値はあるんじゃ?
463デフォルトの名無しさん:01/11/23 13:24
化石。

LD A,3
SUB B
RET
464デフォルトの名無しさん:01/11/23 22:32
フリーでダウンロードできて、ドキュメントがそこそこそろっていて、インテル系のアセンブラのソフトはなんという名前ですか?
なんか検索しても変なページばっかり出てきます。
ようするに時代は終わったということでしょうか。
vectorのプログラミングカテゴリを見たら2個ほどあったよ。
NWSAとPasm
ニモニック一覧くらいならついてるんじゃない?
>>464
問題になるのが速度だけならgccのインラインアセンブラを使えば
フリーでドキュメントがそこそこそろってると思うけど…

それともファイルサイズとかを限界まで攻めるために
純粋なアセンブラが必要なのだろうか。
たぶん、出来る出来ないが問題なんだろうよ
468デフォルトの名無しさん:01/11/24 00:46
タダたんにちょっと勉強してみたいだけですよ。
Cを勉強する前にアセンブラをやるのが常識みたいだし、アセンブラができるとドライバーが書けるみたいだし、ドライバーが書けると女にもてるみたいだし。
469だだ:01/11/24 00:52
>>468 ドライバーが書けると女にもてるみたいだし。
そりゃないだろ。
470デフォルトの名無しさん:01/11/24 00:56
貴様はアレか?その、アレか?
女にモテたいがためにアレか?その、何だ、斡旋ブラやってるのか?
「こんなのどうでしょうお嬢さん」とかアレか?言うんか?
「お似合いですよ」がアレか?殺し文句か?
471デフォルトの名無しさん:01/11/24 00:59
>>469
ねただろ。ボケェ
472デフォルトの名無しさん:01/11/24 01:07
473デフォルトの名無しさん:01/11/24 08:49
タダたんにちょっと勉強だったら Delphi6 パーソナル。
 インラインでアセンブラ書けるから勉強するには丁度いい

 いきなりアセンブラだけでは試すのさえ厳しいよ
474デフォルトの名無しさん:01/11/25 13:38
アセンブラ勉強するのにはIntelのHOMEPAGEからマニュアルをダウンロードして手元に置いておけと以前ありましたが。
具体的にどのファイルが必要なのか解かりませんでした。
教えてください。よろしくお願いします。
>>474
つーか、あのWebページから探し出すこともできないんじゃ、中身を
読むこともできないような気がする・・・

Developer - Software - Pentium4 - Reference Manual で辿ってみな。
あとはどれか必要かわからないなら全部落としておけ。
476デフォルトの名無しさん:01/11/25 14:56
具体的にアセンブラ使って高速化に成功したケースを教えて欲しい
どういう処理がボトルネックになってて、
どういう風に解消したんですか?

アセンブラやるには、CPUのパイプ処理とかも考慮するのですか?
ハザードに関しても,考慮するのですか?
そうだとすると人間の手でやるとバグが出る気が・・・
ありがとうございます。全部落としときます。
478デフォルトの名無しさん:01/11/25 19:33
だれか476の質問に答えてやれ
479デフォルトの名無しさん:01/11/25 19:50
アセンブラって
(1)高速化
(2)ドライバ書く
以外の用途ってないんですよね?で、ドライバってCでも書けるんでしょ?
最適化はコンパイラがやってくれるよね?
>>479
組み込みだとコードサイズに制限があるからそのために使うことがある。
最近はどうだか知らんけど。
何も考えずにアセンブラで書いても
コンパイラより1.5倍程度速い。
ループしている部分には効果的
案外アセンブラで書くほうが綿密に計画するから
バグも少なかったりする。
ネイティブコードって遅いんでしょ?
VMの方が速いよね?
>>482
VMってドリキャスのVM?
>>481
VC++は漏れが書いた浮動小数点演算コードより2倍速かった
一生懸命考えて書いたんだが・・・欝だ
コンパイラにもよる。
x86はダメそうだけど、ARMのCコンパイラは凄かった。
アセンブラで書いたのと比べて遜色無いコードを吐く。
486デフォルトの名無しさん:01/11/25 23:29
具体的にアセンブラ使って高速化に成功したケースを教えて欲しい
どういう処理がボトルネックになってて、
どういう風に解消したんですか?

アセンブラやるには、CPUのパイプ処理とかも考慮するのですか?
ハザードに関しても,考慮するのですか?
そうだとすると人間の手でやるとバグが出る気が・・・

俺も知りたい
out-of-orderがあればほとんど考慮する必要ないよね。
アセンブラによる高速化ってSIMD命令を使うのとかが多いのでは?
これってコンパイラでやるの難しいよね?
最近SHやってるけど、面倒くさくてアセンブラで書く気しない、というか
書いても速くなる気がしないよ・・・。割り切って、ブートとMMUにしか
使ってない。
サターンをアレしてるのかね?
>>488
SH仲間発見。おれはSH3と格闘中。ゲーム機とはかんけいないけど。
491488:01/11/26 01:22
>>490
同じくSH-3ダヨ。ゲームとも無関係。
とか言って、なにげに同じプロジェクトの担当だったら笑えるな(藁
492デフォルトの名無しさん:01/11/26 02:25
>>486
に対してまともな回答できるやつが一人もいない
という事は、ここにはアセンブラ使いがいない
493デフォルトの名無しさん:01/11/26 03:05
え?ああ、例えば関数型IF。
アセンブラだとレジスタ同士の計算一発で終わる(1行)
のを、駄コンパイラはスタックに入れたり出したりで5行も10行も
吐く。
アセンブラ専用のサポート機能が付いたテキストエディタってある?
同時実行可能な命令のペアだと色が変わるとか
各命令の実行クロック数が命令の右肩に出るとかそういう機能が付いた奴。
んじゃ書くか…

>486
当方ゲーム(主にエロゲ)プログラマだけど
インラインアセンブラでMMX命令を使って画面ワイプとか高速化してるよ
クロスフェードとかやる分にはCコンパイラの吐くx86コードの数倍以上速い

パイプとストールは一応考慮してる、最適化は局所的だから
きちんとCPUに関する知識を身に付けてりゃそうそうバグらない
クロスフェードするエロゲってそんなに無いな
糞なメモリ性能でよく作った。
きょうび、クロスフェードもできないエロゲエンジンも珍しいと思うが。
498495:01/11/26 07:29
うん、今時比較的普通だよね?
つーかMMXやSSEなんかは3Dや画像操作系のアプリなら使ってておかしくないし
ゲームも3Dものはほぼ常識、エロゲだってMMX程度なら常識になりつつある
で、こういったSIMD系命令を使う場合はやっぱアセンブラの知識がないと
intelCはSIMDを含んだ最適化もしてくれるけど
アルゴリズムが簡単な場合は最初からきっちり作ったアセンブラのコードには勝てないよ

あとアセンブラ使ったのっていったらLZ77の圧縮展開ルーチンとかかな…
Cのみのコードと比べたら倍ぐらいになったよ

>486は自分で作ったものをプロファイルとってボトルネックを調べるとかはしないの?
ボトルネックになってる部分が単純な関数ならアセンブラに起こしなおすだけで
かなり高速化できると思うんだけど?
499へたれ:01/11/26 12:36
>>494
うわ、それすげぇ欲しいんだけど。
つくれ〜つくってくれ〜つくってください〜
500デフォルトの名無しさん:01/11/26 15:20
アセンブラで高速化したプログラムって
CPU依存になるの?
パイプの段数が違えば、ストール起こす条件もCPUによって違うわけだから・・・


493が言ってる最適化の効果はどれくらいなの?
分岐予測が間違えると・・・っていう事で
あとに来る共通して使える命令が入ってるんじゃなかったっけ?

あと、一つ気になったのはCと比較してるけど
C++のコードをアセンブラで高速化する事って無いのでしょうか?
それともC=C++という意味?
501デフォルトの名無しさん:01/11/26 15:23
>>500

アセンブラは機械語と一対一だからCPUに依存するよ。
502501:01/11/26 15:24
CPU依存で機械語と一対一だからこそ、無駄なコードを極限まで省けて、対象のCPUにもっとも適したコードを書けるというわけ。
503デフォルトの名無しさん:01/11/26 16:14
じゃあ、市販のソフトでアセンブラで高速化してあるやつは
インストールする時に、
CPUを調べてインストールしてるの?
504仕様書無しさん:01/11/26 16:22
>>498
プロファイルとってみて異常に時間がかかってるところって、最適化以前の
問題を孕んでることのほうが多くない?
それに、処理内容が単純な関数だったら、CでもC++でもアセンブラで
も大差ないし。

>>503
そういうソフトもあるけど、CPUの判別は実行時に行うことが多い。
インストール後にCPU交換されたら困るじゃん。
505デフォルトの名無しさん:01/11/26 17:21
>>503

私の知っているソフトの中では、YAMAHAの「S-YXG100」というソフトシンセサイザーがあるよ。
CPUがIntel PentiumII以上でないとVL音源のプラグインがインストールされないの(Celeronは基盤がPentiumIII(II?)だからインストールされる)。
もっとも、アセンブラーで高速化しているからという理由かどうかは分からないけど。
>>494
>アセンブラ専用のサポート機能が付いたテキストエディタってある?

Peggy Proぐらいしか知らない。
507デフォルトの名無しさん:01/11/26 22:51
>>505
それは単純にpentium2以上じゃないと、VLなんて動かないからだと思われ
まあ、動いたとしても使い物にならないだろうな

>インストール後にCPU交換されたら困るじゃん。
もっともだ(笑)
508デフォルトの名無しさん:01/11/26 23:43
>>507

最新のAMDのプロセッサにはインストールされないけど・・・・・
509508:01/11/26 23:44
ちなみにSG音源のプラグインならAMDのプロセッサにもインストールされる。
510デフォルトの名無しさん:01/11/27 18:12
それって体験版・・・
>>510
http://www.yamaha.co.jp/product/syndtm/p/soft/syxg100/spec.html

見ろ。
もっともいつの間にかAMD Athlon/Duronでも動くように改良したみたいだけど。
512デフォルトの名無しさん:01/11/29 09:49
基本はCで、所々インラインアセンブラで最適化する必要が出てきたんですけど、
構造体のメンバの参照は一般的には自前で計算するんでしょうか。
当然コンパイラや開発ツールに依存する問題ではあると思うのですが。
マニュアルはしょぼすぎて、その辺の記述がほとんどのってないんです。
その辺(インラインアセンブラ)の作法についての文献、HPなどがあれば
教えてちょ。
513Kusakabe Youichi:01/11/29 10:02
>>512
In article <[email protected]>, "512: デフォルトの名無し
さん" <[email protected]> wrote:
> 基本はCで、所々インラインアセンブラで最適化する必要が出てきたんですけど

> 構造体のメンバの参照は一般的には自前で計算するんでしょうか。

ほかにどうするというのでしょうか?
何か便利なマクロが使える環境もあるでしょうけど、
それはその環境依存ですから、一般的には何とも言えないでしょう。

> 当然コンパイラや開発ツールに依存する問題ではあると思うのですが。
> マニュアルはしょぼすぎて、その辺の記述がほとんどのってないんです。

具体的にはどういう環境のどういうCを使っているのですか?

> その辺(インラインアセンブラ)の作法についての文献、
> HPなどがあれば教えてちょ。

そういうところで一般的なコツみたいなのがもし見つかったとしても、
あまり役に立たないでしょうね。
>>512
メモリの構造を理解してないのなら、アセンブラを触らない方が良いと思われ。
>>512

メモリーの構造を理解していなかったらCも使えないと思うけど。
CPUの構造まで理解する必要はないけどね。
516515:01/11/29 10:59
>>514の間違い
>>512
VC++なら構造体の変数名でオフセット指定できる。他のコンパイラもできるようになっていればできる
MSDNライブラリ【__asm ブロック内の C/C++ データへのアクセス】参照
518 :01/11/29 12:22
昔のハードでは1バイトもムダにすまいと、
実行コード&データレベルでの圧縮をよくしたものだ。

ビットフィールドは当たり前
519デフォルトの名無しさん:01/11/29 12:42
>>518
今でも組み込みの一部では残ってるよ、その文化。
メモリが4kしかないと苦労するって
>>512
インラインアセンブラを使う場合には、コンパイラがサポートしてる可能性があるから、
それを調べる。

ほんとにアセンブラだけで書く場合には、事前にオフセットを計算して(<stddef.h> の
offsetof マクロを使うのが汎用的な方法)一覧を表に書き出しておいて、それを使う。

たとえば GNU as を使う場合だと、簡単なプログラムを作って、

#define OFFSET_XXX  3
#define OFFSET_YYY  8

みたいな一覧表を出力させて、これをアセンブラのソース中で #include したうえで

movl OFFSET_XXX(%eax), %eax

とかね。
521512:01/11/30 12:45
皆さんレスありがとうございます。
ツールのサポートに問い合わせた所、自前で計算してくれとのことでした。
一応、構造体の先頭アドレスは _構造体宣言名 で取得できるので結構楽かも。
522デフォルトの名無しさん:01/12/03 22:51
86系のアセンブラを勉強したいんだけど、どんな本を買えばいいの?
または、どんなページを読めばいいの?
523デフォルトの名無しさん:01/12/03 22:56
86系は最悪!
でもしょうがないのか・・・。
http://www.csl.sony.co.jp/person/fnami/asm.htm
http://www.csl.sony.co.jp/person/fnami/pentopt.htm
524デフォルトの名無しさん:01/12/03 22:57
>>522
アスキーから出てる「はじめて読む8086」「始めて読む486」あたりかな。
あと、Intelのページは情報の宝庫。
525デフォルトの名無しさん:01/12/03 23:00
86系はレジスタが変だから止めたほうが良いと確かによく言われますが、実際、自分のマシンのCPUがセレロンの1GHZなので、しょーがありません。
おしえてもらったページや本を読んでみます。
ありがとうとがいます。
526あなん:01/12/04 01:42
う〜ん。
そういえば、以前は68系ってもマシンがあったから、
選択肢として現実的だったけど・・・今はどうなんでしょね?
やっぱx86マンセーなのかしらん。
つかヲレもずいぶん前に会社でx86系やらされたクチだけんど。
527へぼぐらま〜:01/12/04 01:45
・TEST AX, AX
とか、
・XOR AX, AX
とかとか、
やってるのを良く見かけますが・・・テメェ自身にナニしてるんですか?
528デフォルトの名無しさん:01/12/04 01:52
上はフラグを変化させる。
下は0にする。
529デフォルトの名無しさん:01/12/04 01:52
>>525-526
8086系は16bitの時代は、セグメントとかアドレッシングとか
めんどうだったけど、今は、そうでもないんじゃない?
(自分自身、もうアセンブラは使わなくなってるんで、あれだけど)
それはもう極楽です >> 529
531デフォルトの名無しさん:01/12/04 02:05
あの、VC Ver6.0 Pro 使ってるんですが、_asm{}構文の中って、MMXコードまでしか
使えないんでしょうか。
SSE命令とか使ってみたいんですが、アセンブラにはじかれます...。

なんかどこかの雑誌では、サービスパックVer3以降をインストールすればいいと書いて
あったのでインストールしてみたのですが変わりません.....。

教えてください。
532デフォルトの名無しさん:01/12/04 02:16
モエage
>>531
MS のサイトから Processor Pack ってのを探してきてインストール。
これで SSE 対応のアセンブラが入ります。
534デフォルトの名無しさん:01/12/04 02:33
ありがとうございます。マジで助かります。
535デフォルトの名無しさん:01/12/04 13:53
SP5でいいじゃん
536デフォルトの名無しさん:01/12/04 14:20
NTはなぜシャットダウンできないのですか・・すみません。
invoke ExitWindowsEx,1,0
invoke ExitProcess,eax
MSDN読め。つーか、スレ違いだYO
538>536:01/12/05 01:01
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.386
.model flat, stdcall
option casemap :none
.code

start:

jmp @F
szDlgTitle db "ColdBooT MASM",0
szMsg db "どうかな?",0
@@:

push MB_OK
push offset szDlgTitle
push offset szMsg
push 0
call MessageBox
invoke ExitWindowsEx,1,0
invoke ExitProcess,eax
end start
539デフォルトの名無しさん:01/12/05 04:24
CASLヤリタイ・・・デモCモマダダッタ・・ヽ(,`Д´)ノウワァーン
>>539

あほか。
ちと質問です。
マルチスレッドでロックをかけたい場合、VCでは
CriticalSection(&cs);
を使いますが、これは遅いので
xchg eax, [ecx]
を使ってるプログラムがあります。
この根拠とか解説が詳しく載っているお勧めの文献はありますか?
>>541
Intel の Web サイトから拾える Intel Architecture Software Developer's Manual.
>>541
これだとロック中だ、ということが解るだけでwaitしないから
CriticalSection()使ったほうが楽じゃない?
>>542
Thanks、とっても3冊あってでかい・・・。
ちと検索してみます。
>>543
実際はループしてます。
L1:
mov eax, [ecx]
test eax, eax
jz L0
jmp L1
>>544
movじゃダメだろーというのは置いといて、
ループ中は他のスレッドの処理が遅くなるから結果的に遅くなるような気がする。
待機中はできるだけCPUタイムを割り当てないようにしたほうが吉。
>>545
ケースバイケース。

- マルチプロセッサシステムで、他のプロセッサと競合する資源に対する排他アクセス
- 短時間しかロックしない

場合には、コンテクストスイッチを発生させない方が好ましい場合もある。
>>546
まさにビンゴです。
そうか、内部でCPUを解放させる処理が入っているので
CriticalSection()は遅いのか。

>>545
全部書かずに失礼。元のソースはこんなです。
CriticalSection()より8倍速く動きます。他に書き方はあるのかな?
__inline void lock(volatile int *ptr)
{
__asm
{
mov ecx, ptr
L0:
mov eax, 1
xchg eax, [ecx]
test eax, eax
jz end
L1:
mov eax, [ecx]
test eax, eax
jz L0
jmp L1
end:
}
}
>>547
そりゃブロックしなければ速いだろうが
ブロックしたときCPUを無駄遣いする(>>546の例外を除けば)
549デフォルトの名無しさん:01/12/09 11:30
優良スレアゲ
>>547

何で、ループを二つも作る ?

__inline void lock(volatile int *ptr)
{
_asm {
L0:
mov eax, 1
xchg eax, [ecx]
test eax, eax
jnz L0:
}
}

だけでいいと思うが...。
>>550
xchgがバスをロックするから迷惑ってことだろ。
552550:01/12/09 13:03
>>551

ああなるほど、なんかそう言う仕様だったような気がして intel のサイトで確
かめたかったのだけど、今なんか落ちてるみたいなんだよ。俺だけ ?

ftp://download.intel.co.jp/jp/developer/jpdoc/24319102_j.pdf
553名無しさん:01/12/09 15:55
>>552

今は入れるみたいだけど。
どう?
ftp://download.intel.co.jp/jp/developer/jpdoc/
554552:01/12/09 16:57
>>553

落ちてるみ宅見えたのは漏れのミスだったわ、すまん。以前ルーターの
テストでフィルター設定したあと戻すのを忘れていたよ。

>>551
xchgがバスをロックするから迷惑ってことだろ。

確かにそうだわ、確認した。
俺だわ。アセンブラだわ。たわわ。
日本語のマニュアルがあったのか・・・。英語を読んでて失敗。
上中下巻とここにあるようだけど、
ftp://download.intel.co.jp/jp/developer/jpdoc/24319002_j.pdf
ftp://download.intel.co.jp/jp/developer/jpdoc/24319102_j.pdf
ftp://download.intel.co.jp/jp/developer/jpdoc/24319202_j.pdf
大元のページが分かりません。ここは少し違うようだし。
http://www.intel.co.jp/jp/developer/design/mobile/manuals/index.htm
リンクの紹介は見つけたけど。
http://www.ncfreak.com/ncf_os/#asm
どうでもいいが、TIのVLIWプロセッサ(DSP)って使ったことある人いる?
アレ、一応Cのコンパイラもついてるんだけど、速度出そうと思うと
アセンブラで書くしかなくなるのよ。
VLIWマンセー
ちなみに最大8命令実行可能。

話題と全然離れるのでsage
558554:01/12/09 18:09
>>556

え゛、普通に http://www.intel.co.jp から...

1. デベロッパ → ハードウェア、ソフトウェア、およびウェブ...
2. 製品情報 → インテルアーキテクチャ → IA-32 プロセッサ
3. お好きなプロセサを選んで、マニュアルをクリック
4. お好みのマニュアルとをクリックする
5. サーバーの場所をクリックすると ftp でダウンロード

で、できますが...。
559558:01/12/09 20:45
誤字修正
6c6
< 4. お好みのマニュアルとをクリックする
---
> 4. お好みのマニュアルをクリックする
>>558
さんくす。
ただ、IA-32の下巻への日本語リンクが見つからなかったので
上でFTPできるのと内容が違うのか、と思ったので。
細かい話なので無視していいです。

後、実はIA-32の意味が分からなかった。
Intel Architecture 32ビット、の略だったのか。
561 :01/12/14 00:27
 アセンブラは うんず上で MASM を MMX 、SSE などのために使っているくらい。
実は最近、Linuxにはまり NASM を使ってアセンブラを書こうとしたのだが、
特に擬似命令などが全然違うではないか?

 NASM の構文が載っているページ知ってたら教えてくれ。(できたら日本語希望)
>>561
イヤダンヌ
563三頭神:01/12/14 00:39
564 :01/12/14 13:01
565564:01/12/14 13:24
>>560 のマチガイ 上の二つにツラレタ スマソ
>>564
MMXの解説コーナーにあったのか。さんきゅーです。
アセンブラなら6809。
6309は邪道です!!
Z80?
ふっ・・
うんずってFM-TOWNS?
569デフォルトの名無しさん:01/12/15 17:00
GCCのインラインアセンブラの書き方が分かりやすく載ってるHP教えてください.
570 :01/12/15 17:09
ここなんかいいです >> 569

www.me.ics.saitama-u.ac.jp/~fujita/linux_mmx/
571デフォルトの名無しさん:01/12/15 19:28
>567
6309ってレジスタ増えてたっけ?
572デフォルトの名無しさん:01/12/15 20:09
誰かMacOSX上でアセンブラを使う方法
ってゆうかサンプルコード見せてくらさい。
573MacOSX:01/12/15 20:17
>>572

興味本位だけでやるな。迷惑だ。
574スマソですが:01/12/16 00:12
CASL IIについてCユーザでも理解できそうな本はありませんか?
575デフォルトの名無しさん:01/12/16 00:17
>>574

CASLIIなんて無駄無駄。
情報処理試験でしか使えないだろう?試験ならあんたの使えるCで受けろ。
>>571
レジスタも命令も増えてます。
おまけにネイティブモードにすればスピードが3割増!!
でも命令の拡張の仕方が美しくない(w
577デフォルトの名無しさん:01/12/16 02:23
DOS時代からC言語をやって来ましたんで、C、C++は人並みに
できますが、アセンブラに関してはMOV命令ぐらいしか知らない。
こんな俺がX86系CPUについていちから勉強したいのですが
どういう本がおすすめでしょうか?
579名無し募集中。。。:01/12/16 02:59
/ミヽ     /ミヽ
||@ノノノハヽヽ@||
ミ/川  \||||ヽ彡
 |||ノ \  卅|||||
 ( |   ・  ・ | ) <asmで1FD OS といったらmenuet。
 νゝ " д"ノし テトリス,marioとtelnetが入ってる。そん代わりsshは無し。
           ttp://www.menuetos.org/   

>If you have some experience in 32 bit assembler you are
>welcome to join coding.
ま、玄人は参加して日本語サポートするヨロシ
580デフォルトの名無しさん:01/12/16 11:27
>>576
>でも命令の拡張の仕方が美しくない(w

だいたい、拡張命令って既存の命令の隙間に無理やり突っ込むから、あんなもんで
しょ。80 系よりましと思うけど ?
581仕様書無しさん:01/12/16 11:44
アセンブラ・・・、もういい。せめてCで書きたい。低容量低速度小電力ワンチップもう飽きた。
582あわわ:01/12/16 14:41
すいません、お聞きしたいのですが
機械語知らないのにバイナリエディタで
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010 02 2E 9C AA BA B7 FF 7E 97 34 EE DD 75 D2 CB AF
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(↑アドレス)
入力してと1.exeで保存して実行して遊んでたら
Microsoft (R) KKCFUNC バージョン 1.10
Copyright (C) Microsoft Corp. 1991,1993. All rights reserved

KKCFUNC が組み込まれました.

マイクロソフトかな漢字変換 バージョン 2.51
(C)Copyright Microsoft Corp. 1992-1993
とODS画面に表示されてしまったのですが何かやばいでしょうか?(汗
環境はwin2000にPenIIIです。
>>579
惚れた♥
584デフォルトの名無しさん:01/12/16 18:39
>>581
PICとかAVRかい?
>>582
何がしたいのかよくわかんないけど、MZ/PE形式のバイナリじゃないから、
DOSのバイナリだと思ってDOS窓で実行してるんだと思われ。
586デフォルトの名無しさん:01/12/18 10:08
>>585
MZ/PE形式のバイナリ
って、なんですか?
exeにも、bmpみたいに、ファイルフォーマットがあるのですか?
あるのならフォーマットについて教えてください
>>586
なんでもかんでも、おしえておしえて言うなよ。
あつかましいよ。
キーワードばっちり提示されてんだから、まず検索してみろよ。
588i586:01/12/18 10:23
>>587
スマソ。調べた
http://www.bd.wakwak.com/~opapa/VC/Specification/EXE.htm
見つかった。
589 :01/12/18 19:36
アセンブラの洋書本、一冊買おうと思ってるんですけど、どれがいい?

www.amazon.co.jp/exec/obidos/tg/browse/-/3954/249-0246110-6828367
590デフォルトの名無しさん:01/12/18 19:48
  MOV AX,1
  SHL  AX,20

これを実行するとAXの値はいくつになる?
(i386CPUでリアルモードで実行とする)
>>590
0じゃないの?
mod 32 で動くから SHL AX, 0 と同じになって 1 のまま。
ってのを狙ったと思うが、世のほとんどのアセンブラは
デフォルトで十進表記だから 1 を左に 20 ビットシフトした値。

が正解でしょ。
AXレジスタは16ビットしかないのですが…
594高校生:01/12/18 21:18
最近アセンブラに興味を持った高校生ですが、PDP11の
インストラクションセットを解説したドキュメントなり
Webサイトなりありませんかね?
>>594
PDP-11 ということは、もしかして UNIX Version 6 のソースを読もうとしてる?
596kcrt:01/12/18 21:46
みんなでEB->90しようぜ〜
597高校生:01/12/18 21:51
まだグローバル変数の構造体同士にどんな参照関係があるか
UMLで起こしてる最中。coremap,sqapmap,proc,user,text,
sysent,file,inode,filesys,mount,bdevsw,cdevswがどんな
参照関係を持っているのか、どの関数によってどんな作用を
受けるのか調べているところ。(思ったより単純だ)
ターゲットであるPDP-11に関する詳しい飼料が欲しい。
386/286のシフトは下位5ビットしか使わないんだよ
86はバカ正直に全回数のシフトを実行
リアルモードがどういう仕様なのかは知らん
>>597
UML で分析/設計 -> 実装という流れならともかく、既存のシステムを分析するのに UML で
図を起こすのは時間の無駄だ。やめとけ。UML は分析/設計用の言語であって、既存のコー
ドを解析するために作られたワケじゃないからね。

(GLOBAL + htags でクロスリファレンス作るのは役立つと思うが)

> ターゲットであるPDP-11に関する詳しい飼料が欲しい。
UNIX V6 のソースを読むだけなら Lions' commentary on UNIX の巻末にあるリファレンス程度
で間に合わないか?
600高校生:01/12/18 22:36
>UML で分析/設計 -> 実装という流れならともかく、既存のシステムを分析するのに UML で
>図を起こすのは時間の無駄だ。やめとけ。UML は分析/設計用の言語であって、既存のコー
>ドを解析するために作られたワケじゃないからね。
フリーハンドで簡単なUMLを描いて見たけど時間の無駄とまではいえんと思う。
(誰かに提出するドキュメントでないから)

>UNIX V6 のソースを読むだけなら Lions' commentary on UNIX の巻末にあるリファレンス程度
>で間に合わないか?
アセンブラでかかれた部分(のtrapやcoreの初期化)が良くわからん。工業高校生なら
アセンブラバリバリ読むのかもしれんが。。。俺は素人(TT
601デフォルトの名無しさん:01/12/18 22:52
――――――――――――――――――
おにぎり食べたいワショーイ
___  ___r――――――――――――――
    ∨‖  |ママン、ここは素人ばっかりだね
//  ‖  |____ ____________
/    ‖ /       ∨ヾ:::::ソ;/∧_∧    _______
      ‖    //    |三| " ,  、 ミ  /
 /   ‖          ノ::i::i:;;ヽゝ∀ く  <  そうね  /■\ ∧∧ ∩∩ ∧_∧i::;/ ノ ̄ヾ i   \
二( ´∀`)(=゚ー゚).('Д`).( ´∀`) ∪⌒ ⊂_ノ     ̄ ̄ ̄ ̄ ̄ ̄
  (    )(   ).( : )(    ) (__ノノミ
 |\ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\.|__./|
 \ \                 \. | |
>>600
unix/low.s のあたりか? 確かに PDP11 知らんと微妙に辛いな。

トラップ/割り込みが発生すると、そのトラップ/割り込みに対応するアドレスから分岐先とステータス
ワードを読んできて、そこに分岐するようになってる。たとえばトラップベクタの先頭は、

trap; br7 + 0.

となってると思うが、これはトラップ 0 (バスエラー)が発生したらステータスワードを br7 + 0 に設定
して trap に分岐、という意味だ。ステータスワードの詳細などは Lions' commentary on UNIX の第二
部第二章に書いてあるから、本を買ってきて読むのが良いと思うぞ。
>601
AAの素人発見!
604高校生:01/12/18 23:34
>>602
サンクス!そうするよ。
AXは16ビット
シフト回数は切り捨てられて20-16=4ビットシフトになるCPUと
 そのまま20回シフトしてゼロになってしまうのと

両方あったような記憶がある
 その頃のCPU判別方法の一つじゃなかったかな

386はどっちだったか覚えてない
606591:01/12/19 13:02
intelのサイトに置いてあるPentium4の命令セットリファレンスによると、
「286以降のすべてのIA-32プロセッサは、シフトカウントを5ビットにマスク
する」とあるよ。

「このマスク設定は(仮想8086モードを含めた)すべての動作モードで行われ」
だそうだから、リアルモードでも5ビットマスクということだね。
だから、やっぱり結果は0でいいんじゃない?
607デフォルトの名無しさん:01/12/19 14:18
>>605のいうように、386か486にはシフトビット数が
大きすぎる(64を超えると??)と
結果がヘンになるバグがあったような気がする。
608605:01/12/19 20:14
そうか16ビットだから4ビットと思ったら
 32ビットのCPUだから5ビットでマスクか スマン
609デフォルトの名無しさん:01/12/19 23:04
PUSH  SP で、PUSHされるSPの値は??
>>609
それ使うCPUの判別方法があったな。
80186以降だとデクリメントする前の値になるんだっけ?
611リストで質問:01/12/20 00:36

mov dword ptr[004358A4], ecx
mov ecx,dword ptr[004358A4]

こんなリスト。2行目って何の意味? nop 代わり?
Cとかでコンパイルして、最適化が殆どかからないときに、
そういうコードが出てくるけど、そういう話やなくて?
613リストで質問:01/12/20 07:12
いや Delpi.
コンパイラがこんな無意味なことをするとは信じがたいが事実。
alignするためじゃないかなぁ
>613
1) 2行目にループする事を予定してた

2) 利用するメモリを実際に確保させ、以後の処理を高速にさせる為

3) 引数をレジスタ渡しにしたけど複雑な処理をさせたから

4) 単に手抜き
Delphiの最適化ってあまり強くないし。
あくまでも 対Visual Basic でしかない感じ。
Borland C++の最適化もWATCOM C/C++、Visual C++に比べれば劣っていた感じ。
つか、私ではVisual C++6.0の最適化には勝てない。
そぉ? VC6の最適化もあんまり大したことないような。
レジスタの塗分けとかCPU依存のところはまあまあだけど、
CSEなんかの抽象化されたところはあまいような。
GCCの方が上かも。
618デフォルトの名無しさん:01/12/20 10:41
SPを当ててないVC5みたいに、強力な最適化によって
不正なコードにコンパイルされてもなー
gccの最適化は木を見て森を見ず的な感じがする。
一部分だけ抜き出すとすごいんだけど、関数全体とかモジュール全体になるとイマイチ。
gccはVCに比べてはっきり遅いと思う。
中身まで詳しくは見ていないが、自分の実験では5%以上遅かった。
621デフォルトの名無しさん:01/12/20 11:54
>>616
>Delphiの最適化ってあまり強くないし。

VCとは、ほとんど変わらないだろ。
最強はVCというのが定説
>>622
どこの定説だよ。
Delは無料で手に入るんだから検証してから言えよ。
どーやってVC++とDelphiでコンパイル時の最適化を検証するの?
 >>611  の元のコードが知りたいな

 Delphiだとあんまりグローバル変数取らないでしょ
>>624 両方持ってたら 少なくても VC 持ってたら 同じ事する関数をコンパイルしてみたら?

πとか素数計算が適当だと思うよ。

Cとの比較になってしまうけど
http://www.infoeddy.ne.jp/~tensyo/prog/piHex.htm
Del厨ハケーン!
628リストで質問:01/12/21 00:30

mov eax,1
00433614 cmp eax,1
jne 000433625
mov ecx,dword ptr[ebp-08]
movzx ecx,byte ptr[ecx+eax-01]
mov dword ptr [esi],ecx
jmp 0043362F
00433625 mov ecx,dword ptr[ebp-08]
movzx ecx,byte ptr[ecx+eax-02]
mov dword ptr[esi],ecx
0043362F mov ecx,dword ptr[ebp-08]
movzx ecx,byte ptr[ecx+eax-01]
mov dword ptr[004358A4], ecx <-
mov ecx,dword ptr[004358A4] <-
add dword ptr[ebx],ecx
mov ecx,dword ptr[ebx]
imul ecx,dword ptr[ebx],ecx
inc eax
dec edx
jne 00433614

begin
chk:=Us+Ds+Tm;
b:=0;
for i:=1 to Length(chk) do begin
if i=1 then
c:=Ord(chk[i])
else
c:=Ord(chk[i-1]);
s:=Ord(chk[i]);
inc(b,s);
b:=b*c
end;
629リストで質問:01/12/21 00:53
あれ?ブランクが入らんの?これではどうか
   
    mov eax,1
00433614 cmp eax,1
    jne 000433625
    mov ecx,dword ptr[ebp-08]
    movzx ecx,byte ptr[ecx+eax-01]
    mov dword ptr [esi],ecx
    jmp 0043362F
00433625 mov ecx,dword ptr[ebp-08]
    movzx ecx,byte ptr[ecx+eax-02]
    mov dword ptr[esi],ecx
0043362F mov ecx,dword ptr[ebp-08]
    movzx ecx,byte ptr[ecx+eax-01]
    mov dword ptr[004358A4], ecx    <-
    mov ecx,dword ptr[004358A4]     <-
    add dword ptr[ebx],ecx
    mov ecx,dword ptr[ebx]
    imul ecx,dword ptr[ebx],ecx
    inc eax
    dec edx
    jne 00433614
630リストで質問:01/12/21 00:55
begin
 chk:=Us+Ds+Tm;
 b:=0;
 for i:=1 to Length(chk) do begin
  if i=1 then
   c:=Ord(chk[i])
  else
   c:=Ord(chk[i-1]);
  s:=Ord(chk[i]);
  inc(b,s);
  b:=b*c
 end;
631最適化なら、:01/12/21 01:25
LSI-C86最強。昔は。
>630 のコードで cが参照で
  sがグローバル?

じゃあしょうがないんじゃないの?
変数sに他のスレッドが書き込む可能性もあるんだし
633age:01/12/23 14:34
バイナリエディタどういうもの使ってます?
おすすめがあったら教えて頂けませんか?
プラットフォームはWinです。
>>631
たしかにあの出力コードは凄かった。レジスタをきちんと使いまくって
くれたし。ただし、Smallモデルl限定だけど(^^;
他のモデルではそうでもなかったような。

>>633
オレはttp://www6.airnet.ne.jp/dds2/にあるStirling使ってる
635633:01/12/23 15:49
>>634
早速ダウンロードさせてもらいました。
636デフォルトの名無しさん:01/12/23 18:37
まえから不思議だったんだけど
MMXと浮動少数命令は同時に使えないのに、。

もしMMX使用中にスレッド切り替わって
切り替わった先のスレッドで浮動小数点命令つかったら死なない?

それともタスク切り替え時にMMXレジスタすべて保存してるとか?
>>636

ノンプリエンプティブなOSなら、
タスク切り替えのタイミングわかるから自前で保存/復帰できますが、
プリエンプティブなOSではOS側でやってくれないと動作不可能ですが。

具体的には、
FLDENV/FSTENV/FNSTENVあたり?
中身についてはこれで。
FRSTOR/FSAVE/FNSAVE
タスク切り替わる時にレジスタを保存しないと困るのは、
なにもMMXに限ったことではないと思うぞ。
639デフォルトの名無しさん:01/12/24 00:30
アセンブラで高速化する場面は、組み込み系やゲーム系が多いと思うのですが、
業務系などではどうなのでしょうか?高速化よりもソースの読み易さなのでしょうか?
640デフォルトの名無しさん:01/12/24 00:57
アセンブラで高速化して
そこがバグになったら最悪でしょ。
たいてい人がやると、
パイプライン処理でハザード起こしてしまったりする。
それにPCでは普通はやらない。
というか、普通は速くならない。
速くなるのは、MP3のエンコードみたいに
永遠と同じ処理を繰り返すような物に限った話。
ただ、これは機械語で書くから速くなるのではなく、
CPUに用意された、固有の命令を使うからはやくなる。
組み込み系でアセンブラ使うのは、
コンパイラ作る方が手間がかかるから。
ゲーム系でアセンブラ使うなんて話は最近は聞かない。
× 永遠と
○ 延々と

ぶっ壊れたレコードじゃないんだから。
PS2はアセンブラないとどうしようもなかったらしいじゃん。
まぁ、あれはCPUが特殊スギって話だけど。
643デフォルトの名無しさん:01/12/24 01:25
>ゲーム系でアセンブラ使うなんて話は最近は聞かない。
オマエMFCプログラマーダロ
>>643
ゲームに必要なのはプログラマーじゃなく
エロ画家と思われ。
645643:01/12/24 01:42
>644
> エロ画家と思われ。
ウケタ
646デフォルトの名無しさん:01/12/24 01:46
エロプログラマーですが何か?
エロいコードを頼む
648 :01/12/24 02:09
アセンブラから Win32 API 使いたいのですが、
ヘッダなしだと結構不便なので、INC ファイルを探しています。
どなたか、DL できるページとか知りませんか?
649デフォルトの名無しさん:01/12/24 02:19
>>648
つか、ヘッダとインポートライブラリだったらPlatform SDKでダウンロード
できるじゃん。
650648:01/12/24 02:32
SDK はインストールしてあるけど、*.lib
はあっても、*.inc はないけど・・ >> 649
651649:01/12/24 02:38
ああ、asmから直接使える形のが欲しいって事か。勘違いしてたよ。
でもそれって*.hから変換するツール作ればいいんでないの?
652649:01/12/24 02:49
h2inc ってのがあるらしいけど、*.h 突っ込んでも跳ね返されるんだよね。
他に方法ないかな、どっかでヘッダ公開してるとか? >> 651
>>636
浮動少数点のレジスタを保存する命令でMMXレジスタが保存されるから
MMX以前のOSでも大丈夫、というのがミソだったような
>>648 非公式でよけりゃ
ttp://spiff.tripnet.se/~iczelion/
>>653
そのとおり。逆に SSE は OS 側で対処が必要になる。

っつか >>636 が何を疑問に思ってるのかが謎だ。
656デフォルトの名無しさん:01/12/24 13:17
>>653
ってことはソフトウェアの方で固定少数しか使わないときは
MMXをずっとONにしててもいい、ってこと?
>>656
なんか話がかみ合ってない気がするな。

「MMX を ON にする」というのは、どういう意味だ? MMX を使う場合でも FPU を使う場合でも、
プリエンプティブなマルチタスク OS では

 タスク切り替え時に OS がレジスタの退避/復元を行う
 (実際には FPU 使わないプロセスも多いことに配慮して、遅延処理してるが)

ので、ユーザが気にする必要はない。ユーザが唯一気にしないとまずいのは、同一タスク内で
FPU/MMX を混在させて使う場合だけ。
658デフォルトの名無しさん:01/12/24 16:44
Cの勉強がてらアセンブラ作ろうと思うんだけど良い資料は
ないかな?
とりあえずZ80でいくつもりです。
>640
今日日のエロゲ、MMXくらい普通に使用してるけど…。
660 :01/12/25 03:51
MMX の場合、 EMMS によって FPU の タグワードがクリアーされるんだったけ?
EMMS 呼ぶ前に コンテキストスイッチが起こって、別スレッドが x87 命令
使った場合の動作が疑問ということかな? >> 636

レジスタの待避/復元は MMX レジスタは 実質 FPU レジスタな訳だから、いい
として、問題はタグワードだな。
タグワードってFPUレジスタの一部に含まれてなかったっけ?
レジスタにつき2bit分あるフィールドの組み合わせが一つ増えた(定義された)だけだったような。>MMX
それゆえ今までどおりの退避/復元で十分だったかと。
fnsave/frstorでタグワードも含めてすべて保存・復帰されるから
ユーザーアプリでは何も気にする必要はないよ。
663デフォルトの名無しさん:01/12/25 13:34
基本的に浮動小数点使わなければ MMXオフにする必要なし。
>>663

DLL でそれやるやつ嫌い。特に Microsoft とか Microsoft とか
Microsoft とか。
665660:01/12/25 17:57
なるほど、同一スレッド間なら問題ないというわけか
リファレンス見たら、確かにそうなってた。多謝 >> 662
666660:01/12/27 22:24
今日調べたら、MMX テクノロジオフィシャルガイドに詳細が載ってました。
P106 に載ってます。持ってる方は見てください。
>>666
ふつーは Intel Architecture Software Developer's Manual Vol. III を参照すると思われ。
だよねー
669 :01/12/31 08:37
>>666
この本いいよね。
P6系で各x86命令のμOP構成やそのμOPのレイテンシが結構詳しく書いてある。
IntelのWebのマニュアルには詳しく書いてないんだよね。

まぁ、こんなにかよっためいれいいっぽんにまとめちまえよ
というのがくさるほどあっていがいたい俺はとてもだるひ
>>605,607

遅レスですまんのだが、本当にそんな事実があったの?

手元にとりあえずあった、
ttp://shopping.yahoo.co.jp/shop?d=jb&id=18908945
この本のSHLの説明を見てみたところ、
「初期の486ではSHLの命令エンコーディングを認識しない」
としか書いてないんだが…

尤もこの本、結構誤植や誤謬が多くてちょっと不安なんだけど…
672デフォルトの名無しさん:02/01/11 21:37
すみません。
アセンブラを学びたいと思ってるのですが、
勉強する順番ってCASL→Z80でいいんでしょうか?
アセンブラを知って実用できるようになるにはどのような手順でいけば
効率的なのでしょうか?アセンブラに詳しい方、是非教えてください。
673デフォルトの名無しさん:02/01/11 22:19
>>672

なんのためにアセンプラを勉強したいかによるんじゃないかな?
場合によってはアセンブラそのものよりターゲットとなるハードウ
ェアのIO周りの勉強の方が先かも知れないよ。
674デフォルトの名無しさん:02/01/11 22:51
>>673
レス、有難うございます。
アセンブラをやってみようと思い立ったのは、
「Cを知るためにはアセンブラ(機械語)の知識があることが望ましい」と、
あるサイトに書かれていたからです。
そこで、Amazonなどでアセンブラ関連の書籍を検索しましたが、
在庫も少なく、発行年月も古いので、どれを読めばいいのかわかりません。
アセンブラを学ぶためにZ80の書籍を参考にするのは時代的に古いのでしょうか?
長くなってすみません。
アドバイスいただければうれしいです。宜しくお願いします。
675デフォルトの名無しさん:02/01/11 23:39
>>674
アセンブラを知っていたらCのポインタを簡単に理解できるという
程度のものじゃないの?
676デフォルトの名無しさん:02/01/12 01:15
仮想アセンブラソフトって無いですか?
実際のレジスタやメモリではなく、
ソフト上のレジスタやメモリを書き換えるような。
暴走してもソフト的に停止できるし。
昔、Z80でよく暴走させてたので。
677デフォルトの名無しさん:02/01/12 01:22
>>676 PC9800, X68k, etc.のエミュレータを使うとか。
678デフォルトの名無しさん:02/01/12 01:42
>677
あ、その手がありましたね。
学習目的だけならCASLでもいいような気はするにゃ。
とりあえず参考書には困らにゃい(笑
>>676
MIPS エミュレータの SPIM とか。ステップ実行させてレジスタの変化とか追えるから、学習用には
便利だよ。
681_:02/01/12 13:19
>>674
私はCコンパイラが出すアセンブラコードを見て勉強しました。
Cを書く時実行速度を考えられるようになったし。
ただあまり速度に拘るとソースの読みやすさは犠牲になるかも。
>>672
Cで何をしたいのかによるけど…
たぶん、C言語で Z80を動かそうとしているのではなさそうなので…

CASLで十分。ていうか、CASLがオススメ。
なぜなら、初心者用の教材がたくさんあるから。
「月刊情報処理試験」とかの連載記事も役立つよ。

とりあえず、CASL2 のシミュレータで特訓してみてごらん。
ttp://www.jitec.jipdec.or.jp/casl2/casl2dl_001.html
683デフォルトの名無しさん:02/01/20 01:25
Thunderbird AthlonでMMX2命令って使えるの?
具体的にはpsadbwが使えるか知りたいんだけど。
684202.221.45.130:02/01/20 01:25
202.221.45.130

俺のIPアドレスだ、おめーらの技量じゃハックデきね〜だろうけどw
685683:02/01/20 02:11
自己解決しました。使えるようですね。
686デフォルトの名無しさん:02/01/20 02:47
intel 系 チップでも、 Linux の gas と DOS の MASM では
割り込み番号は全く違うのですか?
BIOS レベルでは何等変わらないと思ってるのですが・・

後、MASM というか MS-Cのインライン asm では

asm push ds
asm mov ax, 0x80
asm mov ds, ax
asm mov ah, ds:0x00
asm pop ds

こういう書き方ができたのですが、gcc 用に

__asm__("push %eax
push %ds
xor %eax, %eax
mov $0x40, %ax
mov %ax, %ds
xor %ah, %ah
mov 0x96(%ds), %ah
pop %ds
movb $0x10, %ah
xor %al, %al
int $0x16
pop %eax
ret" );
}

こういうのを書くと

Error: `0x96(%ds)' is not a valid 32 bit base/index expression

こうなってしまいます。どうすれば %ds番地 + 0x96番地の中身を
%ah レジスタに mov できるのでしょうか。
DSをデータセグメントとして使えるのは16bitモードのみ
688デフォルトの名無しさん:02/01/20 03:01
302N2r3Z343L2o1c2s3X352l2w3C2u3o2k2A2i2N2o2W2m3c2c3j2a292g3L2e2t2U3Z2S2z2Y2n2W2f2M2r2K3F2Q2a2R1D2E2d2W442X2g2G3C262l2I3W2P1A280l3y3h1B1F3l3R442y3e3x433q3g2F3w2T3i0L3k2s3q2t3o3S3e2p3c2a3h0c3g3n3M2V3G0E3a3u3Y3r3O3c3M3z3R0L

これ暗号らしいんですけど解ける人いますか〜?
>>686
プロテクトモードの時、メモリを物理アドレスで参照するのは、ユーザープロセスでは無理。
690688:02/01/20 03:35
すみません。解けました。
691デフォルトの名無しさん:02/01/20 04:53
686の者です。

ユーザープロセスでデバイス直接いじくるのは、gas では無理で、
ioctl() 使うしかないのでしょうか・・・楽は楽なんですけど、、
そうすると、カーネルは低レベルでkeyboard 割り込みとか
どんな風に実装してるんでしょうね。興味深いです。

MMU には、カーネルが勝手に page table を見て仮想アドレスと
実アドレスを変換した値を渡してやるんでしょうね。

確かにカーネルが管理してる領域をユーザーが自由に変更する
事はできません。やっぱり ioctl() しか無さそうですね。
カーネルは普通、、MMUの変換を通らないモードを使ってます。
ttp://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-4.html#chapter_mm_sect1-4
でも、読んでくださいまし。
693デフォルトの名無しさん:02/01/20 13:16
ほあえぇぇ〜、カーネル御大自らは「物理アドレス」モード(笑)
つまり、 segment:offset の絶対アドレス指定、
ユーザープロセスのみ「仮想アドレス」モード・・・こら絶対手の届かん
とこに御大が居られる訳ですな。

raw device へのユーザーモードからのアクセスは、もう ioctl() 以外に
考えられません。
>>692
これがホントに普通なのか知りたい。
たとえばどのCPUで使えるの?
そのリンク先見るとAlphaは違うって書いてあるね。
x86も違うよね?
695age:02/01/27 06:47
age
>>694
Alphaも「物理的にマッピングされたアドレス空間」って書いてあるし、>>692の解説はx86のものです。
MMUを持ってないプロセッサへのUNIXカーネルの移植は、難しそうです。
でないと、プロセスが他のプロセスのメモリ壊すのとか、自分自身の飛び込み自殺とか防げないですからね。
(68881(でしたっけ?)を積んでない68Kのシステムで動くUNIXとか、Z80で動くのとか、あるにはあったようですが…)
697694:02/01/27 15:00
>>696
そうじゃなくて「カーネルは普通MMUを通らないモードを使ってます」の部分です。
だけどAlphaはMMUを通らないモードはないって書いてあるんでしょ。
x86もないと思うのよ。
で、結局カーネルも仮想アドレスでアクセスしてるけど、仮想アドレスを管理して
るのはカーネルだから、どの物理アドレスにマッピングされてるかを知ることが
できるって感じなのではないかなぁと思ったのです。
>>697
> x86もないと思うのよ。
あるよ。妄想と思いつきだけでいい加減なことを書かないように。
699694:02/01/27 19:42
>>698
まじで?
インテルのマニュアルのどこを見ればいいか教えてくれ。
カーネルの話だからリアルモードとかページングしないみたいなネタはなしで。

>>699
>>692のページは、「MMUの変換を通らない」、であって、「MMUを通らない」ではない事に注意。
タスク切り替えが起こってTSSからCR3をロードするとき、PGビットが0なら物理アドレスモードってことでないの?
702デフォルトの名無しさん:02/01/27 23:26
age
汗を拭ってタイプしたコード 古本屋で見つけた安くていい本

幼い日の手のぬくもりが帰ってくる
704694:02/01/27 23:57
>>700
たとえば仮想アドレス100を物理アドレスの100にマッピングしてたら
「MMUの変換は通ってない」という意味ですか?

>>701
それはページングを使わないって意味ですよね?
705デフォルトの名無しさん:02/01/28 02:54
>>704
>>701はカーネルプロセスだけページングをしない、ってんだから、それでいいんじゃないの?
あと、ページングしないんだから、変換通ってない、で、おかしくは無いと思うが。

それとも、セグメントディスクリプタ:オフセット→リニアアドレスの変換が、MMLの変換だ、
だから>>692
>MMUの変換を通らないモード
や、>>692のページの、
>プロセッサはこのモードのときはアドレス変換をしようとしない。
は、間違いだ、といいたい?
じゃなかったら、インテルのマニュアルには「物理アドレスモード」っていう言葉が出てこないぞ、
っていってるのか?
だったらあんたがそう思ってればいいだけのことだ。
NASMの書籍ありませんか?
707 :02/01/28 04:50
ホムペにドキュメントあるでしょ。あれで十分。
英語もそんなに難しくない。
日本語なら www.nk.rim.or.jp/~jun/
PGビットはCR0だからTSSには含まれていないが。
じゃ、CR0のWPを書きかえる
710694:02/01/28 15:28
>>705
それならMMUを通ってないっていえると思うんですが、
どうやったらできるのか分からないって意味です。

PGビットをクリアするのは意味ないですよね。ページングをオフにしたら変換
はしませんけど、>>692の説明にあったようにページングを仮定してるOSのカー
ネルで使えませんから。

それで、例えば、仮想アドレス100を物理アドレス100の変換するようにページ
テーブルを作って仮想アドレス100にアクセスすることで物理アドレス100にア
クセスできますよね。これを変換を通ってないとは呼ばないと思うんです。
(べつに仮想アドレスを物理アドレスと同じにする必要はありませんが)

で、これ以外に物理アドレスにアクセスする方法があるんだったら
知りたいなぁと思ってるのですけど。
WPを書き換えてページングをディセーブルにするのは、いつでも出来るんだから、カーネルプロセス
がそれをやればええんでないの?
ちなみにPGビットは一度セットしたらリセットする方法は用意されてないはず。
WPは書き込み保護でしょ? ページングのディセーブルと何の関係が?
IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズマニュアル システム・プログラミング・ガイド
4-2
・制御レジスタCR0 のWP フラグをクリアする。
・ページ・ディレクトリ・エントリとページ・テーブル・エントリごとに読み取り/書き込み(R/W)フラグとユーザ/スーパバイザ(U/S)フラグをセットする。
この処置によって、各ページは書き込み可能なユーザ・ページとなり、実質的にページ・レベル保護がディスエーブルにされたことになる。
よって、ページレベル保護と、ページングは別物
715デフォルトの名無しさん:02/01/29 15:45
まだやってたのか、そんなに気になるなら、ソースみればええやん。
716694:02/01/29 16:12
ソース見ても解決しないってば。
Linuxは仮想アドレス使ってアクセスしてるの。
だけど、普通はMMUを通らないモードを使うってあったから、
その普通ってどの石かって聞いたらIntelって言われたんだけど、
肝心のそのやりかたがわからないと。
>>694
気に入らなかったら [email protected] にメールだして文句言えば?
つか、あんた、だれを相手にしてるんだ?(w
結局 >>692 のリンク先の説明はうそっぱちなんだろ?
少なくともx86には当てはまらないと。
>Linuxは仮想アドレス使ってアクセスしてるの。
プ
x86のこと言うなら、論理アドレスとリニアアドレスと物理アドレスで話しようよ。
720694:02/01/29 20:23
>>717
>>692 とか >>698 とか
というか、特に >>698 です。

とりあえず、リンク先はAlphaのことが書いてあるのでx86で物理アドレスで
アクセスできるとかは書いてないと思います。

>>719
Linuxは特にx86だけメモリ管理の扱いが違うってことはないと思います。


721719:02/01/30 03:52
>>720
だからさ、x86に「仮想アドレス」っていう言い方は無いのよ。
>ソース見ても解決しないってば。
つーことは、ソースは見たんだよね、当然。
見ても解決しなかった、と。
だったらx86のカーネルはどういう実装だった?
で、実装がわかったんなら、「こうなってました」って言えば済むことじゃん。
でも、解かってれば、セグメンテーションとページングを別けて話出来るはずだよね??
x86には「物理アドレスモード」と呼べるモードはたしかにある、フラットメモリモデルがそうだ。
でもLinuxはそれを採用してない。これは>>692のリンクのほかのページ見れば、ページングを使ってることがわかるから。

ま、なんだ、きみはその、こう言いたいわけか?
「でびっどのうそつき!」
>>721
仮想アドレスなんて一般的な用語だろ。
Intelが使用している用語のみを使えという理由が意味不明だ。

あとそのx86のフラットメモリモデルとやらは、結局UNIX系OSのカーネルでは
使い物にならないしろものなんだろ?
723722:02/01/30 07:54
ちょっとまて、フラットメモリモデルってセグメントの機能を利用しないという事で、
ページングとは全く別の話じゃないか。
ページレベル保護機能とページング機能の区別がつかない >>711 と同一人物? 電波?
724719:02/01/30 08:34
>>722
Intelが定義している用語にこだわってるんじゃなくて、x86のアーキテクチャの話にしたいだけ。
694は「x86の場合はどうなのか」にこだわってるから。

それから、フラットメモリモデルは、「セグメンテーションとページングをディセーブルにした状態」を指すものと思うが?
(ディセーブルというか、イネーブルにしない、というか)
725719:02/01/30 08:44
>>723
読みなおしたら、ページングはどのメモリモデルとも組み合わせることが出来るって書いてあったよ。
ごめん。
726719:02/01/30 10:32
「物理アドレスモード」と呼べるのは、マルチセグメントも
ページングも使わない場合、だから、>>692のページにある
>プロセッサはこのモードのときはアドレス変換をしようとしない
っていう意味の「物理アドレスモード」は、x86用のカーネルは使っていない。
これはこれでいい。

でも、>>692のページを読むと、仮想アドレスと物理アドレスとをページングだけで解説してる、
つまり、仮想アドレス→物理アドレスの変換と、ページ保護だけのプロセッサの解説だろうから、
そもそもセグメンテーションのあるx86には当てはまらない。

だから、694には、気になるならソース見ろ、と。
で、x86にとっては抽象的な「仮想アドレス」という言いかただと、話がおわらないぞ、と。
727694:02/01/30 11:48

結局のところ、>>692 のリンク先にある文書は説明を簡単にするためにカーネ
ルが物理アドレスモードで動いてると書いてあると言う解釈でいいのかな?

単純に x86 でページングをオフにしてる場合のようなものはカーネルの実装
には使えないので、このスレで x86 でできるといってたのはそのあたりの勘
違いと。

で、僕は x86 には、そういうページングを使いつつ物理アドレスでメモリに
アクセスすると言う便利な方法はないと思っていたのだけど、それができるプ
ロセッサはあるのかと言うのが最初の質問でした。

>>726
というわけで、たとえば Linux ではどう実装されてるかというようなことは
気になってませんでした。つまり、Linux ではそういうのは使われてないから
です。

あと、Linux ではフラットモデルを使ってると思いますが、そうすると仮想ア
ドレスはリニアアドレスと等しいのでリンク先のページの解説が当てはまらな
いというのはちょっと言い過ぎですね。
728デフォルトの名無しさん:02/02/05 00:48
age
729デフォルトの名無しさん:02/02/05 18:03
w32dasmで逆アセンブルしたときのコードで、
mov dword ptr [ebp-08], ebp
というのがあったのですが、これはどういう
意味なんでしょうか。どなたか教えてください。
>>729
Cで書くなら、
*(long *)(ebp - 8) = ebp;
という感じかな?

*((long *)ebp - 8) = ebp;
ではない点に注意。
731デフォルトの名無しさん:02/02/05 18:41
アセンブラができる人はかっこいいなぁと思っているのですが、
x86って何?って人がいきなりアセンブラに手を出すのは無謀ですか?
(intel系のCPUのことらしい、というくらいしか知らない)
そういう知識ってどこで手に入れるのかさっぱり分からなくて…
732デフォルトの名無しさん:02/02/05 18:52
>>729
それは、
void zzz(int x, int y, int z)
{
  int a, b, c;
・・・
}

だったら、変数bのことじゃな。(32ビットの場合)

ちなみに、[ebp+8]だったら、変数z
ebp-4は変数cじゃよ。

>>729
ebpはデフォルトのセグメントレジスタがssだから、VCだと
普通スタックフレーム(ローカル変数とか)のアクセスに使うね。
実際に逆アセンブルしてそういうコードみたこと無いから、はっきり言えないけど、
ebpをスタックフレームに保存してるって事は、関数から戻るとき用に保存してる
んじゃないかな?
前後のコードもうすこし教えて欲しいナリ。
>>731
かっこいい、くらいでてぇ出さないほうがいいじょ。
とりあえず>>682のでもやってみたら?
735デフォルトの名無しさん:02/02/05 19:08
>>731
古本屋逝って8086本を探すんじゃな。
インテル系の 16ビットの最初のマイコンは、8086だから。

8086
80286
80386
80486
Pentium

って進化してきた。
これは、PCメーカとかが、型番に386とか付けるのが面白くなかったらしい。

その昔、RedZepplinというお爺さんに人気のあったバンドのアルバムは、
レッドツェッペリンI→U→V→Wときて、
五作目から「永久の歌(邦題)」(だったとおもう)などという、題名にしてから、
落ち目になったので、インテルもそうなると逝ってたマスコミが居たのぉ。

アセンブラ知っている人はかっこいいんじゃなくて爺さんじゃよ。
80186もいれて欲しいなぁ
あと、80486はi486が正しいんでなかったっけ?
Windows使っているなら、今すぐ、DOSプロンプトへ降りて、
C:\>debug
-a 100
2469:0100 mov ah,9
2469:0102 mov dx,200
2469:0105 int 21
2469:0107 mov ax,3000
2469:010A int 21
2469:010C
-e 200
2469:0200 41.48 41.65 41.6c 41.6c 24.6f 8C.20 C2.41 82.73
2469:0208 CC.73 83.65 74.6d 83.62 40.6c 83.65 43.72 83.21
2469:0210 8B.0d 82.0a F0.24
-g =100
Hello Assembler!

AX=0000 BX=FF00 CX=0000 DX=0200 SP=FFF0 BP=0000 SI=0000 DI=0000
DS=2469 ES=2469 SS=2469 CS=2469 IP=0132 OV UP EI NG NZ NA PE CY
2469:0132 2E CS:
2469:0133 0D0A35 OR AX,350A
-exit

ってやれば、機械語版、Hello Assember! の出来上がり。
※ -e の後は、2桁入力後、スペースキーで、最後(24)を入力後、Enter
スマン
>>737
mov ax,3000
は、
mov ax,3100
だった。プロセスの終了のつもりだったが、30だと、DOSバージョン取得だった。
どうも、exit 入れないとおわらないとおもった。
739729:02/02/05 19:50
ごめんなさい、typoしてました前後文付き。

call 0100735D
mov dword ptr [ebp-08], ebx ; <- typo
call 010073B2
mov dword ptr [ebp-08], eax
push dword ptr [eax]
call 01007349

といってもcallの中身書かないと無意味そうですが(;´д`)

で、質問した個所はこんな感じに解釈してみました。違ったら訂正お願いします。
・mov dword ptr[ebp-08], ebx
ebxを、dword型とて[ebp-08]のアドレスに書き込む。
>>737
いまの Windows には debug はつかないよん。
DOS 5 位でつかなくなったんじゃ?
>>740
WindowsXP Proにはdebug.exe入ってるけど?
>>740
WinMeにもdebug.exe入ってるみたいですけど?
>>739
ebpだと意味がちがっちゃうけど、ebxなら、まんま>>732が正解。
>>741
>>740 は Windows9x しか使ったこと無いんだよ。NT 系は、みんな debug 入っ
てる。(edlin とかも入ってるけど、使ってる人いるのか ?)
Windows98SE、debug入ってたよ。
>>739
>ebxを、dword型とて[ebp-08]のアドレスに書き込む。
あってますよ。dwordは、32ビット ebxも32ビットですね。
>>744
(´-`).。oO(EDLIN なつかすぃ)
どこかWindowsプログラムをassembleで書く、って感じの記事を
乗せてるページもしくは書籍ないかな?
MASM(ver6.15)で
movdqu xmm0, DQWORD PTR [m64+ebx+8]
としたいんですがエラーになってしまいます。(DQWORD PTRが不正)
128bitのデータ型を指定する事はできないんでしょうか?
>>749
128bitデータ型は「XMMWORD PTR」。

便乗で、質問。
movsd xmm0,QWORD PTR [ebx+8]
がMASMで通らないんだけどどうしたらいい?
インラインアセンブラなら問題なく通るんだけど。
>>750

MMWORD PTR で通らないか?
752デフォルトの名無しさん:02/02/08 05:38
クルーソーの仕様書って一般には出てないの?
うぬ、XMMWORDでもundefined symbol…
ヴァージョンが古いのかそれとも他になんか必要なんですか?
MASMは6.15.8803です
754750:02/02/08 10:47
>>753
すまん、上の方で、
.XMM
XMMWORD TEXTEQU <OWORD>
って定義されてた。
128bitデータ型は「OWORD PTR」というのがMASMの正式な名前らしい。

>>751
それでも通らないのです。
movsd xmm0,xmm1
も通らないです。
VC++のインラインアセンブラなら通るんだけど。
どうもありがとうございます>750さん
OWORDですか・・・わかるわけない(;´Д`)
OCT(8)ってことか?
なぜ素直にDQWORDにしなかったんだろう…
756750:02/02/08 11:40
それからVC++のインラインアセンブラでは OWORD PTR は使えず、
やっぱり XMMWORD PTR と書く必要があるみたい。
結局128bitデータは
MASM : OWORD
VC++ : XMMWORD
ということらしい。なんかややこしい。
なんでDQが「素直」なんだろう?
だったら4バイトはDDWORDが素直?
758757:02/02/08 15:51
あ、8バイトだった、つか、64ビットだった。
WORD→ x2→DWORD
↓        ↓
x4        x4
↓        ↓
QWORD→x2→DQWORD

deiijan
760デフォルトの名無しさん:02/02/08 23:24
age
DQWORDかQDWORDか、悩み所だな…
762反68:02/02/10 07:07
そう言うワケですので、元68プログラマ、及び、予備軍の方は、

こちらhttp://pc.2ch.net/test/read.cgi/pc/1013286504が用意されて
います。
763デフォルトの名無しさん:02/02/11 13:23
>740
debug.exeはwin98にもはいってますよ
アセンブラの勉強の初期につかってました
764デフォルトの名無しさん:02/02/12 14:59
Z80で小数点付きのかけ算、わり算を行いたいのですが
足し算、引き算、シフトでどの様に行えばいいのでしょうか?
小数点付きじゃなくて、整数のかけ算割算は分かりますか? >>764
分からなかったら話はまずそれからですね。
あと、小数点付きというのは浮動小数点? 固定小数点?
766デフォルトの名無しさん:02/02/12 19:19
JAPが作った、Vectorに登録されてそうな気軽なアセンブラない?
767764:02/02/12 20:23
>>765
100*10を足し算命令で行う= 100を10回足していく
100/10を引き算命令で行う= 100-10を引けるまで行う
で、いいのでしょうか?

>あと、小数点付きというのは浮動小数点? 固定小数点?
これがいまいちわかりませんでした

今考えているのはわり算の場合例えば3000/2000の計算は

3000-2000 = 1000 1回引けた
1000を10倍して10000-2000を引けるまで行うと5回引ける
この結果から答えは1.5

かけ算の場合例えば2.22*1.2は
2.22をを100倍して222、1.2を10倍して12
222を12回足して2664
小数点の位置は100倍、10倍しているので下から3桁目で答えは2.664

と求めようとしています
>>766
意味不明。
>>767
それを10の巾乗じゃなくて2の巾乗(シフト)でやりましょう。
770765:02/02/12 23:51
>>767
見たところ、いきなり小数点演算に挑戦するには荷が重いように思います。
まずは整数同士の掛算、割算に限定してみた方がいいです。

ポイントは、>>769の言うように数を10進数でなく2進数として考えること。
計算のやりかた自体は、人間が2桁以上の数を手で筆算するのと同じです。
例えば3×5を計算するとして、これは2進数だと11×101。これを、小学生に
戻ったつもりで筆算します。
   11
× 101
-------------
   11
  00
 11
-------------
 1111
これを見るとなんとなく分かると思いますが、5(101)を下から1桁ずつ3(11)に
掛けては3(11)を1桁ずらす、の繰り返しです。
ここで「1桁ずつ掛ける」というのは、2進数では×0と×1しかないので3(11)を
足すか足さないかのどちらかしかありませんし、「1桁ずらす」のはビットシフト
そのものです。これで、足し算とシフトだけで掛算ができるわけです。
割算についても、同様に筆算をイメージしてみるといいでしょう。
>>766
「Vectorに登録されてそうな」って…?
(´−`).。oO( Vectorで探せばぁ? )
88エミュとか持ってるけど懐石本がないと何もできないだろうなー
773デフォルトの名無しさん:02/02/21 05:54
さっきからアセンブラのプログラミングを始めたのですが、
Linux上での汗プログラミングを勉強するのにいいサイトは
ありますか?英語のサイトは沢山見つかったのですが、
最初は日本語のものが読めると嬉しいです。

それともCでプログラミングしたのがどうコンパイルされるか
確かめながら覚えるのが早いでしょうか?
asでプログラミングしてるもんです。
セクションとセグメントはどう違うのでしょうか?
386におけるセグメントは大体分かるのですが、
セクションというのが何なのか分かりません。
asのマニュアルなどを見ると
Ld
As
Sub
bbs
などのセクションがあり、さらにLdに関しては
named,text,data
bss
absolute
undefined
などがあるようです。
誰かお願いします。助けてください。
>>755
Asは高機能なアセンブラだからinfoをよく読んだ方がいい。
gccで吐かれるソースはあまりAsの機能を使ってないから
Asを使いこなすにはそれを読んでるだけじゃだめだろう。
777デフォルトの名無しさん:02/02/22 16:59
777get!
>>775
汗派の氷魚さんに聞いてください。
かれはインテルにいたそうですから。
779デフォルトの名無しさん:02/02/24 22:58
まだ初心者なんですがちょこっと計算させるプログラムを組んでデバッガで観察するばっかりじゃ
面白くないんでその結果をアセンブリのみで(call putcharとかなしで)表示させてみたいんですが
参考になるページとかのヒントないでしょうか?
(Windows+GNU asでやってます)
libcのソースコード?
>>779
そんな時こそ DOS コール。
782デフォルトの名無しさん:02/02/25 00:24
>>779
今のPCでは、おまえが理想としている技術はなかなか身につきません。
とりあえず、秋月の通販でH8/3048のボード一式を買ってください。
だまされたと思ってやってみろ。
海外のサイトとか見るとLinuxでのアセンブラプログラミングに
関するサイトとか結構みるけど、日本には殆どないね。
これがコアなユーザー層のレベルの違いなのか?
784デフォルトの名無しさん:02/02/25 00:37
libcしみたら

/* Write the character C on stdout. */
int
putchar (int c)
{
return __putc (c, stdout);
}

となってて、さらに

/* The C standard explicitly says this can
re-evaluate its arguments, so it does. */
#define __putc(c, stream) \
((stream)->__bufp < (stream)->__put_limit ? \
(int) (unsigned char) (*(stream)->__bufp++ = (unsigned char) (c)) : \
__flshfp ((stream), (unsigned char) (c)))

とかなっててもういや〜。

>>782
それっていくらぐらいするもんなんでしょうか?

>>783
そうなんですよ。なんか圧倒的に情報少ないんです。
http://directory.google.com/Top/Computers/Programming/Languages/
とかみると海外じゃ結構情報おおそうなんですか。英語のページあさった方がいいのかな?

今のPCでもいくらでもアセンブラはできます。
というか今の組み込みはCでもできるんで
ライブラリさえ用意してあればPCと同じ。
H8のレジスタは32bitで68000や386SXクラスです。
(モード7ではRAM2Kバイトで悲惨だけど)

text ... Windowsでいうコードセグメント
data ... 初期値を持つデータのセグメント
bss ... 初期値を持たないデータのセグメント
その他 ... デバッグや実行時リンクのシンボル、他

昔のbsdではvoidセグメントが実行時リンクライブラリ
Cでいうstatic変数がdataに来る。
古典的なUNIXのスタイルでは、
bssの両端にスタックとヒープが向かい合って存在し、
中央の領域は仮想記憶空間で実メモリがあるとは限らない。
最近はマルチスレッドと実行時リンクなどで
新しいトレンドがあるかもしれない。
Linuxなんかでは変わっていない。
786デフォルトの名無しさん:02/02/25 01:02
>>784
ttp://www.akizuki.ne.jp/
マザーボードとCPUボード、開発ツールのセットで10000円ほど。
I/Oを叩けばLEDも光るので、CPUの仕組みを学ぶのにもいいと思う。
787デフォルトの名無しさん:02/02/25 01:09
http://www.akizuki.ne.jp/ashop/h8.htm
これですか?なんかおれもやりたくなってきたよ。
386みたいな高級なのなじゃなくても基本が知りたかった。
788何ぞや?:02/02/25 01:14
ハローワールドなら多分こんな感じ。

.data
L0001 .byte "hellow, world", 0x0a
.text
_main:
move.l ebp, esp
move.l $L001, eax
push ax
call _printf
move.l esp, ebp
move.l 0, eax
ret
790工房:02/02/25 01:41
おい!先輩方!
アセンブリのいい本知ってたら教えてください。
ついでに売ってるところも教えてください。
一見とっつきにくいけど本見るまでもなく単純。
命令とハードとOSの知識だけ。
Cの関数はgccのX86なら引数を右からプッシュして_関数名で
呼び出すだけ。結果はeaxレジスタ。
スッタクポインタをいじると死ぬから、
扱うルールをハローワールドのアセンブラ出力をgcc -Sで出して調査。
アセンブラの関数からprintfとか使うの難しくないはず。
792 :02/02/25 04:48
質問なんだが、intel 構文から AT&T 構文へ変換する intel2gas っていうツール
使って試しにインラインアセンブラを含んだ C のソースを変換したんだが、
はき出されたものを gcc に食わすとエラーが出る。誰か詳しい人教えて。
ちなみに AT&T 構文の知識は全くありません。

以下、簡単なソース。
/* testi.c */
#include <stdio.h>

int main()
{
int i, j, k;

i = 0x20;
j = 0x10;

__asm
{
mov eax , dword ptr [i]
mov edx , dword ptr [j]
add eax , edx
mov dword ptr [k] , eax
}

printf("%d\n", k);

return 0;
}

command:
$intel2gas -m -I testi.c > test.c
$gcc -o test test.c
test.c:23: invalid `asm': operand number missing after %-letter
793デフォルトの名無しさん:02/02/25 06:15
Specifying Registers for Local Variables
You can define a local register variable with a specified register like this:

register int *foo asm ("a5");

Here a5 is the name of the register which should be used.
>>792
変換後のソースがないとなんとも言いようがないと思われ。
795793:02/02/25 06:25
%はレジスタを割り当てるテンプレートのエラーみたい。
インラインの変数名やめて
register int i asm("esi");
register int j asm("edi");
で渡して通らないか。
3個目の変数はまずいかも。
796792:02/02/25 06:30
コマンド実行すればわかると思うが一応のせとく。 >> 794

/* testi.c */

#include <stdio.h>

int main()
{
int i, j, k;

i = 0x20;
j = 0x10;

__asm__ (
"movl i, %eax \n\t"
"movl j, %edx \n\t"
"addl %edx, %eax \n\t"
"movl %eax, k \n\t"

: // FIXASM: output regs/vars go here, e.g.: "=m" (memory_var)

: // FIXASM: input regs, e.g.: "c" (count), "S" (src), "D" (dest)

: "%eax", "%edx" // CHECKASM: clobber list
);

printf("%d\n", k);

return 0;
}
797デフォルトの名無しさん:02/02/25 06:35
そういう変換か。
mov %0, dword ptr [i]
mov %1, dword ptr [j]
add %0, %1
mov dword ptr [k] , %0

798797:02/02/25 06:39
ついでに自動変数のi,j,kはbp[offset]だから別のエラーだと思うが
799792:02/02/25 06:39
どーゆこと? >> 797
できればフルソースで頼む。
800ゲット
801797:02/02/25 06:44
展開結果はマクロのパラメーターになんなきゃダメ。
だから、%eaxでなくマクロパラメータの%0が出力されるように書かなきゃ。
レジスタ名がそこにある時点でアウト。
コンバーターの仕様は知らない。
関数単位がラクでいいよ。
802792:02/02/25 06:49
アセンブラの凄腕とみて 767 の __asm__() の部分を具体的に修正してください。 >> 801
AT&T 構文は知識がないのであなたの言っていることはよくわかりません。

>> コンバーターの仕様は知らない
intel2gas はすぐにコンパイルできるのでできれば試してみてください。

>> 関数単位がラクでいいよ
普段は NASM 使ってるんでよくわかります。
803デフォルトの名無しさん:02/02/25 06:53
アセンブラはともかく、gccの仕様の問題です。
インラインだと、レジスタのスケジューリングの問題が
あるんで、テンプレートマクロの形でレジスタ名を指定しろという
ことです。前と後ろで勝手にレジスタの退避とかするんでなくて、
オプティマイザが具体的にどれを使うか決めるんです。
804792:02/02/25 07:01
やはり、自動変換はムシが良すぎるのか・・・。
intel2gas の出力を gcc がそのまま通すと踏んだのだが ・・・。
gcc インラインアセンブラを少し勉強してから出直してくる。
ご協力感謝する >> 803
805とおりすがり:02/02/25 07:29
gcc の asm は複雑やね。インライン付きのソースを
読んだことがあるけど一部いまでもわけわからんよ。
マニュアル牽きながら読まないと…。
お勧めページ

国内
ttp://hp.vector.co.jp/authors/VA000124/
ttp://black.sakura.ne.jp/~third/
ttp://www.e-net.or.jp/user/missing-link/assembler/
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5989/

海外
ttp://spiff.tripnet.se/~iczelion/tutorials.html (最高にお勧め)

なんつーか、基本的なアセンブラの知識は日本の奴でも充分。
WindowsプログラムのはSDKの知識と最後の奴で充分だった。
>>796
やりたいことはこうじゃないか?
eaxを直接指定するのは問題ないぞ。ただしCの文字列の中では % は2つ必要。
clobberに書くのはレジスタの名前。
%0 や %1 を使う必要があるのは C の変数へのアクセスだ。

__asm__ ("movl %1, %%eax \n\t"
"movl %2, %%edx \n\t"
"addl %%edx, %%eax \n\t"
"movl %%eax, %0 \n\t"
: "=m" (k)
: "m" (i), "m" (j)
: "eax", "edx");

ただし、メモリからレジスタへの読み込みはオペランド制約をrにすれば
自動でやってくれるので普通は以下のように書く。

__asm__ ("addl %2, %0"
: "=r" (k)
: "0" (i), "r" (j));
808デフォルトの名無しさん:02/02/25 10:55
movl $1, %eax
addl (%edx), (%eax)
809デフォルトの名無しさん:02/02/25 14:42
Sparcのframe.hについて教えてください。
Sparcのstack frameの定義がsys/frame.hにありますが、
struct frame {
int fr_local[8]; /* saved locals */
int fr_arg[6]; /* saved arguments [0 - 5] */
struct frame *fr_savfp; /* saved frame pointer */
int fr_savpc; /* saved program counter */
char *fr_stret; /* struct return addr */
int fr_argd[6]; /* arg dump area */
int fr_argx[1]; /* array of args past the sixth */
};
このfr_argとfr_argdって何がちがうんでしょうか。
fr_argdにCの関数の引数が入ってる感じなんですが。。。

アセンブラの達人の回答お願いしまっす!
810デフォルトの名無しさん:02/02/25 15:56
ターボアセンブラってソフトは今も売っているんですか?
ターボアセンブラってソフトは今でも動くんですか?
812デフォルトの名無しさん:02/02/25 18:46
>>809
Sparcにはレジスタウィンドウという仕掛けがあって、関数呼び出しの際に
呼び出し元で使っていたレジスタをいちいち保存しなくてもいいように
なっているんだけど、当然ながらレジスタ数には限りがあるので、
関数呼び出しのネストがある数(8くらいだっけ?)以上に深くなると、
自分が使用するレジスタを確保するために、自分の呼び出し元の元の…の
使っていたレジスタをスタックに退避しなければならなくなる。
で、fr_localやfr_argなどがそのための領域みたい。

Sparcは実際に使ったことないので間違ってたらゴメン。
814デフォルトの名無しさん:02/02/26 17:45
>>813
もうしわけないっす。
でも、fr_argとfr_argdの違いってことなんですが。。。
>>809
SPARC だと汎用レジスタが 32 (r0 - r32) まであって、用途は

r0    ゼロレジスタ
r1-r7  グローバル
r8-15  出力(関数呼び出しのときに渡す引数, return address, stack frame pointer)
r16-23 ローカル
r24-r31 入力(関数呼び出しのときに渡された引数, struct return address, レジスタ
         に収まらなかった引数を格納したスタック領域へのポインタ)

となってる。当然 r0-r7 は関数呼び出しのときに保存する必要がないので、
保存する必要があるのは残り 24 個。それを struct frame に適当に割り付け
てるだけだと思うよ。

名前からして fr_local がローカルレジスタ、fr_arg が出力で fr_argd が入力じゃ
ないの。
816815:02/02/26 18:10
> SPARC だと汎用レジスタが 32
一つのレジスタウィンドウで見える汎用レジスタが 32 ね。汎用レジスタ自体は
もっと大量にある。
817813:02/02/26 19:39
なんだか説明が変でした。すんません。
で、"SPARC ABI"で検索したら以下のようなドキュメントが見つかったので、
紹介しときます。

"Understanding stacks and registers in the Sparc architecture(s)"
http://www.sics.se/~psm/sparcstack.html
これは知りたいことの説明そのまんまになっていると思う。

"SYSTEM V APPLICATION BINARY INTERFACE SPARC Processor Supplement"
http://www.sparc.org/standards/psABI3rd.pdf
これの3-8 Function Calling Sequenceも参考になります。
818デフォルトの名無しさん:02/02/27 00:47
>>814です。
みなさん、ぬりがとうございます。ちょっと調べてみます。
819デフォルトの名無しさん:02/03/01 23:33
あげてみる
ぬりがとう… もとネタあり?
821デフォルトの名無しさん:02/03/09 07:52
ぬりがとうあげ
822デフォルトの名無しさん:02/03/09 12:32
ぬげ
823デフォルトの名無しさん:02/03/10 14:18
movl %eax, %ebx

この構文を使うコンパイラはなんですか?

gnu assembler
825デフォルトの名無しさん:02/03/10 21:08
アセンブラ勉強したいけど
PICとかの言語とかと同じ感じですか
826デフォルトの名無しさん:02/03/10 21:15
gas + linux + x86の勉強にいいWebをよろしくお願いします。
$info as
俺はアセンブラはほかの言語よりも、ソースコードを
多めに読むべきだと思うYO。作りたいプログラムがあっても
アセンブラは1命令自体の役割は小さいから、結局
いくつかセットで理解したほうが使いやすい。
829デフォルトの名無しさん:02/03/11 22:02
昔、構造化アセンブラを実現するMACROSってあったねぇ・・・。
PICは悪いこと言わないからやめとけ。
せめてAVRにしろ。
831デフォルトの名無しさん:02/03/12 01:15
>>829
構造化ならgasでかなりいけるんじゃない?
832MOV AX,0400H:02/03/20 21:24
debugウマー
833832:02/03/20 23:08
・・・・・・・

wコマンドでファイル保存のやり方はどうすればよいのですか?
>>829
「アセンブラMACROプログラミング技法」ってのだね。
A-MACROSが正式名称かと。
>>833
-n ファイル名.com
-r bx
:0000
-r cx
:プログラムの終了アドレス -100h
-w

忘れていたので昔の本サンショした
836832:02/03/20 23:14
ありがとうございまーす!!
>>833
より分かりやすい例

C:\>debug
-a 100
1709:0100 jmp ffff:0000
1709:0105
-r cx
CX 0000
:5
-n hoge.com
-w
00005 バイト書き込み中.
-q

で、上記で作成したhogecomは、意味わからん厨は実行しないように。
責任はとらんぞ。
838デフォルトの名無しさん:02/03/21 01:38
アセンブラ入門したいんですけど、
どういうステップで勉強すればいいでしょうか?
>>838
一般論だが、

1.文法について覚える
2.命令を覚える
3.プログラムを読む/書く

ってな感じで。
x86系の、インテル486までの命令セット表を探してるんですが…。
ありませんか…?
841kcrt:02/03/21 02:05
>>840
インテルのページに親切なPDFがあるよ。
842デフォルトの名無しさん:02/03/21 02:23
>841
ありがとうございます。

早速行っていますが…。
…迷子になりもうした…。
もう、…ダメかもしれません。
843デフォルトの名無しさん:02/03/21 02:31
>>842
頑張れ! o(^-^)o
>>840
ttp://www.intel.co.jp/jp/developer/design/processor/index.htm

Pentiumからでよければ上記

書籍では、「はじめて読む486」とか
(まぁ、いくとこいけばそれいがいもたくさんあるが)
845838:02/03/21 14:20
具体的な方法を教えていただけるとうれしいのですが。
846顔も名前も出さずに毎月100万円:02/03/21 15:43
    
Future-Web(フューチャーウェブ)登場
なんと10,000円単位の収入    

●10,000円単位の高収入
 1件につき最大10、000円の高額収入。月収100万円以上も可能。
●画期的なビジネス!
 インターネットを利用したこれまでにない斬新で画期的なビジネスです。
●誰でも出来ます!
 インターネットが出来る環境の方なら誰でも参加可能です。
●専門的な知識は一切不要!
 ビジネスに必要なツールはすべて当社で用意いたします。また、サポ
 ートも万全です。
●詳細は今すぐHPをご覧ください。
  http://www.future-web.tv/7823/
通報しますた。
>>845
839の一般論とやらは無視しましょう

1. CPUの仕組みと動作原理を理解する
2. CPUと周辺機の関係を理解する
3. メモリのことについて理解する

まずは、上記のようなことから始めるのが近道と思われ
漏れは、10年以上前に「はじめて読む8086」っちゅう本で
勉強したよ。今でも本屋でみかけるぞ
849838:02/03/21 18:22
ありがとうございます。

>1. CPUの仕組みと動作原理を理解する
パイプラインの話でしょうか?
少しはわかってます。

>2. CPUと周辺機の関係を理解する
これはよくわからないのですがOSですか?
良い本があればお願いします。

>3. メモリのことについて理解する
これも良い本があれば教えてください。
OSのページング等の事なら、OSの本を読めばいいのでしょうか?


>「はじめて読む8086」
読んでみようと思います。
>>849
教えてクン、推薦図書スレをチェックしろ。
851デフォルトの名無しさん:02/03/21 21:23
技術評論社から、「8086 マクロアセンブラ入門」という本が
3月25日に発売されるようだ。

詳しくは、新刊案内を。
852838:02/03/21 21:24
>>850
チェック済みですが何か?
>>852
だったら読むべき本は分かるはず。
854デフォルトの名無しさん:02/03/21 21:41
なんでVC++の英語版にはマクロasmがついているんでしょう
MSは日本人には(英語の知らないのには)asmはするなということでしょうか?
MSDNの英語版のVS6_SP5のなかにasm入ってます
「はじめての486」これだね。
これで分からなかったらプログラムなんて止めちまえ。
856デフォルトの名無しさん:02/03/21 21:56
857デフォルトの名無しさん:02/03/21 21:59
masmってマクロasmのことでよいのでしょうか?
masmはマイクロソフトasmですか
どちらでしょうか
素人質問で申し訳ございません
858デフォルトの名無しさん:02/03/21 22:51
848ではありませんが

>>849
> パイプラインの話でしょうか?
> 少しはわかってます。
まったく役にたちません。必用なのはCPUの論理的な構造を
知ることです。

> >2. CPUと周辺機の関係を理解する
> これはよくわからないのですがOSですか?
これはむしろプログラミングの対照についての知識に近いの
でアセンブラのプログラマでも知らなくてすむ人はいくらで
もいます。組み込みなどでは知らなくてはなにもできないで
しょう。

> >3. メモリのことについて理解する
> これも良い本があれば教えてください。
これはもとの意味が分かりません。メモリはアドレスを指定
してデータを読み書きするということだけ知っていれば充分
です。

しいて言えば >>839 の一般論が正解でしょう。

却ってとまどうかもしれませんがなぜアセンブラをやりたい
かわからないと839以上の答は難しいでしょう。

単に知りたいだけならx86でやるのは最悪の撰択です。できれ
ばきれいなアーキテクチャを選んだほうが良いと思います。
一応 68000,汎用機、CASLの旧型などが私のお勧めです。
859838:02/03/21 23:09
>まったく役にたちません。必用なのはCPUの論理的な構造を
>知ることです。
ハザードが起こらないようにするために考える必要があると思うのですが。
高速化するためには、どういうユニットがあるのか
それがどれくらいのサイクルを必要とするかがわかってないと
ダメだと思うのですが、見当違いでしょうか?

アセンブラを使えるようになりたい理由は、
プログラムを高速化したいからです。
命令ごとの必要なクロックサイクルってCISCなら固定なんだっけ?
>技術評論者
どうでもいいけどlinux嬢でのアセの本書いた方が売れるんじゃないか?
Windowsで汗かいてる人はもう既にかなり出来る人がおおい。それに
新規で興味持ってるひともそんなに多くないような気がする。
他にドキュメントや本も沢山あるしね。

商売が下手なのか、単に書ける人間がいないのかどっちか知らないけど、
企画として失敗な気がするよ。
>>859
普通にプログラミング出来ればアセンブラなんてサクッと理解できると
思うけど。

まずアルゴリズム見直そう。アセンブラは本当の最終手段だと思うな。

使わんでも下手な奴がアセンブラで書いたプログラムよりCとかで書い
たプログラムが速い事は良くある話だよw

ローテート使いたい時にインラインアセンブラ使うとかw
863858:02/03/21 23:38
>>859
> ハザードが起こらないようにするために考える必要があると
>思うのですが。
> 高速化するためには、どういうユニットがあるのか
ハザードは勉強不足で知りません。これはCISCに個有なもの?
ただプログラミングするときにパイプラインがどういうふうに動作
しているからこういう命令の並びにしたほうが速いだろうと考える
る人はいないと思います。スピードを上げたいなら他の方法を考え
るでしょう。
>>838
ちみはどんなプログラムを高速化したいんですか?
865デフォルトの名無しさん:02/03/22 00:05
メモリのアドレスでデータを操作できない言語には
戻れなくなった(覚えられなくなった)俺はこれから死滅しますか?

だってポインタ使い心地(・∀・)イイ!!んだもん
汗のレジスタハヤーイ!
このスレが勃ったとき2chを見てたが、
ここまでスレがのびーるとは思わなかった。
>>865
DAYONE-
アセンブラとCが一番居心地が良い。
>>838
ハザードを考慮しないといかん、ってことは組み込み系か?
少なくとも俺はアセンブラ使うときにハザードなんか意識したことはない。
最近のCPUは内部構造がムサクサ複雑なのでコードだけから動作速度を予想するのは
極めて困難デス
MASM32でNotepadもどき作ったけど、やっぱ速いよね。
サイズも小さいし。
>>870
実はWin32SDKを使って書くならCと大差ないという罠。

しかもCの1/10倍くらいのサイズ。
872kcrt:02/03/22 00:39
C言語はローテートシフトをサポートしる!
Cの開発者が使ってたCPUにローテート命令は無い
874kcrt=872:02/03/22 01:19
あ・・・そんな理由があったんだ。知らなかった。
debugのセグメントベースって変えられないんでしたっけ?
876840:02/03/22 01:39
>>843,844
遅レスですみませが、ありがとうございました。
とりあえず目的の物は見つかりました。(まだ降ろしてないですが)

また、放浪中に、(486までの)各x86系CPUのオペコードのサイクルが載ってる資料?を見つけたので、
「んなもん普通に持ってんに決まってんだろ、このクソ野郎!」とか
「既出だ馬鹿。ミソ汁で面洗えよ」
と仰らない方は↓どうぞ。
ttp://www.penguin.cz/~literakl/intel/intel.doc
ttp://www.penguin.cz/~literakl/intel/intel.html
>>868
838の逝っているハザードはソフト的なやつで、868の逝っている
ハザードはハードの方の話ではないのかと思われ・・・・
878age:02/03/22 02:01
>>876
インストラクションセット・・
(゚∀゚)イイ!
>>862
> 普通にプログラミング出来ればアセンブラなんてサクッと理解できると
> 思うけど。
システムプログラミングがらみだと、そうでもないよ。マルチタスク、入出力、
仮想記憶がらみの命令は、アプリケーションプログラミングの知識があって
も理解できない。

それを知りたいなら >>848 が言ってることを抑える必要があるし、そうではなく
単にアセンブラで一般的なプログラムを書きたいって話なら >>839 だね。
880デフォルトの名無しさん:02/03/22 07:49
asmが一番わかりやすいと思うな
CやJAVAより
単純だからこそ使いやすくてよろし

Windows上なら Delphiのインラインアセンブラが一番入門には手軽で気楽だと思うんだがなあ
C+asmだと出来る範囲はホントしれてるし
>>882
誤爆ですな。
Windowsだと、アセンブラだけを使う機会は殆どない。
 少し前はデバイスドライバはアセンブラだったけど、これもヘッダを作るためで実装はCで書けるし

今、あえてアセンブラを使うとすれば、他の言語 C++やDelphiと組み合わせる場合
例えば、
 1、多倍長演算ライブラリを自作する( CFを使わないと非効率的な為)
 2、コンパイラでサポートされてないCPUの命令を使う為 MMXとか RDTSCとか回転とか
 3、コルーチンのようなスタック切替を使うテクニックの実装に
 4、自己解凍書庫のようにとにかく小さく作りたい場合
 5、複雑な整数演算(マンデルブロのような)をカリカリにチューニングしたい場合

ただ、複雑な処理といっても メモリアクセスサイクルとCPUサイクルが2桁も離れている現状では
大抵の処理はメモリサイクルに隠れてしまう事を考えると、処理時間のチューニングにアセンブラ
を使う発想はあまり有効でない。
885838:02/03/22 14:03
ハザード関連は私が一番よくわかってないと思いますが、
とりあえず、x86というのはciscなんでしょうか?

それはいいとして、
x86がパイプランのハザードをどう処理しているのかよくわからないので
なんともいえないのですが、
ハードウエアとコンパイラ(アセンブラ)の両方で、ハザードを防止するような
アーキテクチャも存在させる事はできます。
また、ハードウエアだけで制御する事も、コンパイラだけで制御する事も
可能です。

高速化したいプログラムは数値計算です
>x86というのはciscなんでしょうか
インターフェイスだけはね
Pentiumのバージョンごとに内部の設計は変ってるから
それを考量して汗するのはひたすら大変だと思う。
つまり言いたいのはあれだ。
数値演算用のライブラリを買った方が早いということ
>>885 どんな数値計算? 
 たとえば統計処理だとメモリがボトルネックになって
 アセンブラで書く意味ないよ。
>>885
> x86がパイプランのハザードをどう処理しているのかよくわからないので
分かれよ。Intel のサイトに必要な情報は全部揃ってるから。
>>838
アセンブラを過大評価してるように感じる。
正直アセンブラを使うことを考えるよりもアルゴリズムを改良したほうが
遥かに高速化されると思うぞ。
その処理の中でアセンブラを使ったほうが明らかに早くなるような場合に、
アセンブラを使おうって話になるんだが。
CPUが処理できないからハザードになるんでないの??
892デフォルトの名無しさん:02/03/22 17:09
>正直アセンブラを使うことを考えるよりもアルゴリズムを改良したほうが
それは十分わかってます

>その処理の中でアセンブラを使ったほうが明らかに早くなるような場合に、
どのように判断するのでしょうか?

>それを考量して汗するのはひたすら大変だと思う。
たしかにそうですよね・・・・
アセンブラが読めればいい、程度の気分になってきました。
ハザード と言ってるのは もしかして ストールの事ではないのか?


もちろんパイプラインハザードを防ぐ為にストールするという事もあるけど
>>その処理の中でアセンブラを使ったほうが明らかに早くなるような場合に、
>どのように判断するのでしょうか?

>>884 で書いてると思うが?
895age:02/03/23 00:18
運用・保守
機能追加・仕様変更
897バイク板の鬱な藁人魚:02/03/23 16:57
すみません、PC/ATのBIOSがらみの質問なんですが、
INT 1Ehの飛び先アドレスをポインタにして参照する
ディスクドライバパラメータブロックの内容って
何処で調べればいいのでしょうか??
898デフォルトの名無しさん:02/03/23 18:35
>>897
ここで聞いて調べなさい。
899デフォルトの名無しさん:02/03/23 19:43
mov eax, DWORD PTR [eax]
みたいな、他のレジスタを経由しない演算は他と比べて遅いのでしょうか?
コンパイラの出力みるとEBXやECXを経由してるのを良く見かけるんで。
>>899
何と何を比較したいのかヨク分からん。両方のコードを示してみて。
>>899 その前に それはRAMテスト以外に何か意味でもあるの?
902デフォルトの名無しさん:02/03/23 20:07
>>900
例えばLISPのペアオブジェクトのcadarを取るコード
struct pair {
 struct pair *cdr;
 struct pair *car;
};
のときのcadar(p)=car(cdr(car(p)))
の出力コードは
mov ecx, DWORD PTR [eax+4]
mov edx, DWORD PTR [ecx]
mov eax, DWORD PTR [edx+4]
になります。(VC6SP5)
これを全部eaxに直した場合とでは、速度差はでるのか?
って事です。

ちなみにEAXだけによるcdr参照は
mov eax, DWORD PTR [eax] ; t1 = cdr(t1)
car参照は
mov eax, DWORD PTR [eax+4] ;t1 = car(t1)
です。
cadarですと、
mov eax, DWORD PTR [eax+4] ;t1 = car(t1)
mov eax, DWORD PTR [eax] ; t1 = cdr(t1)
mov eax, DWORD PTR [eax+4] ;t1 = car(t1)
なので、これと前者を比較してどうか?ということです。
>>899
PentiumPro以降なら速度変わらないはず(レジスタリネームで別々の物理レジスタに割り当てられるから)。
古いCPUはわからない。
P6以降ならレジスタリネーミングで同じになっちゃうと思うよ。
P5とかだとAGIかなにかで2クロックは待たされるはず。
905899=902:02/03/23 20:28
了解しました、やはりペナルティはあるんですか。
(物理的にEAX=OP(EAX)が見たまんまの効率で動くとは思えなかった)

なんでこんな質問をするのかというと、
LISPで動的にインストラクションコードの並びの生成/実行を
やってみようと思いまして、とりあえずなじみのリスト演算で
きめ打ちコードを自動生成するプログラム作ってるときに
VC6SP5の出力と比較して、あれ?と思ったので。
もはやP5以前のCPUのことは考えなくていいと思う。

ちょっと905の意図しているところが分からないけど、
P6以降だとインストラクションの並べ替えはCPUがやっちゃうから、
下手にいじるよりもストレートに吐いたほうがいいかもしれんぜよ。
いや前から どっちも同じサイクルだったと思ったけどな
>>905
mov ecx, DWORD PTR [eax+4]
mov edx, DWORD PTR [ecx]
mov eax, DWORD PTR [edx+4]
これでもP5ではAGIストールは起こるはず。
結局、途中のレジスタ名を変えても変えなくても同じだと思う。
909905:02/03/23 20:37
じゃ、もうなにも考えずに後者みたいな自分の都合の良い方法で
吐かせることにします。
910デフォルトの名無しさん:02/03/23 20:37
>>907
それは俺の自転車だYO!
911905:02/03/23 20:40
>>908
それでは逆に、なんでコンパイラはあんな出力にしてるのか疑問に
思うんですが、他になにか要因があるんでしょうか。
912905:02/03/23 20:41
あ、EAXのみの方がインストラクションコードとしては短くなるんで・・
>>911 別にどっちでも同じだから 何も考えずにやってるだけでは?
914905:02/03/23 20:45
>>913
なるほど(w
もうこの件について考えるのは辞めたほうがよさそうですね。
ありがとうございました。
Intel C++ Compiler でコンパイルしてみたら、まさしくこの
mov eax, DWORD PTR [eax+4]
mov eax, DWORD PTR [eax]
mov eax, DWORD PTR [eax+4]
コードを吐きました。単にVC6のクセでしょう。
命令スケジュールをソフトでやったら多少効果あるかな?

つまり、そのMOVEの間に次の処理を埋めるとか
>>916
それやるとP5ではAGIストールをなくせるから、P5では効果あるんじゃない?
Cはライブラリ覚えるだけで人生終わる。
アセンブラは覚えること少ないから楽でいいよ。
919デフォルトの名無しさん:02/03/24 01:57
>>918
アホか。
Cのライブラリの量なんてたかが知れてる。
良く使う関数なんてのは決まってるし。
>>919
汗の対象物に関してあんまり大した知識を持ってないで適当にやってるんでそ
921デフォルトの名無しさん:02/03/24 03:35
AレジスタとBレジスタを
メモリや他のレジスタを
使わずに交換するのって
どうやったっけ。
XORとかNORとか使ってや
るんだとおもうんだけど。
922デフォルトの名無しさん:02/03/24 03:46
xorのみで出来るよ。
XCHG A,B
>>923
それはデバイス依存じゃないか。
>>920
アセンブラ自体は簡単なんだが、それを実際に使うためには
対象物についての知識が他の言語よりも必要だよなぁ。
>>921
a ^= b;
b ^= a; /* b = a ^ b ^ b = a */
a ^= b; /* a = a ^ b ^ a = b */

こんなかんじかぴょん。たしかめてないけどぴょん…。
>>926
a = 1100
b = 0101

a ^= b => (a = 1001)
b ^= a => (b = 1100)
a ^= b => (a = 0101)

交換できてます。
928926星人:02/03/24 04:34
よかったぴょん。アセは酢こんぶのように味わいぶかくて良いぴょん。
それなりにアセに熱いサイトったら、へるみさんとこですかぴょんね。
アセプログラマじゃないぴょんけど、頭の体操しながらよく見に行くぴょん。

http://homepage1.nifty.com/herumi/
>>927
xorで同じ値は交換出来ずにバグと格闘すると言う罠。
>>929
って違ったかな?何か駄目なパターンがあった気がしたんだが。

引き算なら浮動少数でも交換出来るということを残して逝って来ます。
NaN でも交換できます?
>>930 引き算てコレ?
a = b - a
b -= a
a += b
>>930
同じ値ではなく、同じモノを交換しようとすると値が0になって消えてまう、って奴かな。
ぴょん、つーのやめてくれる?
春なのに北風が吹くんですけど
ぴょん、つーのやめてほしーぴょん。
春なのに北風が吹くぴょん。
936デフォルトの名無しさん:02/03/24 12:11
Linux + vi
で便利なtipってないの?
937 :02/03/24 12:58
つうか、データ作成だけはアセンブラでやってます。
構造体やクラスでは扱えない不定形データをソースのまま
連続してメモリに配置・生成できるのはいまのところアセンブラしかない。
>>936
自分でさがせ
939デフォルトの名無しさん:02/03/24 13:50
>>937
それ、どういうデータなのか、カナーリ興味ある。
教えてくれ。
940デフォルトの名無しさん:02/03/24 14:11
>>939
インタプリタのコード。
>937
ネットワークバイトオーダまで考慮してくれるといいんだけどね
942デフォルトの名無しさん:02/03/24 15:15
>>937
配列で領域確保するのと大差ないと思うが。
>>937
c なら reallocの連打でなんとかなるかも、とか思ってしまった。
ところで次スレどうする?


アセンブラのサンプルちょーだい
http://pc.2ch.net/test/read.cgi/tech/1016445795/

アセンブラのプログラムですけど
http://pc.2ch.net/test/read.cgi/tech/1011120676/

【Cを】GUN Assembler【極める】
http://pc.2ch.net/test/read.cgi/tech/1015895034/


これを再利用する? それとも専門スレをたてる?
945デフォルトの名無しさん:02/03/24 18:16
>【Cを】GUN Assembler【極める】

これをリサイクルしようじゃないの。
946 :02/03/24 18:19
配列確保したあと、どうやってデータ並べるの?
>>942
947デフォルトの名無しさん:02/03/24 18:20
あとラベルだな。
データにラベルつけてGOTO命令入れたり出来ないじゃん。
>>945=そのスレの1
冗談はよしてくれ
949仕様書無しさん:02/03/24 20:07
>>948
なんで?おなじような話題だから統一してもいいでしょ。
950デフォルトの名無しさん:02/03/24 20:16
●●アセンブラって死滅しちゃうの?●●

死滅寸前のアセンブラを今まで必死こいて勉強してきた俺って一体・・・。

でどうよ?
951仕様書無しさん:02/03/24 20:47
>>950
それは色々釣れそうなタイトルだな。(w
機械語萌え・・・・スレだから、
2本目作れば良いのでは?
>>945
特定の処理系である GNU as を前面に打ち出したスレでは、ちと趣旨が違うと
思われ。
【Cを】GUN Assembler【極める】
http://pc.2ch.net/test/read.cgi/tech/1015895034/l50
を使うのもなかなかだと思うけど、"Assembler"は「アセンブラ」と違って、
日本人には直感的に訴えにくいと思う。
ただ、>>950のようなスレタイトルだと、煽りや荒らしが心配。
ひっそり活動できるスレがほしいので、新スレきぼんぬ。
956デフォルトの名無しさん:02/03/24 22:19
おれも新スレ希望
新スレにするとして、なんのCPUでOKにするん?
アセンブラ、というタイトル名を削ると検索できなくて
類似スレが立ちまくると思われ。
アセンブラ… (゚д゚)ウマー
に1票。
アセンブラ… (・∀・)イイ! #2
でイイような気もするが。
960デフォルトの名無しさん:02/03/24 23:21
>配列確保したあと、どうやってデータ並べるの?
byte単位で書き込んでもいいし、どうやってもできるけど?
>>959
#n・・・よりは、n本の方が・・・・・
その □□□■
その □□■□
その □□■■
その □■□□

なんて厨っぽい?(w
アセンブラ… (・∀・)イイ! PC=2
はどお?
964デフォルトの名無しさん:02/03/24 23:24
このスレを見る限りでは、アセンブラなのに、
組み込みの人が少ないような気がする。
時代の流れかな。
ちなみに漏れの会社は、未だに新規でZ80互換を使います。
965デフォルトの名無しさん:02/03/24 23:32
アセンブリ言語なら>>10に聞け!

で決定。
966デフォルトの名無しさん:02/03/24 23:32
お前らいいから早く
新スレ立ててくださいませんか。
967958:02/03/24 23:41
うむ語尾はラにしたほうがいいな。
リとは締りが違う。
>>966
オマエガタテロYO
時間が無いぞ、こうしてレスしている間にも痔スレを立てねばいけなくなっている・・・
焦るな焦るな(((((;゚д゚)))))落ち着け落ち着け
次スレまだ勃たないのかな?
とか逝ってスレ消費してみるテスト。
しかたないので、自分のを勃てみるテスト
972デフォルトの名無しさん:02/03/25 00:25
                 今この辺だぞ!瀬戸際!大変!
                ↓
                @
 ̄ ̄700 ̄ ̄800 ̄ ̄900 ̄|
                 |
_____________________________________|__________
      海
スレ滅亡の日まであと以下略
アセンブラ… (・∀・)イイ! LD A,0x02
Z80はまずいかな・・・
アセンブラ… (・∀・)イイ! LABEL 2
とかか。
どーせならオペコードで・・・(w

アセンブラ… (・∀・)イイ!B002
・・・・あーもう!
俺が決めるぞ!
>>988さん、よろしくぅ〜。
絶対立ててね!
977デフォルトの名無しさん:02/03/25 02:22
冗談は良子さん。
978デフォルトの名無しさん:02/03/25 02:22
つーかもう立てちまうぞ?
いいな、お前ら?
ご冗談でしょうファイマンさん。
980デフォルトの名無しさん:02/03/25 02:31
インストラクションセット・・・(゚∀゚)イイ!
981まるち:02/03/25 02:35
はわわわ〜〜〜〜〜
あと19ですぅ〜〜〜〜
982デフォルトの名無しさん:02/03/25 02:36
うーんそうだね〜
いよいよ来た
983デフォルトの名無しさん:02/03/25 02:36
>>979
きさま、その本を知ってるとは・・やるな
984デフォルトの名無しさん:02/03/25 02:36
なんかもう我慢できなくなってきたYMO
ご冗談でしょうノイマンさん。
非ノイマン型コンピュータなんて
986えへへ:02/03/25 02:37
カウントダウンしましょか
つーかはよ誰か立てろや
987986:02/03/25 02:40
(`Д´)モウスグモウスグ・・・・

⊂(`Д´⊂ )⊃≡ <1000ゲットの練習しる!
988えへへ:02/03/25 02:40
ちなみにおれは立てれん。
スレッド立てすぎです。。
と出てもーた
こいつはチキンランだ。
ブレーキを踏んだ奴(スレ立てた奴)はチキンだな。
990デフォルトの名無しさん:02/03/25 02:41
⊂(`Д´⊂ )⊃≡ <990
991991:02/03/25 02:42
⊂(`Д´⊂ )⊃≡ <991!!
992えへへ:02/03/25 02:42
>>990
ほなな、お前立てろや

アセンブラ… (・∀・)イイ! Part2
前スレ
http://pc.2ch.net/test/read.cgi/tech/1002267809/

でいいから。
993デフォルトの名無しさん:02/03/25 02:43
のこる8まで
キタ━━━(゚∀゚)━━━!!!
994デフォルトの名無しさん:02/03/25 02:45
みんな狙ってるのか・・・?
995995:02/03/25 02:45
勃てました。
996デフォルトの名無しさん:02/03/25 02:46
age
997デフォルトの名無しさん:02/03/25 02:46
       v
     <(゚ω゚) <うっ!
      (  )\        
      /'>
998デフォルトの名無しさん:02/03/25 02:46
       v
      (゚ω゚)> <はっ!
     /(  )        
       <'\
999デフォルトの名無しさん:02/03/25 02:46
       v
     <(゚ω゚)> <うっ!
      (  )        
      /'>

1000デフォルトの名無しさん:02/03/25 02:46

       v
      (゚ω゚)/ <はっ!
     /(  )        
       <'\
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。