トップページ⇒tech
1001コメント316KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
めくるめく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
0446デフォルトの名無しさんNGNG
>>445
ページングするから判断できる。
物理メモリに存在しないページを要求されたらプロセッサは
一般保護例外を出す。
それをOSが拾ってページを割り当てる。
割り当てるページが無かったらSegmentation Fault。
0447はじめて読む6809NGNG
>>430
その3冊手に入れました。頑張って勉強してみます。
遅レス失礼しました。

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

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

うーん。
要は仮想アドレスを使っていてどうやって
タスク間アクセス保護が出来るのかって事が知りたいのです。
0452デフォルトの名無しさんNGNG
物理的に隔離するんだよ>451
0453デフォルトの名無しさんNGNG
>>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
を読むべし。
0454デフォルトの名無しさんNGNG
タスクごとにpage tableをごにょごにょする、ですか。
う〜ん。
う〜ん。
がんばって読んでみます。ありがとうございました。
0455デフォルトの名無しさん NGNG
やれやれ、レベルの低いスレですな :3)
0456デフォルトの名無しさんNGNG
とにかく速い!マシン語ゲーム集
のモービィディックというゲームが面白かったです。
あの本の最後の笑い話の意味がわかったとき
道を踏み外したなと確信しました。
0457デフォルトの名無しさんNGNG
アセンブラを勉強したいのですが、
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
これが一番よさそうなのですが、どうですか。
0458デフォルトの名無しさんNGNG
>>457
ダウンしましたが、
「通常はVC++といっしょに使ってください」
と書いてあったので、やっぱりだめみたいです。
0459デフォルトの名無しさんNGNG
NASMでええやん。
0460___NGNG
でもhmx-12,13には何かひきつけられる物があるんだが?
0461デフォルトの名無しさんNGNG
>447

は?マジで絶版?うそだろ
0462デフォルトの名無しさんNGNG
>457, 458

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

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

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

それともファイルサイズとかを限界まで攻めるために
純粋なアセンブラが必要なのだろうか。
0467デフォルトの名無しさんNGNG
たぶん、出来る出来ないが問題なんだろうよ
0468デフォルトの名無しさんNGNG
タダたんにちょっと勉強してみたいだけですよ。
Cを勉強する前にアセンブラをやるのが常識みたいだし、アセンブラができるとドライバーが書けるみたいだし、ドライバーが書けると女にもてるみたいだし。
0469だだNGNG
>>468 ドライバーが書けると女にもてるみたいだし。
そりゃないだろ。
0470デフォルトの名無しさんNGNG
貴様はアレか?その、アレか?
女にモテたいがためにアレか?その、何だ、斡旋ブラやってるのか?
「こんなのどうでしょうお嬢さん」とかアレか?言うんか?
「お似合いですよ」がアレか?殺し文句か?
0471デフォルトの名無しさんNGNG
>>469
ねただろ。ボケェ
0472デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi?bbs=unix&key=1006179848&st=13&to=13&nofirst=true
ここを見なさいよ。
0473デフォルトの名無しさんNGNG
タダたんにちょっと勉強だったら Delphi6 パーソナル。
 インラインでアセンブラ書けるから勉強するには丁度いい

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

>インストール後にCPU交換されたら困るじゃん。
もっともだ(笑)
0508デフォルトの名無しさんNGNG
>>507

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

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

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

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

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

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

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

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

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

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

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

#define OFFSET_XXX  3
#define OFFSET_YYY  8

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

movl OFFSET_XXX(%eax), %eax

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

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

教えてください。
0532デフォルトの名無しさんNGNG
モエage
0533デフォルトの名無しさんNGNG
>>531
MS のサイトから Processor Pack ってのを探してきてインストール。
これで SSE 対応のアセンブラが入ります。
0534デフォルトの名無しさんNGNG
ありがとうございます。マジで助かります。
0535デフォルトの名無しさんNGNG
SP5でいいじゃん
0536デフォルトの名無しさんNGNG
NTはなぜシャットダウンできないのですか・・すみません。
invoke ExitWindowsEx,1,0
invoke ExitProcess,eax
0537デフォルトの名無しさんNGNG
MSDN読め。つーか、スレ違いだYO
0538>536NGNG
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
0539デフォルトの名無しさんNGNG
CASLヤリタイ・・・デモCモマダダッタ・・ヽ(,`Д´)ノウワァーン
0540デフォルトの名無しさんNGNG
>>539

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