アセンブラヽ(`Д´)ノモルァ
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNGアセンブラ… (・∀・)イイ!
http://pc3.2ch.net/test/read.cgi/tech/1016991911/
0003豊田スタジアム ◆lgnmT9tYFg
NGNG0004デフォルトの名無しさん
NGNGスレタイは前回となんにも変わらないし、全スレとかいってタイトル違ってるし、
ここは糞スレだな。>>1は馬鹿丸出し
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGドンマイ!
そのうち良い事あるさ
0007デフォルトの名無しさん
NGNGはどうだろう
0008デフォルトの名無しさん
NGNGジャパネットに電話して聞いて見ろ
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGDOS窓開いて
debug
と打て
ヘルプは?だ
抜けるのはqだ
0011デフォルトの名無しさん
NGNGアセンブラ… (・∀・)イイ!
http://pc.2ch.net/tech/kako/1002/10022/1002267809.html
アセンブラ入門
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
Win32 アセンブラ
http://www7.plala.or.jp/keny01/masm/101-02.html
NASM マニュアル
http://www.bekkoame.ne.jp/~bero/docj/nasm/nasmdoc0.htm
0012デフォルトの名無しさん
NGNG○gas=GNUのアセンブラでGCCにがあればついてくる
形式はAT&T型で慣れるまで読みにくい mov A to B
gcc -S hello.c でアセンブラ出力
○MASM
Win32用のアセンブラ。
VCにアドオンとしてもってくるか、MASMの灰色フリーのパッケージがある。
結構使われてたらしい
○NASM
Linuxにもはいってることもある優秀アセンブラ
日本語マニュアルサイトがウレシイ
-----------------
結論 gas最強。
0013デフォルトの名無しさん
NGNGなども言語自体が仮想CPUになってるので
アセンブラの基本を学ぶことでこれらの造詣が深まること間違いナ死!
0014デフォルトの名無しさん
NGNGVMで動くって事を言いたいのか?
それなら、Perlは違うだろう。
0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNG> 形式はAT&T型で慣れるまで読みにくい mov A to B
プロセッサによりけり。MIPS 系だと
inst rd, rs, rt
だし。
gas 使う場合には gas 用マクロプリプロセッサ, gasp も合わせて使うと、幸せに
なれるぞ。
0017」 ■┏┓■L_酉~
NGNG機械翻訳かはしらないけど、一応顔なんだし。
他にわかりやすく解説してるサイトがいるからいい、と言われればそればそ
うなんだけど
0018デフォルトの名無しさん
NGNGアセンブリ
アセンブル
どれが正しくてどう違うんでつか?。・゚・(ノД`)・゚・。
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNG低水準言語に置けるアセンブラと
同じ関係である。
時としてアセンブリ言語をアセンブラと
呼ぶこともある。
0023デフォルトの名無しさん
NGNG0024デフォルトの名無しさん
NGNG良い。っつか、品詞考えれば明白だと思うが。
アセンブラ 名詞
アセンブリ 形容詞
アセンブル 動詞
0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNG辞書でも正当な用法として評価されたりする
馬鹿が新語や新用法をつくっていく
実際現在の言葉も誤用から生まれた物が腐るほどある
0027デフォルトの名無しさん
NGNGそれが文化の真髄だと思われ
フォーマルなものでなく、自由の元にうまれんだよ
0028デフォルトの名無しさん
NGNG0029デフォルトの名無しさん
NGNG語る前に、言語の変遷を勉強しましょうよ…
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG全然あるとか肯定すると言葉遣いが間違ってるとか言われる
このあたり既に意味が変わったり用法がなくなりつつある
「ふんいき」は「ふいんき」布団を「しく」は布団を「ひく」とか
かなり一般的に誤用されている
平安時代と今で同じ言葉を使っているわけもなく
言葉はこうして変化していくものだが
個人的にはあまり誤用の多い馬鹿には近づきたくないな
0032デフォルトの名無しさん
NGNGSPxとかでかっに組み込まれてるのかもしれませんが
となるとSSEの機能を生かすにはアプリに組み込むしかないんですよね。
0033デフォルトの名無しさん
NGNGアセンブロ
これらは命令形。
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNGどこまでをOS自体のAPIと言うつもりか知らんが、
Directなんちゃらとかサウンド/ビデオコーデックに既に使われとるんじゃないか?
そんなことに関係なくアプリで勝手につかわにゃ生かせないのは同じだがな。
アプリがやりたいことが全部APIに有るわけでもないし。
0036デフォルトの名無しさん
NGNGそれでは明示的にVC6(アセンブラパック適用済)でSSE/SSE2を使うには
インラインアセンブラで書くしかないですよね?
VCがオブジェクトコードとしてSIMD命令やMMXを吐くか?っていうのが聞きたいです。
0037デフォルトの名無しさん
NGNGコンパイラオプションにそういう指定ないの?
なけりゃ吐かないと思う。
0038デフォルトの名無しさん
NGNG組み込み関数やインラインアセンブラで明示的に使用しない限り吐かない
SIMD命令を吐くコンパイラはVectorC{PC}しか知らない
いずれにせよスレ違い
0039デフォルトの名無しさん
NGNG0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNG>>41
( ´_ゝ`)
0043デフォルトの名無しさん
NGNGわけわかめで笑うしかないんですけど、、、、
なぜこんな複雑なんですか?
0044デフォルトの名無しさん
NGNGビヒャ〜ンに聞いとくれ。
0045デフォルトの名無しさん
NGNG探してみたら任意のメモリ間のバイナリ?を表示するのはあったんですけど
本みたいに特定の実行ファイルをDUMPするのはないんですかね。
0046デフォルトの名無しさん
NGNGこんなツールを使えば?
ttp://www.nx.sakura.ne.jp/~elysium/software/pwtr/
ダンプのソースが欲しいなら
http://pc3.2ch.net/test/read.cgi/tech/1009080085/166-168
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGDUMP ファイル名 |MORE
でダメ!?
004945
NGNG使ってみますた。(・∀・)イイですね。
個人的には開始時の女の子の絵が無ければなおいい(w
005045
NGNGできました。こっちのほうが好きかも。
005132
NGNGSSE/mmxはくみこまれてるっぽいです
$ objdump -d KERNEL32.DLL |grep mm
77e54958: 0f 10 11 movups (%ecx),%xmm2
77e91c92: 0f e9 77 0d psubsw 0xd(%edi),%mm6
ただobjdumpがちゃんと逆アセしてるのかは怪しいですが
0052デフォルトの名無しさん
NGNGその作者、技術はあるんだろうけど何かキャラが濃いんだよね
005346
NGNGやれやれ・ オマエラ ほんとニホンジンだねぇ
0054デフォルトの名無しさん
NGNGこっち紹介したらどうなるんだろうな。
0055デフォルトの名無しさん
NGNGカーネルで使われているのはたぶんこの「ページのゼロフィル/コピー」って奴だとおもう
http://pc.watch.impress.co.jp/docs/article/20011024/xp14.jpg
0056デフォルトの名無しさん
NGNGその作者、キャラはいいんだけど何か技術が薄いんだよね
0057デフォルトの名無しさん
NGNGうぉ、情報あるもんですね
できればその絵が使われてるページ教えていただけませんか?
0058デフォルトの名無しさん
NGNG金もないんでDurunにしようと思うんですが
GCC関連のコンパイルとかx86系の学習を考えるとセレの方がいいですかね?
0059デフォルトの名無しさん
NGNGhttp://pc.watch.impress.co.jp/docs/article/20011024/winxp.htm
>>51は命令でないバイナリを無理矢理逆アセしたものだと思う。
SSEが使われているのはNTOSKRNL.EXEの方。
ページのゼロフィル/コピーぐらいにしか使われてないみたいだから、
ほとんど意味ないと思うけど。
0060デフォルトの名無しさん
NGNGpunpcklbw とか変な命令はあるのに。
0061デフォルトの名無しさん
NGNGDuron はもうフェードしてるぞ。
お得な偽皿 XP1700+ にしる。
0062デフォルトの名無しさん
NGNGまんせー
006345
NGNGそこを書き換えようと思いMS-DOSでDUMPしてたんですが
FFFFより上のアドレスの所はいじれなかったです。エラーになっちゃいます。
これが噂の16bitですか?ヽ(`Д´)ノモルァ
0064デフォルトの名無しさん
NGNG適当なバイトコードから、それに対応するインストラクションセットに変換したいとき、
(要するに低機能なdisassemblerを自分で作りたいわけです)
参考にするための資料を教えてもらえませんか?ネットを探しても見当たらなかったので…
よろしくお願いします。
0066デフォルトの名無しさん
NGNGthx!
0067386以降よく判らん…
NGNGxchg [ebp],al
mov [ebp+1],ah
と書いたら不正終了して
mov ah,[ebp]
mov [ebp],ax
に直したら動いたんだが、プロテクトモードの制限か何か?
0068デフォルトの名無しさん
NGNGxchg [ebp],al
mov [ebp+1],ah
と
mov ah,[ebp]
mov [ebp],ax
は、やっている事が全然違うような気がするけれど・・・
前者のebpとalになにが入っていて
どんなメモリマップになっているのかは知りませんけれど
念のためbyte ptr〜とかも指定してみては。。
0069デフォルトの名無しさん
NGNGxchg [ebp],al
mov [ebp+1],ah
と
mov ah,[ebp]
mov [ebp],ax
前者は[ebp]のバイトアドレスに対して
元のaxレジスタの内容が[ebp]、[ebp+1]に入るけれど
後者は結局alの下位バイト分しか入っていないのは・・・よいのかな?
007067
NGNGxchg [ebp],al
mov [ebp+1],al
だった…
[ebp+1]に[ebp]を移して、alを[ebp]に書き込む処理のつもり。
>68
ちなみにNASMはptr/offsetは無いです。
0071デフォルトの名無しさん
NGNGこちらはマシン語直打ち環境だけど・・・とくになんの問題もないですねえ。
864500 xchg byte ptr ss:[ebp], al
884501 mov byte ptr ss:[ebp+1], al
8A6500 mov ah, byte ptr ss:[ebp]
66894500 mov word ptr ss:[ebp], ax
デバッガからもコードを追ってみましたが
まったく異常ないです。
0072デフォルトの名無しさん
NGNGnasm CVS 年末あたりの版をVisualC++6.0SP5+ppのC2.DLLでコンパイルして使っているが特に問題なし
バージョンやオプション特有のバグか、nasm自体のコンパイルに失敗しているのでは?
>>71さんの言うとおりプロテクトモードの制限ではないので
007367
NGNG今タイムスタンプ見たら99/6/4
…………これか原因はw
0074デフォルトの名無しさん
NGNG0075デフォルトの名無しさん
NGNGあったら便利だと思うんですけど…
例1 (コンパイラが良く吐くコード)
sub eax, 1
test eax, eax
jnz short xxx
↓
sub eax, 1
jnz short xxx
例2 (ターゲットにするCPUによって)
xor eax, eax
mov al, bl
↑↓
movzx eax, bl
0076デフォルトの名無しさん
NGNGそれがC/C++コンパイラでしょ?
intelのVTなんたらっていうのとか買うしかないのかな?
コンパイラがあなたが望むアセンブルを出力するとはかぎらないから
アセンブラつかってるんでしょ?
0077デフォルトの名無しさん
NGNGそういうのを作ったら? 単なる置換ツールと考えたらそう難しくないでしょ
パターンデータをこのスレで募集して皆で育てたりしたら面白いかもね。
0078IP記録実験
NGNGhttp://qb.2ch.net/test/read.cgi/accuse/1042013605/
1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0079デフォルトの名無しさん
NGNG0080デフォルトの名無しさん
NGNGやりようによっちゃ匿名にはできるわけで、ただちょっと面倒にはなるけど。
ヌー速の糞スレも減るかもしれないし。
ただ誰がログを読めるのかは知っときたいなあ。
0081デフォルトの名無しさん
NGNG008275
NGNG>コンパイラがあなたが望むアセンブルを出力するとはかぎらないから
そうなんですが、あれば便利だと思って聞いたんですけど
やっぱり無いのかな
>>77
単純なものなら結構簡単に作れそうなんですが
完全にフラグを追いかけたり、命令順を入れ替えたりする事まで考えると
何処から手を付ければ良いのか分からないんですよね…
0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNGIPを保存することで書き込んだ人に
責任を擦り付けられるとでも思ってんのか?
関係無いぜ。
警察の捜査はしやすくなるかもしれんが、公開責任は依然ひろゆき。
いい加減理解しろや。
日本生命の時から言われてるぜ。
判決もこれに沿ったものだったしな。
日本生命
http://www.geocities.co.jp/Technopolis-Mars/6820/hoken/
0085デフォルトの名無しさん
NGNGキャップはどした?
0086デフォルトの名無しさん
NGNGん?
ヅラがどうしたって?
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNGどこの板が取っているの?
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNG自作PC板も誤爆&宣伝がかなり舞い込んでます
0093デフォルトの名無しさん
NGNGって問題じゃないの?
0094デフォルトの名無しさん
NGNG3日で業者のエロいコピペで埋まるのがオチ
0095デフォルトの名無しさん
NGNGばいばい
0096デフォルトの名無しさん
NGNGhttp://www2.ezbbs.net/19/techside/img/1039679575_1.jpg
0097デフォルトの名無しさん
NGNGγ´γ~ \
|∞/ 从从) ) __________
W | |┬ イ |〃 /
ヽリ.ハ~ ワノ <ろりは全員皆殺しだ | ̄| \
| ̄ ̄ ̄ ̄ ̄|〜 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
◎ ̄ ̄ ̄ ̄ ̄◎ ころころ〜
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNG0100デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0101デフォルトの名無しさん
NGNGどう考えても奴らに分があるというか
最終的に骨を断たれるというか
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
NGNGはっきりいってまだ実用レベルとは言い難いが(^^;
0104デフォルトの名無しさん
NGNG0105デフォルトの名無しさん
NGNG0106デフォルトの名無しさん
NGNG0107デフォルトの名無しさん
NGNGhttp://life2.2ch.net/test/read.cgi/offevent/1042037013/
みんなで2ちゃんユニフォームを作ってワショーイしよう!
同じカッコしたちゃねらーで街を埋め尽くそう!
ユニフォーム代はなんと無料です!
↓ここを利用します。
http://www.getuniform.com/
0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNG最近荒らしが酷い
0110デフォルトの名無しさん
NGNG荒らしというより、スクリプトのバグでは?IP実験を始めた途端に他のスレの
書き込みがPC板全般に流れてきてるみたい。
0111デフォルトの名無しさん
NGNGそうなん?そうなら良いが。
0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNGモナーが出演決定!!!!!!!!!!!!!!!!!!!!!
<<放送時間>>
1/12
大阪 テレビ大阪 (日)9:30〜10:00
東京 テレビ東京 (日)9:30〜10:00
名古屋 テレビ愛知 (日)9:30〜10:00
福岡 TVQ九州放送 (日)9:30〜10:00
札幌 テレビ北海道 (日)9:30〜10:00
岡山・高松 テレビせとうち (日)9:30〜10:00
0114デフォルトの名無しさん
NGNGこっち上げるぞ。
0115C++厨
NGNGギャラクシーエンジェルに出たのか?
寝てて見なかったけど
0116デフォルトの名無しさん
NGNG> X86系でアセンブリソースを最適化できるツールて無いですか?
まずないだろうね。
コンパイラが吐くコードを最適化するのは、結局コンパイラが変わったらだめになるし、最近のコンパイラは結構まともなコードを吐くからね。
人間が作成したコードを最適化できるとすばらしいけど、そんな余地はあんまりないだろうからね。
(余地がいっぱいあるぐらいなら、アセンブラなんか使わんだろうし。)
0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNG# ちと煽り過ぎたかなとも反省。
で、質問。
今後起こりうる裁判と切り分ける部分って具体的にはどのヘンなのでしょうか?
0119デフォルトの名無しさん
NGNGまぁ 火曜日までには、
0120デフォルトの名無しさん
NGNG出てないよ。
というか、その荒らしにはもう辟易...。
0121デフォルトの名無しさん
NGNGV-syncとれとか、割り込みコントローラいじれとか
ゲーム作れと言わんばかりの内容なのな。
俺の読み方が偏ってるせいもあるかもしらんけど
0122DDKインストールできなかった( -.-)
NGNGプッププップ、ビープ音が鳴って...
MS社に嫌われた。
0123デフォルトの名無しさん
NGNG0124DDKインストールできなかった( -.-)
NGNG0125デフォルトの名無しさん
NGNGMSからは落とせなくなってるんでし
0126DDKインストールできなかった( -.-)
NGNGttp://www.microsoft.com/ddk/
のぺーじの
ttp://www.microsoft.com/ddk/W2kDDK.asp
のあたり。
インストールできたらおしえてちょ。
0127山崎渉
NGNG0128DDKインストールできなかった( -.-)
NGNGどうも、私のデュアルマシンは駄目なようです。
0129デフォルトの名無しさん
NGNG0130山崎渉
NGNG0131デフォルトの名無しさん
NGNGNASM一択なの?
0132デフォルトの名無しさん
NGNG0133デフォルトの名無しさん
NGNG俺は VC++6.0 のインラインアセンブラだyo
0134デフォルトの名無しさん
NGNGで、Cみたいに可搬性を考えなくていいから、最初の引数はEAXで次はEDX
と決まってるし(もちろん cdecl にすればスタックフレームも使える)
Delphiで書いてDLL作れば他からも呼べて、ホンモノのアセンブラより
そこらへんは楽
0135デフォルトの名無しさん
NGNGスタックが最低40byteないとバグるっぽいです。
スタックを使わない小さなプログラムでもこれ以下だと暴走するっす。
以上、報告終わり。
0136デフォルトの名無しさん
NGNGGNU as + gasp
必要に応じて、その上に gcc とか vcl が被る。
0137デフォルトの名無しさん
NGNG32ビットならNWSA
16ビットならLSICに付属のやつ(正式名は何なのだろうか)
0138デフォルトの名無しさん
NGNG漏れは MASM だが。
0139デフォルトの名無しさん
NGNG昔 wasm + Watcom C/C++
今 Digital Mars C/C++ のインラインアセンブラ
0140デフォルトの名無しさん
NGNGに倍精度浮動小数点が渡るんですよね。それで、CMPSDを使って比較をした
後、結果の使い方がわかりません。
結果はディスティネーション・オペランドの下位64ビットに返るわけですが、
それを使って分岐させる方法がわからないのです。
どなたか御指南くださいませ。
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNGxmmレジスタに戻ってきた値にかけ算して足し算するという事でしょうか?
0143デフォルトの名無しさん
NGNG計算結果が二通りあって、それらをある条件で切り替える場合、
・条件の値を0 or 1に変換する
・二通りとも計算する(SIMDの並列性を生かせるとgood)
最後に
(条件値) * (結果1) + (1-条件値) * (結果2)
を計算すると、望みの結果が得られるという話。
条件値を0 or -1(0xffffffff)にして、
掛け算をbit-andに、足し算をbit-orにするという方法もあるよん。
SSE2見てないからよくわからんが、MMXのころはこうだった。
0144デフォルトの名無しさん
NGNGなるほど、ありがとうございます。やってみます。
0145デフォルトの名無しさん
NGNG普通の分岐をしたいのであれば
CMPSDではなくCOMISDを使うとかそういうことではなくって??
0146デフォルトの名無しさん
NGNGそうです!この命令を探していました。ありがとうございます。
COMISDというのか。SSE2命令はどうもニーモニックが紛らわしくて。
0147デフォルトの名無しさん
NGNG思うに、XXX.exeが作成されるとAPIコールするという
命令?が羅列されているのでしょうか?
また、DLLを参照するようなプログラムはDLL参照命令があると想像します
ちなみにネイティブコードとはCPUに依存するというよりOSに依存するという意味で正しいですよね?
0148デフォルトの名無しさん
NGNGプログラミング暦をちょっと語ってみ。
0149デフォルトの名無しさん
NGNG書店に行って Linkers & Loader 買ってきて読め。もし読んでも意味が分からないなら、
その前に勉強することがあるってコトだ。
0150デフォルトの名無しさん
NGNG学生でホビーでプログラムを楽しんでます^^;
まともなプログラムはつくったことがありません><
オープン系といいますか制御、ネット、WEB、DB系のプログラムを
ちょこっとだけ組んでます、、
C言語MASMで組み込んでやったのですがいまいち理解できません
なんでも少しだけかじってます
0151147
NGNG英語で書いてなかったらがんばってみます
かなり古いのでしょうか、大きな書店にあるか見てみます
0152デフォルトの名無しさん
NGNG>>147は、ほぼ全面的に間違えています
1から出直しましょう
0153147
NGNGもしよかったら専門用語でもよいので2,3行で教えてください
0154デフォルトの名無しさん
NGNG0155147
NGNG0156デフォルトの名無しさん
NGNGDOSやUNIX系
0157デフォルトの名無しさん
NGNGDLLについてはWindowsのほうがスッキリしているかもしれない...
0158147
NGNGタスク制御?
ヒントをきぼん
一応OSの概要を理解しているつもりだったんだけど
だれかリヌのカーネル程度を組めるひといるんだろうか?
0159147
NGNGコンパイラを調べたほうがいいのかな?
スタティックリンクしてるときはどーしても相対アドレスにCPUが理解できる
命令がはいっているとしか思えない
DLLリンクは特定のシステムコールエリアを利用しているとしか思えない
ほんとに全然ちがう?
0160デフォルトの名無しさん
NGNGあんまりいないと思う
0161デフォルトの名無しさん
NGNGしかし「充実したドキュメント」とやらら信用できるかというと、イマイチ…
個人的には man page の section 9 が充実してる NetBSD を推すが、147 は
それ以前に MINIX 本でも読んだ方が良いと思われ。タネンバウム先生の
「オペレーティングシステム」って本な。
0162157
NGNG0163デフォルトの名無しさん
NGNG分かりやすい煽りだな(w
0164デフォルトの名無しさん
NGNG参考にするソースは何が良いですか?やっぱりNASMのソースコード?
0165デフォルトの名無しさん
NGNGまづは、四則演算をさせらる所からどうぞ
字句解析->構文解析->ラベル解決->配置 みたいな流れを意識しておいた方がいいよ
0166山崎渉
NGNG0167デフォルトの名無しさん
NGNGデバッグレジスタの内容も退避しますか?
0168デフォルトの名無しさん
NGNGまっとうなマルチタスクOSなら。
i386系でのFPUレジスタの退避はちと違う。
0169デフォルトの名無しさん
NGNG0170にゃん
NGNG手に入れられるんでしょう?
0171デフォルトの名無しさん
NGNGフリーのアセンブラで互換性の高いのなんかあったよね。
0172デフォルトの名無しさん
NGNGttp://www.movsd.com/
でもこれ
> The assembler, linker and some other binary file are the property of
> the Microsoft Corporation and are supplied under the conditions of
> the (EULA) End User Licence Agreements for both the WIN98DDK
> and the PLATFORMSDK.
なんて書いてあるけど、大丈夫なのかな?
0173デフォルトの名無しさん
NGNGEndUserライセンスと再配布ライセンスを混同した屁理屈
DDKのLICENSE.TXTにサンプルコード以外の扱いが書いていなかったので
都合のいいように解釈して配布しているもよう
大丈夫か否かはマイクロソフトの意向次第だが
敢えてほとんど黒な灰色のものを使う意義は感じられない
0174173
NGNG98DDKの場合10copiesライセンスなのでやっぱり駄目らしい
0175にゃん
NGNGMASM32 is not intended as a programming beginners package,
it is squarely aimed at experienced programmers who are
familiar with windows API programming with compilers and
have done some work in assembler. The package assumes that
the programmer already knows enough to start working in
assembler and is designed with this level in mind. Any
programmer is welcome to use MASM32 but unless they have
the experience level that is assumed in the design of MASM32,
concepts like register sizes to data types, register usage,
assembler mnemonics, API calls, calling conventions and other
similar technical data will be very difficult to grasp.
Programming beginners are better served by learning a higher
level language first and when they are familiar enough with
the technical concepts involved, they can come back to
assembler later.
0176にゃん
NGNG0177デフォルトの名無しさん
NGNG0178デフォルトの名無しさん
NGNG# 使ったことないけど MASM互換って書いてあるし。
ttp://hp.vector.co.jp/authors/VA007890/dos/language.html
そういえば OpenWatcom に付属のwasmもMASM互換だったはず。
これなら 16bit DOS から Win32 までM$系は一通り対応している。
コマンドラインの文法にかなり癖があるのが難点だが。
0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNGあったでー、互換アセンブラ
http://www.vector.co.jp/soft/win95/prog/se183316.html?y
0181デフォルトの名無しさん
NGNGそれはWindows用
今ならやっぱりOpenWatcomかな
http://www.openwatcom.org/
0182デフォルトの名無しさん
NGNG0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNG汎用レジスタとの値の交換や演算は一切できません
0185デフォルトの名無しさん
NGNG64ビット系ではR8〜R15なるレジスタが増えてるラスィので、
早くそれが普通に使える時代になってホスィ。
0186デフォルトの名無しさん
NGNGそれぐらいなら、CPU と非同期に動く DMA 使った方が。
0187デフォルトの名無しさん
NGNG青マニュアル。
0189デフォルトの名無しさん
NGNGまあ、Mシリーズ (今は、MPxxxx か...) がそこら辺のヤ○ダ電気とかじゃ売ってないからね。
今からMシリーズ買うんなら、日立の営業に電話して「Mシリーズ買うから青マニュアルちょうだい」と言えば OK
どっかにある、Mシリーズ使うなら、そこの運用管理担当者に聞いてみな。
0190183
NGNG職場の倉庫みたいなところを探せばMシリーズの機械命令のマニュアルとかあると思うんですけど、
一人で占有するわけにも行かないので、手軽に入門的なことだけでも分かる本があればいいと思ったんです。
営業に電話するって、汎用機のマニュアルなんて個人で入手できるんですか?
0191デフォルトの名無しさん
NGNGfor(i=0,SUM=0;i<N;i++)
SUM=SUM+A[i]*B[i];
0192デフォルトの名無しさん
NGNGgcc とかで出力見れば?
0193デフォルトの名無しさん
NGNG切れ味のいいエレガントな回答にちょっと萌えた。
0194デフォルトの名無しさん
NGNGsegment _TEXT use32 public class=CODE align=4096
global ADD1
ADD1:
add eax, edx
ret
export ADD1
..start:
global DllEntryPoint
DllEntryPoint:
mov eax, 1
ret 12
>nasmw -fobj dll_test.nas
は問題ないのですが
>ilink32 /Tpd dll_test, dll_test.dll
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (IMP829)
Fatal:
Warning: インクリメンタル リンクできません。リンクをやり直します
Fatal: Error detected (IMP829)
Fatal:
なんでー?
(ALINKを用いると普通にdllができたので、ますます何が悪いのかわかりません)
0195194
NGNG0196デフォルトの名無しさん
NGNGcpl = 0 -> cpl 3の切り替えをiretlでやろうと思って、
stackframe : %esp -> %eip
%cs
%eflags
%esp
%ss
これをbochs上でやると
00003160446i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00003160446i[CPU ] | DS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | ES:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | FS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | GS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | SS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | CS:0023( 0004| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | EIP=00100404 (00100404)
00003160446i[CPU ] | CR0=0x00000011 CR1=0x00000000 CR2=0x00000000
00003160446i[CPU ] | CR3=0x00000000 CR4=0x00000000
00003160446i[CPU ] -----------------------------------
00003160446p[CPU ] >>PANIC<< exception(): 3rd (10) exception with no resolution
こんな感じで止まります。
ちなみに割り込みから呼び出してるわけではありません。
参考となる情報があったら教えてください。
0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNGexportは使い方が特殊なので
defファイルで指定したほうが簡単です
>>196
Gフラグが立っているので問題ないのかもしれませんが
一見した所、eipがcsのlimitを越えているように見えます
0199デフォルトの名無しさん
NGNGすいませんでした、ちょっと離れていたので。
このプログラム、a20を有効にした後、1Mbyte以上の領域に転送してから、
しばらくcpl0で実行した後なんですが、
いきなりリミットの制限にひっかかることもあるのでしょうか。
もちろん記述子はcpl0用のと変わらずに、
リミットはフラットモデルに従っていて、dplが違うだけです。
0201194
NGNGありがとうございます。.defファイルを書くことで成功しました。
ilink32は、align=4096を理解してくれるようです。
でも、おっしゃる通りnasmのドキュメントに4096は拡張と書いてあったので、今後256を使います。
しかし今度はALINKでリンクできない…(苦笑)…ソースを共通にすることは無理か…。
不思議なのは、Cで__declspec(dllexport)のように書いて、-Sでアセンブリソースを出力させてみると
その中でエクスポートしている=エクスポート情報が.objに埋めこまれている、ように見えることです。
ALINKがnasmと相性がいいように、ilink32はTASMと相性がいいのかな。
0202Leliel(れりえる)
NGNG問題ないでしょうか?
この手のソフトで、パス内にスペースがあると正常動作しないものもあると聞いたもので...
展開先 : C:\Program Files\NASM
PATH(AUTOEXEC.BAT) : C:\Program Files\NASM
すいませんが、何方かご教授お願いします。
0203デフォルトの名無しさん
NGNGadc命令のようにキャリー分を足してくれる命令ってないんだ?
使えねー
0204デフォルトの名無しさん
NGNGNASMは知らんが普通
"C:\Program Files\NASM"
とするもんじゃないかな。
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNG多分
0207Leliel(れりえる)
NGNGとりあえずやってみますね。
0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNGpusha
mov dx, line
mov ah, 09h
int 21h
popa
ret
line: db '----$'
0210デフォルトの名無しさん
NGNGpush y1
push x1
push hdc
call dword ptr MoveToEx
push y2
push x2
push hdc
call dword ptr LineTo
add esp, 4 * 7
ret
0211デフォルトの名無しさん
NGNGある整数を、4の倍数に切り上げたい。
しかも、元との差分を最も小さくしたい。
これを早く計算したい時は
どうすればいいですか?
自分は
int x; // <- target
// as follows...
x *= 3;
x += (4 - (x & 03)) & 03;
と書いたのですが…
0212デフォルトの名無しさん
NGNGまちがえました(x *= 3のところはなし)
こう書きました
int x; // <- target
// as follows...
x += (4 - (x & 03)) & 03;
0213デフォルトの名無しさん
NGNG最速という保証は全く無し
0214デフォルトの名無しさん
NGNGそんなときこそアセンブラを・・
0215デフォルトの名無しさん
NGNG> しかも、元との差分を最も小さくしたい。
そりゃ切り上げじゃなくて四捨五入?なんでは
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNG0219デフォルトの名無しさん
NGNGそれは一捨二入
0220デフォルトの名無しさん
NGNG>>211がやりたいのはそれに見えるが・・・
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNG>>211の式ではx=1の時の結果は4ではないかい?
> しかも、元との差分を最も小さくしたい。
これが意味不明だが、1を8や12にするなという事かな
0224デフォルトの名無しさん
NGNG4 バイト境界に合わせたりしたいんだろ?
0225デフォルトの名無しさん
NGNG0→0
1→0
2→4
3→4
になりそうな気がする(これは>>218の式)
0226デフォルトの名無しさん
NGNGでもそれでは”切り上げて”いる事にはならない。
0227デフォルトの名無しさん
NGNG俺もそれであってると思う
0228デフォルトの名無しさん
NGNGワラタ
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG曖昧な仕様に翻弄されてる典型。
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG前までMSのサイトで見つかったんですけど…。
今見つからないんです、教えてください。
0234211
NGNG日本語へんですみませんでした
>>213
>x = (x + 3) & ~3;
これ、いいですね
さっそく使わせていただきます
>>214
>コンパイラによる
>そんなときこそアセンブラを・・
ちなみにアセンブラだと
どうなるのでしょうか?
>>218
>x = (x+2) & ~3
これ、213と違うのですがなぜですか?
>>221,>>222
>ここは、アルゴリズムスレでしか?
>日本語解読スレです
すみません…
0235211
NGNG>これが意味不明だが、1を8や12にするなという事かな
はいそうです
つまり、もし増えるとしたら+1/+2/+3の
どれかにしたかったのです
>>224
>よーするに、四捨五入ではなくて、メモリアドレスかなんかを
>4 バイト境界に合わせたりしたいんだろ?
はいそうです
ビットマップです
>>226
>でもそれでは”切り上げて”いる事にはならない。
”切り上げて”にはゼロは含まれていなかったんですね
以下とか未満みたいに難しいです
ごめんなさい…
>>231
>曖昧な仕様に翻弄されてる典型。
ほんとにすみません…
0236デフォルトの名無しさん
NGNGinc.l ER6
inc.l ER6 ;この3行はmov.l #3,ER5、addl.ER5,ER6より小さく速い
inc.l ER6
and.b #4,R6L で済む。
cで213の展開型は
mov.b #3,R5L
extu.w R5
exts.l ER5
add.l ER5,ER6
add.l #1,ER5
and.l ER5,ER6 この辺がコンパイラが出せる最小の命令です
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG0239211
NGNGアセンブラってよくわかんないけど…
incってincrement?
andってビットのアンド?
後についた.bってもしかしてbitのこと?
ファイルの拡張子(.exeとか)みたいだ
いかにも3足してマスクみたいだ…
extu.wとかextsとかがある下の方は
さっぱりわからんです
>>234
>ちなみにアセンブラだと
>どうなるのでしょうか?
興味本位で聞いたのですが…
興味だけで聞いてもやっぱり
アセンブラはよくわからない
みなさんすごいですね
0240211
NGNG>inc.l ER6
>inc.l ER6 ;この3行はmov.l #3,ER5、addl.ER5,ER6より小さく速い
>inc.l ER6
これって
x += 3;
より
++x;
++x;
++x;
の方がはやいということ?
なんか意外だ…
0241デフォルトの名無しさん
NGNG236のはH8では、ということなので、他のCPUでは
そうとは限らない。
0242デフォルトの名無しさん
NGNGいまいちその効力が分からないのですが、、、
0243デフォルトの名無しさん
NGNGシフトをすることなんかあるのくわ?
0244デフォルトの名無しさん
NGNGあるのでは
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNGアドレスレジスタに対して直接演算する命令がadda, subaしかないのも、
アドレス値に対して加減算以外の演算をすることはまずないだろうと
いうことなのでは。
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNG各セクションを配置する際にアラインメントを指定通りにしてあげ
ないといけないので、それでやったぐらいかな・・
0249デフォルトの名無しさん
NGNGleaも加減算に使えるぞw
0250デフォルトの名無しさん
NGNGそれは例えば、上位10ビットをインデックスのように
使うということでしょうか?それに対する加減算する
ために、アドレスをシフトするというか。。。
0251デフォルトの名無しさん
NGNG上位というか、どこか一部分だろうねえ。
0252デフォルトの名無しさん
NGNGttp://pc3.2ch.net/tech/kako/1016/10169/1016991911.html
0253デフォルトの名無しさん
NGNGstruct a {
int i
char c
} v;
という構造体があって、
v->i = 4660 //0x1234
v->c = 'm' //0x6d
などという処理をする場合、一般にアセンブリ言語ではどのように記述するのでしょうか?
#最近高級言語のソースを見てると、内部的にどうなっているのかが気になってしょうがない・・・。もしかして毒されてる?
0254253
NGNGv->c = 'm'; //0x6d
(´・ω・`)でした。
0255デフォルトの名無しさん
NGNG構造体のメンバアクセスはベースレジスタ+インデックス指定
でいいんじゃないかな。
0256253
NGNGレスありがとう。
例えば二次元配列では、「ベースポインタ+(行サイズ*行添え字)+列添え字」
でそれぞれを引数として渡してやれば、要素のアドレスが得られると思うんですけど
構造体は各々の要素サイズが不定じゃないですか。
要素サイズをどこかに格納しておかなければならないのかな?
0257デフォルトの名無しさん
NGNG構造体の先頭から各要素のアドレスへのオフセットを
「定数」として定義すればよいです。
0259デフォルトの名無しさん
NGNGSTLのスタックみたいな感じと思って(・∀・)イイ?
0260デフォルトの名無しさん
NGNGLIFO型のバッファなので概念的には似てるけど、中身は当然別物。
スタック領域とpush, pop時に使用するスタックポインタがあるだけなので、
push, pop以外にランダムアクセスだってできる。
また、データの一時的バッファとして使用される以外に、
サブルーチンコールの際の戻り先アドレスや引数を格納したり、
自動変数領域として使われたりもする。
0261デフォルトの名無しさん
NGNG使える値も0〜255ということになりますか?
0262デフォルトの名無しさん
NGNG処理速度の差はありますか?
それから以下のコードで
**Error** div2.ASM(32) Operand types do not match
が出るのですが…どうしてですか?
0263262
NGNG#include <iostream>
template<typename T>
inline int f(T t) { return static_cast<int>(t); }
template<>
inline int f(int t) { return t; }
int main()
{
typedef char NumType;
volatile NumType x = 17;
volatile NumType y = 5;
NumType q, r;
_asm {
xor edx, edx
mov eax, x
div y
mov q, eax
mov r, edx
}
std::cout << f(x) << " / " << f(y) << " = " << f(q) << "..." << f(r) << '\n';
return(0);
}
0265デフォルトの名無しさん
NGNGスピードは小さい方が速い。
エラーは読んだとおりだが。
movのオペランドのサイズ一致してない。
マシン語に暗黙のキャストなんかないからな。
alにmovするかmovzxとかつかう。
それよりもdivの使い方調べした方がいいんじゃね?
ついでにidivも調べとけ。
0266262
NGNG> スピードは小さい方が速い。
そうですかなるほどなるほど。
> alにmovするかmovzxとかつかう。
> それよりもdivの使い方調べした方がいいんじゃね?
> ついでにidivも調べとけ。
アセンブラはわからないのです
これもCマガ2001年10月の記事を
みて便利そうだなとテストしていたのです
どこで調べたらいいのでしょうか…
あとNumTypeをintにして-Sでアセンブラコードを
出力したらcdqとかidivとか出てきたんですが
これは何をしているのですか?
0267デフォルトの名無しさん
NGNG符号付きと符号無しで命令が違う。
div=符号無し
idiv=符号付き
コンパイラが勝手にやってくれることをアセンブラでは自分でやらなきゃいかん。
それとバイトで割りたかったら、被除数はax ah=余り al=商
cdqはeaxの値をedx:eaxのクワッドワードに変換する。
ナゼかというと、32ビットで割るときは被除数がedx:eaxになるから。
0268262
NGNG検索して勉強しました(すこしだけど)
難しいイメージがあんなにもあったのに
どうしてもやりたい欲望があったせいか
なんとかはじめることができました
すごくうれしい!
感謝です
変更したところは
_asm {
xor ah, ah // (1)
mov al, x // (2)
div y
mov q, al
mov r, ah
}
です
divとidivの違いもわかりました(テストで正どうしなのでdivにした)
cdqも意味もわかりました
除算の注意点もしりました
・ゼロで割るな
・結果が格納されるレジスタをこえるな
・割る値を直接かけない(レジスタに入れてから割る)
0269262
NGNGmov ax, x
とだけ書いていたのですがまたOperand types...
というエラーが出て悩みました
(1byte除算なのでaxレジスタにいれているのになぜ)
ログをもう一度よんだら「alにmovする…」とあった
のでこうしました。
もしかして(1)は不要ですか?
(このテストでは不要だが普段は必要とか?)
あとmovzxとは?説明をみつけれなかった…
ほかにコンパイラにアセンブラコードを
吐かせるとmovszとかもよくみるし…
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGmov ax, word ptr x
と書けばいいじゃん。
0272デフォルトの名無しさん
NGNGmovzx ax, x (xがcharの場合) でもいい。
0273デフォルトの名無しさん
NGNG「現在のアドレスの-128〜+127番地以内」
とかいうのがわかりません。
たとえば
mov ecx,dword ptr [eax]
のサイズはいくらですか?
それから
@2:
mov ecx,dword ptr [eax]
and ecx,-16843010
shr ecx,1
mov dword ptr [eax],ecx
add eax,4
cmp edx,eax
jne short @2
@3:
の@2〜@3のサイズはいくらですか?
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG気にするな。
shortで届かなかったらアセンブル時にエラー出るから判る。
というか、今時shortとか指定しない。
386以降では条件ジャンプのロング版があるから、ショートジャンプが届かなかったら勝手にロングジャンプにアセンブルされるだろ。
0276273
NGNG>というか、今時shortとか指定しない。
ここ以下がよくわからなかったです
私はbcc32(tasm32)をつかっています
-Sでアセンブルコードを出力すると
よくshortが付いているのですが、
私が_asm{}のなかで
je END としても je short END とは
勝手にしてくれませんでした…
shortを付けないと速度で損をしますか?
それから、なんだかアセンブラに
慣れてきた気もするので、C/C++で
書いたコード(昔の私のコード)と
速度の比較をしたいのですが…
どうやって計測すれば
いいのでしょうか?
ハァハァしたい…
0277デフォルトの名無しさん
NGNGそういう最適化は普通はしてくれんだろう。
0278デフォルトの名無しさん
NGNG超タイトなループでかつ運が悪いと損するかもしれないけど
普通はデコードステージで隠されちゃうから見えないと思う
0279デフォルトの名無しさん
NGNG> いいのでしょうか?
> ハァハァしたい…
1000回とか100万回とか適当な回数ループさせて
CPU時間を計測するテストプログラムを書くとか。
0280デフォルトの名無しさん
NGNGtimeGetTime()またはQueryPerformanceCounter()
0281デフォルトの名無しさん
NGNGtasmなんかはやってくれるよ。
0282デフォルトの名無しさん
NGNGP5以降ならrdtsc命令を使うとか。
但し最近のCPUでは先にCPUIDとか呼んでおかないと、
結果がパイプラインの状態に左右されるよ。
それよか計測部を数千回呼ぶ方が面倒がなくていいかも。
0283デフォルトの名無しさん
NGNG命令的には386からP6(PenIIIもだ)まで実行時間は同じはずだ。
もっとも、命令単体で速いからと言って、全体で速くなるとも限らない。
速いはずの命令使ったら、そのほうが遅いこともよくある。
命令を選ぶには、アドレス配置とか、キャッシュがどうとか、P5なら命令のペアリング、P6ならマイクロ命令数とかCPUのパイプラインの状態まで考えないとダメ。
ハァハァしたかったらまずループアンロールくらいしろ。
そうしないとコンパイラに負けるぞ。というか、こういう単純な処理で勝つことの方が難しい。
>>277
MASM6でもやってくれるよ。
やらないのはインラインだからか?
TCは常時TASM呼び出しだったが、BCは一応内蔵したんでTASM呼び出しオプションがあったんじゃなかったっけ?
使ってないのでうろ覚えでスマソ。
0284デフォルトの名無しさん
NGNG普通は1パスだから、やってくれないけど。
0285276
NGNGいや、さ、はかる前から体感できなかったけど…
何が悪いかわからん!教えてください。
目的:
__unsigned int64が、32bitレジスタを2つ使って
処理しているようなので、64bitレジスタを1つ
使って処理しようとした(その方が速いと思った)
元のコード:
void
f0(unsigned __int64 *p, unsigned __int64 *pend, char s8,
LARGE_INTEGER *li0, LARGE_INTEGER *li1)
{
QueryPerformanceCounter(li0);
for ( ; p != pend ; ++p ) *p = ((*p) & 0xfefefefefefefefe) >> 1;
if ( s8 ) {
unsigned int *q = (unsigned int*)p;
*q = ((*q) & 0xfefefefe) >> 1;
}
QueryPerformanceCounter(li1);
}
0286277
NGNGvoid
f1(unsigned __int64 *p, unsigned __int64 *pend, char s8,
LARGE_INTEGER *li0, LARGE_INTEGER *li1)
{
QueryPerformanceCounter(li0);
_asm {
mov ecx, -16843010 /* fefefefe */
movd mm1, ecx
punpckldq mm1, mm1 /* fefefefe fefefefe */
mov eax, p
mov edx, pend
LOOP1: /* eax=p, ecx=mask1, edx=pend, mm1=mask2 */
movq mm0, [eax]
pand mm0, mm1
psrlq mm0, 1
movq [eax], mm0
0287277
NGNGmovq [eax], mm0 /* (1/3)の最後 */
add eax, 8
cmp edx, eax
jne short LOOP1
emms
0288277
NGNGemms /* (2/3)の最後 */
/* fraction */
cmp s8, 0
je short END
mov edx, [eax]
and edx, ecx
shr edx, 1
mov [eax], edx
END:
} /* end _asm */
QueryPerformanceCounter(li1);
}
0289デフォルトの名無しさん
NGNGアドレスが8byte alignしてないと怒られるかペナルティかあったような。
あと283の言うようにループをアンロールして複数要素を順次処理する
ようにしないと勝てないぞ。具体的には
| data[i]:read data[i]:calc data[i]:write |
| data[i+1]:read data[i+1]:calc data[i+1]:write |
みたいにオーバーラップさせる。
ただ、演算内容が単純だとメモリのread/writeのバンド幅で処理時間が
決まってしまう。この例(andとshiftだけ)はまさにそれに該当する。
ハァハァするのは難しいかも。
0290デフォルトの名無しさん
NGNGP4 2.8Gでやってみた。
データ数=500000
BCB 5.6
func1 = 23464
func2 = 15576
VC7
func1 = 23335
func2 = 15316
十分速くなってるよ。CPUにもよりそうだね。
0291デフォルトの名無しさん
NGNGま、関数の外で失敗している可能性もある。
しかし、ソフトウエアパイプラインすればまだ速くなる可能性があるのは明らか。
とりあえずmmxレジスタを全部使って書いてみることを勧める。
面白そうだからそのコンパイル可能なソースくれ。>>290
0292デフォルトの名無しさん
NGNG#include <windows.h>
#include <iostream>
#define SIZE 500000
void func1(unsigned __int64* p, unsigned __int64* pend, char s8)
{
for (; p != pend; ++p) *p = ((*p) & 0xfefefefefefefefe) >> 1;
if (s8) {
unsigned int* q = reinterpret_cast<unsigned int*>(p);
*q = ((*q) & 0xfefefefe) >> 1;
}
}
void func2(unsigned __int64* p, unsigned __int64* pend, char s8)
{
_asm {
mov ecx, -16843010 /* fefefefe */
movd mm1, ecx
punpckldq mm1, mm1 /* fefefefe fefefefe */
mov eax, p
mov edx, pend
0293デフォルトの名無しさん
NGNGmovq mm0, [eax]
pand mm0, mm1
psrlq mm0, 1
movq [eax], mm0
add eax, 8
cmp edx, eax
jne LOOP1
emms
/* fraction */
cmp s8, 0
je END
mov edx, [eax]
and edx, ecx
shr edx, 1
mov [eax], edx
END:
} /* end _asm */
}
0294デフォルトの名無しさん
NGNG{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;
hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);
Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
func(p1, p2, c);
QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);
return (int)(end - start);
}
int main()
{
unsigned __int64* p1 = new unsigned __int64[SIZE];
unsigned __int64* p2 = p1 + SIZE;
char c = 0xff;
std::cout << "func1 = " << prof(func1, p1, p2, c) << std::endl;
std::cout << "func2 = " << prof(func2, p1, p2, c) << std::endl;
}
0295デフォルトの名無しさん
NGNGくださったものをそのまま流用しています。コピペで簡単に
ベンチマークできるのでとても重宝しています。
0296288
NGNGなかからそれっぽいところを書きます
モバイルPentium2(233MHz)
メモリ64MB(SDRAM SO-DIMM)
増設したメモリ64MB
0297288
NGNG私のだと
func1 = 68498
func2 = 69137
でした
あと私のテストコード
#include <windows.h>
#include <stdio.h>
extern void f0(unsigned __int64 *, unsigned __int64 *, char,
LARGE_INTEGER *, LARGE_INTEGER *);
extern void f1(unsigned __int64 *, unsigned __int64 *, char,
LARGE_INTEGER *, LARGE_INTEGER *);
int
main(int argc, char* argv[]) /* ./abc in.bmp out.bmp 0 */
0298288
NGNG{
HANDLE hf, hh;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
DWORD bfhsize, bihsize, hhsize, dw;
unsigned __int64 *buf;
LARGE_INTEGER li0, li1;
if ( (argc < 4) || (! lstrcmp(argv[1], argv[2])) ) return(1);
hf = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ReadFile(hf, &bfh, sizeof(bfh), &bfhsize, 0);
ReadFile(hf, &bih, sizeof(bih), &bihsize, 0);
hh = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
hhsize = bfh.bfSize - (bfhsize + bihsize);
buf = (unsigned __int64 *)HeapAlloc(hh, HEAP_NO_SERIALIZE, hhsize);
printf("(%d, %d, %d) = %d\n",
bih.biWidth, bih.biHeight, bih.biBitCount, hhsize);
if ( bih.biBitCount != 24 ) return(2);
ReadFile(hf, buf, hhsize, &dw, 0);
CloseHandle(hf);
0299288
NGNGif ( argv[3][0] == '0' ) {
f0(buf, buf + (hhsize >> 3), hhsize & 7, &li0, &li1);
}
else {
f1(buf, buf + (hhsize >> 3), hhsize & 7, &li0, &li1);
}
hf = CreateFile(argv[2], GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(hf, &bfh, bfhsize, &dw, 0);
WriteFile(hf, &bih, bihsize, &dw, 0);
WriteFile(hf, buf, hhsize, &dw, 0);
HeapDestroy(hh);
CloseHandle(hf);
printf("%d\n", li1.QuadPart - li0.QuadPart);
return(0);
}
0300デフォルトの名無しさん
NGNG倉木麻衣の壁紙で実行。
P4 2.8G MEM1G WinXP Pro SP1
-- f0 --
(1024, 768, 24) = 2359296
9560
-- f1 --
(1024, 768, 24) = 2359296
9009
サイズが小さいとあまり効果が出なかった。
次に松浦亜弥の大きめの壁紙で実行。
-- f0 --
(2536, 3492, 24) = 26567136
137591
-- f1 --
(2536, 3492, 24) = 26567136
150749
おやおや、遅くなってしまった。多分倉木麻衣の壁紙の方も測定誤差だろう。
0301トリッキー2の129
NGNG漏れです。使ってくれてありがとう(^д^)
0302デフォルトの名無しさん
NGNGこちらこそありがとう感謝してます。
もちろん商用には使いませんのでご安心を。
0303デフォルトの名無しさん
NGNG(日本語)があったと思うんだけど、アドレス無くしました・・
検索でも拾えません・・
どなたかアドレス教えてください一生のお願いです
0304デフォルトの名無しさん
NGNGhttp://www.bekkoame.ne.jp/~yardserv/arm/archit/armarchit.htm
0305デフォルトの名無しさん
NGNGそれから>>11以外にも良いサイトがあったら教えてくだちい
0306デフォルトの名無しさん
NGNGx86を少し触ってTK85弄ってx86に帰ってきた。
0307デフォルトの名無しさん
NGNGZ80 (PC-8801)
->8086 (PC-9801)
->会社オリジナルの変なCPU1 (8bit)
->会社オリジナルの変なCPU2 (8bit)
->会社オリジナルの変なCPU3 (24bit)
->会社のセミカスタムx86互換CPU1
->会社のセミカスタムx86互換CPU2
->会社のセミカスタムSH3互換CPU
一番いやだったのは、会社オリジナルの変なCPU3かな。
24bitつーても、アーキテクチャがマイコンとは言い難い
ブツだったのでいろんな意味で特殊だったなぁ。PICがかわ
いく見える。
あと、趣味でPIC,AVRなんかも使ってまつ。
0308デフォルトの名無しさん
NGNGZ80→8086→SC62015→68000→日立の4bit→H8→SH→SX28→8086→H8
なんか抜けてる様な気もするが…こんな感じ。
ちなみにZ80/SC62015/日立4bit/SX28は忘れかけてる。
まー使うこともないだろう。
0309デフォルトの名無しさん
NGNGかなあ。68000は見ただけ。
0310デフォルトの名無しさん
NGNGVLIWは性能出すのにかなり疲れた記憶があるなあ
0311デフォルトの名無しさん
NGNG英語だがPC Assemblerというのが32bitのx86ではいい感じだった。
0312デフォルトの名無しさん
NGNGi8751 M68020 Z80 H8/532 三菱50747 NEC75008 三菱3825 H8/338 三菱3825
H8/3434 NEC784031Y H8/3007 Ti/C54x H8/SH2 NEC78C17 H8/SH7050 NEC789026
石のマニュアルのどこ見れば仕事ができるかつきとめるのが速くなったなあ。
0313デフォルトの名無しさん
NGNG次はTLCS-900あたりを使って、国産ワンチップを制覇して下さい。
0314デフォルトの名無しさん
NGNGz80/6802/6501 → 6809/8086 → 6301
→ 68000/(DSP みたいな独自プロセサ)
→ 80186/68020 → SH-1 → SH-2 → Pentium
会社で作った独自プロセサは ECL-10K でサイクルタイム 33ns
が目いっぱいだった。今なら、FPGA で...。
0315デフォルトの名無しさん
NGNGhttp://science.2ch.net/test/read.cgi/kikai/1001645835/l50
0316デフォルトの名無しさん
NGNGVC6で、以下の2つの式をそれぞれコンパイルして、アセンブラ出力しました。
(xは構造体で、aは配列です。)
1) x->r = (x->r == x->a[0]) ? x->a[1] : x->a[0];
-----------------------------------
moveax, DWORD PTR [esi+32] ; x->a[0]
movecx, DWORD PTR [esi+8] ; x->r
cmpecx, eax
jneSHORT $L66838
moveax, DWORD PTR [esi+36] ; x->a[1]
$L66838:
movDWORD PTR [esi+8], eax
-----------------------------------
2) x->r = x->a + (x->r == x->a[0]);
-----------------------------------
moveax, DWORD PTR [esi+32] ; x->a[0]
movedx, DWORD PTR [esi+8] ; x->r
xorecx, ecx
cmpedx, eax
setecl
leaecx, DWORD PTR [ecx+ecx*4]
leaedx, DWORD PTR [eax+ecx*2]
movDWORD PTR [esi+8], edx
-----------------------------------
C言語のソースでは一見2)の式が単純ですが、
アセンブラ出力してみると、2)の方が命令数が増えてます。
この場合、1)と2)では、一般的にどっちが速いんでしょうか?
0317デフォルトの名無しさん
NGNG1) x->r = (x->r == x->a[0]) ? x->a[1] : x->a[0];
-----------------------------------
mov eax, DWORD PTR [esi+32] ; x->a[0]
mov ecx, DWORD PTR [esi+8] ; x->r
cmp ecx, eax
jne SHORT $L66838
mov eax, DWORD PTR [esi+36] ; x->a[1]
$L66838:
mov DWORD PTR [esi+8], eax
-----------------------------------
2) x->r = x->a + (x->r == x->a[0]);
-----------------------------------
mov eax, DWORD PTR [esi+32] ; x->a[0]
mov edx, DWORD PTR [esi+8] ; x->r
xor ecx, ecx
cmp edx, eax
sete cl
lea ecx, DWORD PTR [ecx+ecx*4]
lea edx, DWORD PTR [eax+ecx*2]
mov DWORD PTR [esi+8], edx
-----------------------------------
よろしくお願いします。
0318デフォルトの名無しさん
NGNGx->r = x->a[x->r == x->a[0]];
の間違いでした。
0319デフォルトの名無しさん
NGNG条件が偏っているなら前者が速い
と思う
0320デフォルトの名無しさん
NGNG以後は、分岐予測がヒットすれば 1)も遜色なくなってきた。
今では、殆ど差が無い。
差が出てもアライメントとかデータキャッシュ関係の差だろう。
命令実行そのものは並列でされるので、キャッシュアクセスに隠れてしまう為だ。
0321316
NGNGありがとうございます。
書き忘れましたが、テスト環境はPen3でした。
この式を使う個所は、主にスクリプト言語の述語判定です。
(局所的なfor文などで繰り返し使うわけではない。)
なので、どっちに転びやすいとかいうのは多分無いと思います。
今はジャンプの無い2)で組んでましたが、
実際に測ってから決めることにします。
(leaが遅そうだとか思いこんだりしてました)
0322初心者
NGNGLASMなら
LASM HELLO.ASM
LIL HELLO
でEXEファイルができるのですが、MASM32だと
ML HELLO.ASM
LINK HELLO
でアセンブルできてもリンクできません。
どうすればよいのでしょうか?
assume cs:cseg,ds:dseg,ss:sseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov dx, offset msg
mov ah, 09h
int 21h
mov ax, 4C00h
int 21h
cseg ends
dseg segment byte
msg db 'Hello !',0Dh,0Ah,'$'
dseg ends
sseg segment stack
db 100h dup(?)
sseg ends
end start
0323デフォルトの名無しさん
NGNG0324初心者
NGNGftp.microsoft.com/softlib/mslfiles/lnk563.exe
MASM32/BINにコピーして、コンパイル・リンク
HELLO.EXEが出来ました。実行!
HELLO!
ありがとうございました。さあ、悪いプログラムをガンガン作って世界を征服するぞー!
0325デフォルトの名無しさん
NGNG積極的に使うべきなの?
あとLEAってなんですか?
便利?
0326デフォルトの名無しさん
NGNG速度に関係しないところならどうでもいいんでない?
速度に関係するなら常にベンチマークをとるべき。
あと本ぐらいよもう。>LEA
0327デフォルトの名無しさん
NGNGおいおい(w
0328デフォルトの名無しさん
NGNGまあ、気長にがんばれ。
0329デフォルトの名無しさん
NGNG> まあ、気長にがんばれ。
ダメだよ、急がないと環境がなくなるぞ。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNG.NET とかで破ろうとガンバルより効率いいかもな
0333デフォルトの名無しさん
NGNG0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNGediが奇数アドレスをさしているときに
使ってもいいことになってますか?
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNGそれなら避けられるなら避けたほうがいいですね
stosdのばあい、奇数アドレスではないけど
4で割ったら2があまるようなアドレスだったら
どうなんでしょうか?
やっぱりドッチャリつきますか?
0339デフォルトの名無しさん
NGNG4byte alignをまたいだらドッチャリ付く。
ああ、ということはrep stoswは二回に一回だね。間違えたスマソ
0340デフォルトの名無しさん
NGNGどういうことかわからないです…
二回に一回とは?
あと、何を間違えたのでしょうか?
0341デフォルトの名無しさん
NGNGrep stoswを奇数番地から始めた場合、
4byte境界をまたぐのは二回に一回という意味でつ
0342デフォルトの名無しさん
NGNGなるほど、了解しますた
0343341
NGNGでは2回に1回は大丈夫ということ?
ペナルティ→大丈夫→ペナルティ→大丈夫…
0344342
NGNG343を書いたのは342です
0345デフォルトの名無しさん
NGNG1,1バイト単位で奇数アドレスから始める。
2.2バイト単位で偶数アドレスから始める。
3.4バイト単位でアラインされたアドレスから始める。
コンパイラの new がどんなアラインを返すのかちょっと調べてから
にする。
0346デフォルトの名無しさん
NGNG返されるチャンクを使う事にした。
賢いコンパイラなら、さすがに4バイトでアラインされた先頭アドレスを
返すだろうと勝手に仮定。
0347デフォルトの名無しさん
NGNGになっていたため事実上ハングアップしてしまった。WindowsXPでリセットボタン
を押すのは初めてだよ。
さて、肝心のループ部分をうpする。
asm {
mov ebx, 100
start:
mov edi, p
cmp byte ptr[align], 0
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 1
je label
inc edi // 2バイトアライン
label:
mov eax, 0
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep stosb // バイト
jmp next
0348デフォルトの名無しさん
NGNGcmp byte ptr[mode], 1
jne ldouble
rep stosw
jmp next
ldouble:
rep stosd
next:
dec ebx
cmp ebx, 0
jne start
}
これで、SIZE = 500000で実験した結果を次に示す。
0349デフォルトの名無しさん
NGNG2バイトアライン(BYTE) = 130763
4バイトアライン(BYTE) = 129686
1バイトアライン(WORD) = 412949
2バイトアライン(WORD) = 441081
4バイトアライン(WORD) = 391805
1バイトアライン(DWORD) = 914535
2バイトアライン(DWORD) = 918916
4バイトアライン(DWORD) = 912975
BYTEのSTOSは予想通りアラインの影響を受けない。WORDは2バイト
アラインの方が何度やっても1バイトアラインよりペナルティを食う。
どうもキャッシュが関係しているのではないかと思う。
DWORDはアラインの影響を受けないようだ。これは意外だな。
0350デフォルトの名無しさん
NGNGメモリはPC2100を使用。
測定結果はOS、CPU、メモリの影響を強く受けると思われるので、
要望があれば全リストをうpする。
0351デフォルトの名無しさん
NGNGasm {
mov ebx, 100
start:
mov edi, p
cmp byte ptr[align], 2
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc edi // 2バイトアライン
label:
0352デフォルトの名無しさん
NGNG2バイトアライン(BYTE) = 128789
4バイトアライン(BYTE) = 130906
1バイトアライン(WORD) = 451881
2バイトアライン(WORD) = 405049
4バイトアライン(WORD) = 422643
1バイトアライン(DWORD) = 895154
2バイトアライン(DWORD) = 899134
4バイトアライン(DWORD) = 876400
うーん何かよく分からなくなってきた・・・・Pentium4は多分Pentium3とは
全然傾向が違う石なんでしょう。
0353デフォルトの名無しさん
NGNG2バイトアライン(BYTE) = 130877
4バイトアライン(BYTE) = 120831
1バイトアライン(WORD) = 504302
2バイトアライン(WORD) = 457035
4バイトアライン(WORD) = 376032
1バイトアライン(DWORD) = 1002256
2バイトアライン(DWORD) = 1007482
4バイトアライン(DWORD) = 922796
Visual-C++での結果。これなら理解できる。さっきのはBorland-C++。
やっぱりBCCはnewが返すメモリチャンクのアラインがワードか何か
なんだろうな。よくわからんけど。
0354デフォルトの名無しさん
NGNG少し大きく確保して、得られたアドレスを (a + 15) & ~15 とかすればいいやん。
0355デフォルトの名無しさん
NGNGそれいいですね。それでやってみました。
1バイトアライン(BYTE) = 228404
2バイトアライン(BYTE) = 218411
4バイトアライン(BYTE) = 223208
1バイトアライン(WORD) = 438036
2バイトアライン(WORD) = 445308
4バイトアライン(WORD) = 455428
1バイトアライン(DWORD) = 877391
2バイトアライン(DWORD) = 860253
4バイトアライン(DWORD) = 896863
BCCでの結果です。やはり傾向は変わりませんね・・・・
0356デフォルトの名無しさん
NGNGいます。なぜかというとBYTEを500000回書き込んでも、Pentium4
(Northwood)の場合全部2次キャッシュに収まってしまうので、
それを避けるためにプログラムを変えました。
その結果メインメモリへのフラッシュが発生し、BYTEの結果が約2
倍時間がかかるようになっています。
どなたかPentium3系やAthlonで試していただける方はいらっしゃいま
せんか?その時はソース貼りますので。Pentium4ではアラインの影響
がいまいちわからないのです。
0357336
NGNGいろいろと検証してくださって
ありがとうございます
私のはPintium2です
コンパイラ(アセンブラ)は
bcc32(tasm32)しかありません
試してみたいのですがソースを
貼っていただけますでしょうか?
0358デフォルトの名無しさん
NGNGstos系などの書き込み時はキャッシュの遅延書き込みが効いてると思われ。
scas, lods, movsなどの読み込みではいかがだろうか?
0359デフォルトの名無しさん
NGNG遅れました。ソースを貼ります。bcc32でコンパイル検証済みです。
>>
358
やってみます。
#include <windows.h>
#include <iostream>
#include <cstdlib>
#define SIZE 5000000
void func1(long* p, char align, char mode)
{
asm {
mov ebx, 10
start:
mov edi, p
cmp byte ptr[align], 2
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc edi // 2バイトアライン
label:
mov eax, 0
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep stosb // バイト
jmp next
0360デフォルトの名無しさん
NGNGcmp byte ptr[mode], 1
jne ldouble
rep stosw
jmp next
ldouble:
rep stosd
next:
dec ebx
cmp ebx, 0
jne start
}
}
int prof(void (*func)(long*, char, char), long* p, char align, char mode)
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;
hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);
Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
func(p, align, mode);
0361デフォルトの名無しさん
NGNGSetPriorityClass(hprocess, oldclass);
return (int)(end - start);
}
int main()
{
long* dsts = new long[SIZE + 16];
long* dst;
dst = reinterpret_cast<long*>(reinterpret_cast<unsigned long>((dsts + 15)) & ~15U); // 4バイトアラインにする
std::cout << "1バイトアライン(BYTE) = " << prof(func1, dst, 0, 0) << std::endl;
std::cout << "2バイトアライン(BYTE) = " << prof(func1, dst, 1, 0) << std::endl;
std::cout << "4バイトアライン(BYTE) = " << prof(func1, dst, 2, 0) << std::endl;
std::cout << "1バイトアライン(WORD) = " << prof(func1, dst, 0, 1) << std::endl;
std::cout << "2バイトアライン(WORD) = " << prof(func1, dst, 1, 1) << std::endl;
std::cout << "4バイトアライン(WORD) = " << prof(func1, dst, 2, 1) << std::endl;
std::cout << "1バイトアライン(DWORD) = " << prof(func1, dst, 0, 2) << std::endl;
std::cout << "2バイトアライン(DWORD) = " << prof(func1, dst, 1, 2) << std::endl;
std::cout << "4バイトアライン(DWORD) = " << prof(func1, dst, 2, 2) << std::endl;
delete dsts;
}
0362デフォルトの名無しさん
NGNG1バイトアライン(BYTE) = 277337
2バイトアライン(BYTE) = 268935
4バイトアライン(BYTE) = 269434
1バイトアライン(WORD) = 421938
2バイトアライン(WORD) = 280317
4バイトアライン(WORD) = 280200
1バイトアライン(DWORD) = 474518
2バイトアライン(DWORD) = 450938
4バイトアライン(DWORD) = 367506
0363336
NGNG1バイトアライン(BYTE) = 565462
2バイトアライン(BYTE) = 564352
4バイトアライン(BYTE) = 506370
1バイトアライン(WORD) = 1063233
2バイトアライン(WORD) = 1014034
4バイトアライン(WORD) = 1014949
1バイトアライン(DWORD) = 2097202
2バイトアライン(DWORD) = 2017584
4バイトアライン(DWORD) = 2034207
このような結果になりました
どう評価すればいいのでしょうか?
アライメントの影響はないということ?
0364デフォルトの名無しさん
NGNGありがとうございました!そうですね、ライトバックキャッシュが効いているので
あまりアラインの差は出ないようです。今からlodsのfunc貼ります。これならかなり
差が出るでしょう。
0365デフォルトの名無しさん
NGNG{
asm {
mov ebx, 10
start:
mov esi, p
cmp byte ptr[align], 2
je label
inc esi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc esi // 2バイトアライン
label:
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep lodsb // バイト
jmp next
0366デフォルトの名無しさん
NGNGcmp byte ptr[mode], 1
jne ldouble
rep lodsw
jmp next
ldouble:
rep lodsd
next:
dec ebx
cmp ebx, 0
jne start
}
}
0367デフォルトの名無しさん
NGNG0368デフォルトの名無しさん
NGNG受けているのはなぜなんでしょうか?
1バイトアライン(BYTE) = 421525
2バイトアライン(BYTE) = 389473
4バイトアライン(BYTE) = 309287
1バイトアライン(WORD) = 1019163
2バイトアライン(WORD) = 637366
4バイトアライン(WORD) = 617137
1バイトアライン(DWORD) = 1293675
2バイトアライン(DWORD) = 1250312
4バイトアライン(DWORD) = 1244611
0369デフォルトの名無しさん
NGNG先にdstsをバイトポインタに変換しないとまずいのでは。
この部分は保険ですから結果に影響はないかもしれませんが。。
あと、movsの場合は、転送元と転送先がキャッシュの同じラインに
格納されるか("破壊的"か)どうかも結果に影響すると思います。
キャッシュのブロックサイズや連想度等を考慮して転送アドレスを
調整すれば、結果が変わるかもしれません。
0370デフォルトの名無しさん
NGNG気になったので、BYTE転送、WORD転送、DWORD転送にわけて
アライメントは呼び出し時にそれぞれ dst+1, dst+2, dst と
1MBの転送時間を計測するように書き直してテストしてみた。
cmps?, movs?はsrcとdstを256バイトずらして破壊的にならないようにした。
結果。
Pentium III (x86 Family 6 Model 8 Stepping 6, GenuineIntel)では
読み込み系(lods?, scas?, cmps?) などはアライメントにほぼ影響なし。
DWORD境界DWORD転送を 1.00 とすると BYTE境界DWORD転送で1.10
DWORD境界WORD転送で 1.23、BYTE境界WORD転送で1.36
DWORD境界BYTE転送で 1.75、BYTE境界BYTE転送で1.74
つまり
読み込み時のアライメントの影響はあまりないが
WORD読み込みは DWORD読み込みより 30%前後遅く
BYTE読み込みは DWORD読み込みより 75%前後遅かった。
書き込み系(stos?, movs?) は全テストにおいてほぼ同一値。
転送単位、アライメントに関係ない結果に。。。
0371370
NGNGためしてみた。(= 64KB)
結果。
Pentium III (x86 Family 6 Model 8 Stepping 6, GenuineIntel)では
読み込み、書き込みに関係なくほぼ同じ傾向が出た。
DWORD境界DWORD転送 を 1.0 として
WORD境界 DWORD転送 が 4.2
BYTE境界 DWORD転送 が 4.6
DWORD境界WORD転送 が 2.0
WORD境界 WORD転送 が 5.0
BYTE境界 WORD転送 が 5.5
DWORD境界BYTE転送 が 2.0
WORD境界 BYTE転送 が 9.5
BYTE境界 BYTE転送 が 9.7
WORD境界やBYTE境界はペナルティがどっちゃりつくという予想通りの結果。
L1 Cacheを超える場合はあまり関係ないということになるな。
0372デフォルトの名無しさん
NGNGrep movsとかrep stos一命令だけで全コードの99%以上の実行時間を
占めるので、他のコードのオーバーヘッドなんか関係ないと思うのだが。
>>371
そんなに差が出た?ペナルティがどっちゃりだと言っても最高4倍ほど
しか付かないように思うのだが。多分キャッシュのラインの関係もある
んだろうね。
0373デフォルトの名無しさん
NGNG充分ペナルティだと思うが、どうか。
0374336
NGNG遅くなりましたが2番目の
実験コードの結果です
1バイトアライン(BYTE) = 1302662
2バイトアライン(BYTE) = 1275674
4バイトアライン(BYTE) = 1275531
1バイトアライン(WORD) = 2065923
2バイトアライン(WORD) = 1662876
4バイトアライン(WORD) = 1662833
1バイトアライン(DWORD) = 3121135
2バイトアライン(DWORD) = 3094505
4バイトアライン(DWORD) = 2721193
0375デフォルトの名無しさん
NGNGlodsの場合はライトバックキャッシュの代わりにプリフェッチ機構が働く
ので、結果が変わってくると予想されますが確かにそのようになって
いますね。
結果的にはPentium4とPentium3はそんなにペナルティの傾向に差は
ないようです。
>>371さんはL1キャッシュに限定しているから、「素の」CPUのペナルティ
を測ることができたようですね。Pentium4はトレース・キャッシュという
怪しげなキャッシュを使っていますが、一応データもキャッシュできると
仮定して、L1に乗るようなプログラムを走らせてみました。
1バイトアライン(BYTE) = 167753
2バイトアライン(BYTE) = 167779
4バイトアライン(BYTE) = 48657
1バイトアライン(WORD) = 293953
2バイトアライン(WORD) = 173335
4バイトアライン(WORD) = 52731
1バイトアライン(DWORD) = 431089
2バイトアライン(DWORD) = 431042
4バイトアライン(DWORD) = 76308
てな感じでやはりアラインはL1キャッシュ内だとすごく大きく効いてきますね。
0376デフォルトの名無しさん
NGNGアセンブラを記述するにはどうすればいいのでしょうか?
0377デフォルトの名無しさん
NGNG0378デフォルトの名無しさん
NGNG実はアラインの問題をかなりの程度まで解決してくれるのか・・・・
0379376
NGNG0380デフォルトの名無しさん
NGNGdispe nasmw.exe
0381757
NGNGできませんが・・・
0382デフォルトの名無しさん
NGNGアセンブラでアセンブラ記述する ?
エディタでしこしこ書けば OK
0383デフォルトの名無しさん
NGNGってか?
0384デフォルトの名無しさん
NGNGとりあえず、君がまともに質問することが必要だと思うが(w
おそらく誰も質問の意味を理解できていないぞ。
0385デフォルトの名無しさん
NGNG0386デフォルトの名無しさん
NGNGアセンブラを作りたいのかな
キチ○イか神になるからやめておけ
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNGおめでと、386の地雷を踏みました。
>>382
glibcとか使えば比較的楽かもね。
でも、ほんとにキチ○イか神にでもなってしまうぞ。
0389デフォルトの名無しさん
NGNGでも昔の何人かのきちが・・・おっと神はやってのけたんだよなー
0390デフォルトの名無しさん
NGNG今よりは単純だったとはいえ・・・ハァ・・・
0391デフォルトの名無しさん
NGNG6809を使ってた頃は1パスアセンブラをアセンブラで書いたものだよ。
2パスアセンブラはさすがに頭が爆発して無理ですた。
ハッシュなんか機械語で実装するのは事実上無理ぽ・・・・・
0392デフォルトの名無しさん
NGNGならそのアセンブラで実装すりゃいいじゃな
というか1パスという事はラベル解釈しないアセンブラって事だよね?
0393デフォルトの名無しさん
NGNGそう。一行アセンブラ。だからほとんど使い物にならない。
もちろんこれをファイルから読み込ませるように改造すれば、
ラベルの使えないアセンブラができるわけだけど、ラベルが
使えないという事はジャンプもテーブルも使えないわけで、
使い物にならない。
でもちょっとしたコードをいちいち本を見てハンドアセンブル
する手間が大幅に省けたよ。
0394デフォルトの名無しさん
NGNGhttp://fasm.sourceforge.net/
結構本格派
面倒くさい、時間の無駄というだけで
スピードとか機能とか凝ったことをしなければ
このスレでは作れない人のほうが少数派だろうが
0395デフォルトの名無しさん
NGNGoptasmもフルアセンブラだったような・・・
マクロは超強力だったなぁ・・・・
tasmも、一応1パスという話だったと思ったが。
ただ1パスだとジャンプがshortでできる場所も、みんな
nearになったり、無駄な場所にnopが埋め込まれたりする。
0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNG>>395 も書いてるとおり、1パスでラベル使えるアセンブラは、いくらでもあったよ。
アドレスが確定しない所は、領域だけ空けといて確定したら埋め込めばいいだけ。
オンメモリで全部処理しておもむろにファイルにオブジェクト吐く奴とか、埋めるべき所とその値のテーブルをファイルの最後にくっつけてリンカやローダに「あと、よろしくね」という無責任野郎な奴もあったね。
アセンブラで書けたら「神」とか言ってる奴いるけど、ほんの15年ぐらい前は当たり前だったし、アセンブラだってサブルーチン/ライブラリが使えるんだから、そんなに言うほどのことではないよ。
0398395
NGNGあぁ、「可能」という文字が抜けてたか。
そりゃ、複数指定できるのは知ってるさ。普段はtasmを使ってるからな。
鬼の首取ったように、わざわざageて書く程度のことでもあるまいに(w
0399377
NGNG盛り上がる話題を提供してくれたのでチョット協力。
1. どのCPUのアセンブラを書くか決める。
2. CPUのレジスタの表記法を決める。
3. CPUのオペコードに対応するニーモニックを決める。
4. オペランドのアドレッシングモードに対応する表記法を決める。
5. ラベルの表記法(スコープも含む)を決める。
6. 必要な擬似命令(マクロを含む)を決める。
7. 字句解析ルーチンを設計。
8. 構文解析ルーチンを設計。
9. シンボル管理(ラベルなど)方法を決める。
10. バイナリーのフォーマット(リンカに依存)を決める。
11. コード生成ルーチンを設計。
12. アセンブル、実行、デバッグ、仕様変更を根性の続く限り繰り返す。
>識者様、抜けている所や間違いを補足してね。
0400デフォルトの名無しさん
NGNG何か関係があるのでしょうか?
-Sでアセンブラコードを出力すると
関数の最初と最後のあたりで
よくpush/popしているようでが
あと、レジスタの汎用度の順番
(気楽に使える順番)をしりたいです。
自分は今、
EDI > ESI > ECX > EBX > EAX > EDX
だと思ってます。
そして ESP, EBP はふれないようにしています。
0401デフォルトの名無しさん
NGNG引数なんかのスタックに直でアクセスするのに
BPとBXが無いと辛かった気はするのだがなんでだったか忘れた。
0402デフォルトの名無しさん
NGNGオブジェクトポインタにEBXが使われてるのでは?
演算用には EAX:EDX,ECX, を使うの普通では?
EDI,ESI,EBP,EBX は保存してから使うのが普通
EBPはスタックフレーム(ローカルレジスタ・引数アクセス)に使うのが普通
0403デフォルトの名無しさん
NGNGBPはデフォルトのセグメントがSSなので、スタックフレーム
にアクセスするときにセグメントオーバーライドしなくてもOKという利点が。
だからスタックフレームアクセス専用と考えておいていいね。
BXはDSだけど、二次元配列にアクセスするのに [BX+SI+xx]とか
できるんだよね。[SI+DI+xx]は無理(たしか)。
LSI-Cだと引数や返し値にBXとか使ったりして特殊(w
tasmなんかと組み合わせて使うときは面倒だね。
ARG疑似命令とか使えないし。素直に腐ったr86使えってこと
なんだろうけど。
0404401
NGNGLSI-Cでなんか思い出してきました。
intdos()じゃダメなDOS Callをアセンブラで書いて
LSI-Cのソースとリンクさせようとして居たような気がする
引数AX〜DXまで順番に割り当てられるんですよね
引数が少ない内は結構使いやすいんですが
引数のが4個以上になると汎用レジスタ埋まっちゃって
他のレジスタは基本的に破壊禁止だからpushするしか身動きとれない。
それでどっかのレジスタをプッシュすると
こんどはSPの値が-2されちゃうという具合で単純にpush とpopだけでは
スタックに積まれた引数まで取り出すことができなかった
それで
push ax
mov ax,[sp+4]
みたいなのを試みるもなぜかできなかったようなきもする。
それでLSI-Cが-Sオプションで吐き出すアセンブラをみながら
なんとなくBPを使うのかなあと思ったところで
面倒くさくなってアセンブラの勉強を止めました。
もしかしてmov ax,[??+4]みたいな使い方のできるレジスタが
ベースなんですかねえ。
0405デフォルトの名無しさん
NGNGなったのでとても使いやすい。命令の対称性が高まったためだと
考えられる。しかしレジスタの少なさは相変わらずだったね。
PentiumPro以降でレジスタ・リネーミング機構を内蔵したためレジスタ
の依存関係に起因するストールの確率が減ったが、プログラマが
その事を意識しつつアセンブラで書くのは不可能に近い。
内部的にはRISC(μops)で動いているので、μopsの数を減らすような
命令を優先的に選択してプログラムするとパフォーマンスが上がるが、
プログラマから見れば単調な命令を繰り返し書いているように見え、
あまり面白くない。
0406デフォルトの名無しさん
NGNGSSE使えば16バイトまとめてコピーできるんですよね?
ビットマップなどの画像のピクセルデータをコピーするときに
MMX使ってますが同様にSSE使っても大丈夫でしょうか?
以前どこかでSSEでコピーするのは良くないやらなんやら聞いたもので
もしできるのであれば単純に2倍近い速度になって助かるのですが・・・
0407デフォルトの名無しさん
NGNG実際やってみたらいいと思うが。
2倍どころか全然変わらん予感がする。
0408デフォルトの名無しさん
NGNGそれはメモリアクセスのレイテンシのせいか?
キャッシュ内に収まっている場合はかなり高速化すると思うが、ビットマップじゃ収まらないか
0409デフォルトの名無しさん
NGNGメモリバスの幅でせう。
0410デフォルトの名無しさん
NGNGアーキテクチャにもよるかも知らんが、最近の CPU はバス幅は関係ないぞ。
CPU 内部の L2 キャッシュ外の領域が要求された場合、その領域のデータは
32bytes 単位で内部キャッシュに転送され、レジスタに読み込まれる。
0411408
NGNGPentium 4 では 128bytes だし
0412デフォルトの名無しさん
NGNGメモリバスから読み込んだ分が順次利用可能になっていくCPUもあった気がする
0413デフォルトの名無しさん
NGNG内部で64ビットμops命令x2に分割してから実行する。
0414408
NGNG(1) memcpy test : memcpy 関数を使用
(2) MMX test : movq を使用、ループアンロール 4 回
(3) SSE test : movaps を使用、ループアンロール 4 回
ソース、デスティネーションのアドレスは、128bytes でアラインメントしてある。
環境 : VC++ 6.0 SP5 + Processor Pack, 実行速度最適化
Athlon XP 1666MHz, AMD 761, 266MHz DDR-SDRAM 512MB, Windows XP
・src, dest それぞれ 8KB の領域、128K 回繰り返し
memcpy test : 260ms
MMX test : 180ms
SSE test : 170ms
・src, dest それぞれ 64KB の領域、16K 回繰り返し
memcpy test : 560ms
MMX test : 461ms
SSE test : 431ms
・src, dest それぞれ 512KB の領域、2048 回繰り返し
memcpy test : 3455ms
MMX test : 2764ms
SSE test : 2744ms
・src, dest それぞれ 4MB の領域、256 回繰り返し
memcpy test : 3435ms
MMX test : 2794ms
SSE test : 2754ms
少なくとも Athlon XP では、キャッシュ内においても
MMX から SSE にした場合メモリコピーは速くならないようだ。
ちなみに、GetTickCount で計ったからあまり精密な値ではない。
0415デフォルトの名無しさん
NGNG乙〜
コピーするならMMXで十分ということで
ファイナルアンサー?
0416デフォルトの名無しさん
NGNGを使って転送しても結局は64ビット×2回の転送になるのでそんなに
速くならない、そういう事かな?
0417デフォルトの名無しさん
NGNGデータバスというよりロード/ストアユニットかな?
0418デフォルトの名無しさん
NGNGSSE128ビットの方が速い。
0419デフォルトの名無しさん
NGNGなんで8KB×128Kがダントツで速いんだ?
本当に4MBx256の13倍以上も速いのか?
0420デフォルトの名無しさん
NGNG同じ8KB領域への連続読み書きだと完全にL1キャッシュにヒットするからでしょ。
64bit266MHzDDRSDRAMの性能と
64bit×2本1666MHzL1キャッシュメモリの性能差。
0421407
NGNG確かP4でもSSE movapsの方がレイテンシもスループットも倍だたんだよ。
413の言うことがP4でも当てはまるんだろうね。
ちなみにスループットでMMX 1クロックSSE 2クロック。
それで転送しかしてないんだから、メインメモリのレイテンシを隠しようがない。
0422デフォルトの名無しさん
NGNGP4は、movapsによるメモリアクセスはスループット1クロックだよ。
0423デフォルトの名無しさん
NGNGttp://www.geocities.co.jp/SiliconValley-Oakland/8071/pa_mem.html
これで再計測してみたら?
0424デフォルトの名無しさん
NGNGデータ転送の書き方をおしえてください。
namespace A { // Aという名前の名前空間
int a;
}
namespace { // 名前なし名前空間
int b;
}
void f()
{
_asm {
// ここで、eax に A::a を mov する
// ここで、ebx に b を mov する
}
}
0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNGBCCとかでは using namespace A; とやって a を外に出さないと
だめみたい。
0427デフォルトの名無しさん
NGNGmemcpy,movq,movapsでPentium4でやってみた。
16バイトアラインメント、Pentium4 2.8G、PC2100、WindowsXP
SIZE=5000000バイト
memcpy = 52655
MMX movq = 30186
SSE movaps = 29940
Pentium4でもMMXとSSEの差はほとんど出ていない。
0428デフォルトの名無しさん
NGNGC/C++ の union や bitfield について、
アセンブラは、これらをレジスタに使うかどうかに
消極的なのでしょうか?
たとえば、uchar*2 を ushort*1 にパックするには
mov al, c0
mov ah, c1
で済むので、そうなるように期待して
union X {
unsigned short ushort;
struct {
unsigned char low;
unsigned char hi;
};
};
x.low = c0;
x.hi = c1;
と書いても、レジスタを使わずに
スタックを使っているようなのですが…
0429デフォルトの名無しさん
NGNG避けるのも無理はない
0430デフォルトの名無しさん
NGNGunionに限らず、structやclassを使ってもレジスタを使ってくれない。
常にthisを通したアクセスにするようだ。C++でなくてもCモードで
コンパイルしても「隠れthis」があるようなコードを吐く。
0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGBCC32だとそうなる。VC++.NETではthisポインタが必要ない時は
そのような面倒なコードは吐かないようだ。
でもVC++.NETでもunionはレジスタを使ってくれなかった。
0433デフォルトの名無しさん
NGNGアセンブラだから下手な厨も寄り付けないからだろうな。
ほかの言語スレはひどいありさまだ…。
# sage
0434デフォルトの名無しさん
NGNG「アラインメント」が何なのか説明してくださいまし
0435デフォルトの名無しさん
NGNG最近のCPUではループ負荷が配置の差によって数割変わる事も多く、
小手先の高速化手法よりアライン調整(単にNOPを入れるだけだが)の差が大きい
0436434
NGNGひとつ賢くなりますた、thx!
0437デフォルトの名無しさん
NGNGさすがにそこまでは無理かな
0438デフォルトの名無しさん
NGNGしない。(6.0)
0439デフォルトの名無しさん
NGNGデータ領域もアラインされてる。
コードはL1キャッシュが効くから下手にnop入れるほうが返って遅い。
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNGしてるに決まってんだろーがゴラァ
一からやり直し
0442デフォルトの名無しさん
NGNGアセンブラでAPI呼ぶ人ももういないでしょ。
どうしても必要なとこだけ関数の一部を置き換えるくらい。
0443デフォルトの名無しさん
NGNGnop のことだよ。
0444デフォルトの名無しさん
NGNGつか、構造体メンバのアラインメントはしてあって当然だっての。
そのための設定項目も存在するってのに
0445デフォルトの名無しさん
NGNGつーか、>>437 の聞き方が良くない。
最適化によって「自動的」にアライメントを調整するか ? と言うなら No.
あらかじめ設定したアライメントに自動で調整するか ? と言うなら Yes.
0446デフォルトの名無しさん
NGNG画像の処理速度を高速にするのと
エロゲー画像の吸出しツールとかを作るときに
使うのぐらいかな・・・?
0447Leliel(れりえる)
NGNGmasm32.com
http://www.masm32.com/
0448デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNG逆アセンブラというのを使ってみようと
思ったのですが、何を使えばいいですか?
そしてそれはどこにありますか?
0450デフォルトの名無しさん
NGNGウインドウズプログラム 逆アセンブル
http://pc2.2ch.net/test/read.cgi/tech/1034744077/93-101
0451デフォルトの名無しさん
NGNGを↓のように分岐使わないコードを吐くコンパイラって
ないですか?
mov eax,b
cmp eax,c
mov ebx,e
cmovg ebx,d
mov a,ebx
0452デフォルトの名無しさん
NGNGただし、cmovは必ずしも速いとは限らないことにご注意。
0453デフォルトの名無しさん
NGNGそれって d,eが普通の変数ならいいけど、 そうじゃないと両方評価してしまうから
良くないかも
0454デフォルトの名無しさん
NGNGcmp eax,c
cmovg eax,d
cmovle eax,e
これならレジスタも使わないし、評価もCの要件を満たすから
いいんじゃなかろうか。
0455デフォルトの名無しさん
NGNGmov a,eax
を最後につけてね。
0456デフォルトの名無しさん
NGNGIntelC++7.0
0457デフォルトの名無しさん
NGNGでやってみた。
cmov = 106988
cmp = 202720
cmovの方が2倍ほど速かった。std::rand()を代入している配列で比較したので
分岐履歴テーブルが働かない状態なのでパイプラインストールが発生している
のだろう(cmpの方)。
0458デフォルトの名無しさん
NGNGcmovのレイテンシってでかいよね。
VC6++でもsetccを使って分岐コードを排除してた
0459デフォルトの名無しさん
NGNG配列に全部 1 を入れてみた結果。
cmov = 106287
cmp = 81764
配列に1、2、3、4と 1 を入れてみた結果。
cmov = 107042
cmp = 90303
確かに配列に何らかの規則性があり、BTBが有効に働く場合は
jccの方が速いようだ。
0460デフォルトの名無しさん
NGNGcmov vs 分岐予測ネタはこのスレでやってたよ
0461デフォルトの名無しさん
NGNG0462デフォルトの名無しさん
NGNG人が集まらず寂れっぱなしです。
一回のぞいてやってください。
http://that.2ch.net/robot/
0463デフォルトの名無しさん
NGNGsubsp,#0x0c
のようにスタックポインタを後退させて
↓のような感じで
strr0,[rp,#0x00]
ldrr0,[rp,#0x00]
スタックを使っているソースを見たことがあります。
この方法で沢山の数値を保存できるとは思うのですが
スタックは無限ではないので↑のように
勝手にスタックポインタを動かすことに抵抗があります。
そういえばpush/popをするとき
スタックの限界なんて意識するひとはいないようですが
それが原因でバグがおきたなんて話しも聞いたことがありません。
一体どうしてなんでしょ?
0464デフォルトの名無しさん
NGNG環境によっては、あふれて挙動不審になります。
そういうことを気にしなくてもいいのは、
足りなくなると適当に割り当ててくれるから。
0465デフォルトの名無しさん
NGNG組み込みでは厳密にスタック消費量をみるのが普通ですよ。
まともなコンパイラセットなら、ライブラリ関数ごとのスタック消費
量まで書いてあります。
PCだとあんまり気にしないですけどね。。。とれるスタックの
量が桁違いですし。。。
組み込みだと4Kバイトとか8Kバイトがなんてのがよくあります。。。。
0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNGよくあることです。
で、ワーストケースの見積もり間違えで、悲しいことになる…
0469デフォルトの名無しさん
NGNGIBMのsystem/370のアセンブラの入門書が見つかったので、とりあえず同じ汎用機だから似てるかなあと思って注文したのですが、
この本で勉強しても日立系でも応用利きますか?
0470デフォルトの名無しさん
NGNGスタックってやっぱり後方のアドレスから使うのですよね?
0471デフォルトの名無しさん
NGNGどのCPUの?
0472デフォルトの名無しさん
NGNGそんな宗教やめておけ
0473デフォルトの名無しさん
NGNG今時どう言う理由で汎用機のアセンブラを勉強したいんだ ?
0474デフォルトの名無しさん
NGNG汎用のCPUの殆どが ハードウエアスタックを アドレスの大きい方から小さい方へむかって消費します
でも、特殊なCPU(1チップ系)はそうとは限りません。
0475デフォルトの名無しさん
NGNG>>474俺のいじった数十種のチップには残念ながら無かった。例を挙げてみて。
0476デフォルトの名無しさん
NGNG> >>473バグが出て読まなきゃいけなくなったに1000クロック。
今使ってるんなら、普通マニュアルぐらい持ってるだろう ?
余分に必要なら、営業に電話すればいいだけ。
CD-ROM 版なら、破格の \300/冊 で買えるみたいだよ。
http://www.hitachi.co.jp/Prod/comp/soft1/VOS3/manual/cd.html
つーか、アセンブラで書いた部分のバグを今からアセンブラ勉強しますって言う奴に修正させるなんて自殺行為に等しいと思うぞ。
>>474俺のいじった数十種のチップには残念ながら無かった。
ハードウェアスタックを持たない CPU はあるけどねぇ。
上に書いた汎用機もそうだし。
0477デフォルトの名無しさん
NGNG例えばPIC なんかは PUSH でアップするのかダウンするのかマニュアルに書いていない。
まあ専用スタックなんで、そんな情報は不要なんだけどね。
今使ってるチップはスタックは2レベルしかない。 だから、スタック選択はカウンタではなく
フラグを反転するだけ。
0478469
NGNG??私は469でしか書き込んでないですよ。
仕事でアセンブラを直接使うわけではないです。
主体はコボルなのですが、アセンブラで書かれたソースもあるので、少しは知りたいと思ったのが本を欲しいと思った理由です。
マニュアルって一般人でも買えるんですか?
0479デフォルトの名無しさん
NGNG> マニュアルって一般人でも買えるんですか?
そりゃ買えるけど、多分ソフトを一緒に買わないとダメだと思う。
汎用機のソフトって普通の個人じゃ買える値段じゃないと思う。(最近は知らんけど。)
仕事で汎用機使ってるなら、その管理者の人に言ってマニュアル買ってもらえば良いと思う。
アセンブラの勉強したいのでと言えば、普通の上司なら \300 ぐらいの経費は認めてくれるでしょ。
0480デフォルトの名無しさん
NGNG学生の頃(4年前)にゲーム喫茶のマスターにプログラムを組んでくれと
頼まれて本を借りてそのままどこかになくしたんですが、
最近になって返してくれと言われて困っています。
なんでもいいので何かあれば教えて下さい。
0481デフォルトの名無しさん
NGNGhttp://www.6502.org/
0482デフォルトの名無しさん
NGNGカリパクってやつやね。
0483山崎渉
NGNG0484デフォルトの名無しさん
NGNGASSUMECS:CODE,DS:CODE
;
ORG5CH
FCBDB12 DUP(?)
DB25 DUP(?)
BUFFERDB128 DUP(?)
;
ORG100H
ENTRY: ;保守上げ
0485480
NGNGthxです。6502日本語のサイトってないんですかね?
0486デフォルトの名無しさん
NGNGむしろ65816のサイトを巡った方が良いサイトが見つかるかも。
日本語のページはスーファミばかりの関係であまりいい所は
ないみたい。
0487デフォルトの名無しさん
NGNGhttp://www.borland.co.jp/delphi/personal/
0488デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?q=%E3%81%AC%E3%82%8B%E3%81%BD&ie=UTF-8&oe=UTF-8&hl=ja&lr=
0489485
NGNG全然無知なんですが6502と65816は同じ系統と考えていいんですか?
今探してる情報としてはコード表(?)を探してます。
「6502 コード表」でグルってもイマイチなんですよね・・・
0490デフォルトの名無しさん
NGNGttp://www.apple2world.jp/apple2/COL/MapItems/6502/6502opcode.html
と言うか、http://www.6502.org/ からたどればいくらでもでてくるけど。
もちろん英語だけど、6502 自体国内ではファミコンぐらいしか使われなかったし、今となってはかなりマイナーな情報だから英語は必須と思うべき。
0491デフォルトの名無しさん
NGNG英語でもよければ
http://www.6502.org/tutorials/6502opcodes.htm
0492デフォルトの名無しさん
NGNGゲーム喫茶のポーカーゲーム賭博機も 6502 でつ。
未だ現役で動いてるだろ?
0493デフォルトの名無しさん
NGNGその為に逆にWebにまで資料を上げてくれる奇特な人はいないんだろうね
0494デフォルトの名無しさん
NGNG6502はファミコン、65816はスーパーファミコンに採用されたCPUですね。
それでここがミソなのですが、65816は6502互換モードというのを持って
おり、それに切り替えると(エミュレーションモードという)、拡張された
6502として使用できるようになっており、従って65816のサイトには同時に
6502の解説も書いてあるのが普通です。
0495デフォルトの名無しさん
NGNG同じく英語ですが
http://www.defence-force.org/computing/oric/coding/annexe_2/
6502と65816の簡単な対比ができます。
0496山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0497山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0498デフォルトの名無しさん
NGNGで、オススメのやつありますか?
0499デフォルトの名無しさん
NGNG15F2:0103 MOV DX , 0001
15F2:0106 MOV WORD PTR [0200] , 100
15F2:010C DIV WORD PTR [0200]
15F2:0110
-G =100 110
AX=01FF DX=00FF
axの01がどうやって出たのかどなたか教えていただけませんか?
宜しくお願いします。
0500デフォルトの名無しさん
NGNG1FFFFh / 100h = 1FFh 余り 0FFh
DX:AX [0200h] AX DX
ok?
0501デフォルトの名無しさん
NGNG分かりました。
分子にはdx(この場合は0001)も含まれるのですね。axだけで考えてた・・。
ありがとうエロイ人 (・∀・)ノ
0503デフォルトの名無しさん
NGNG> さて、半角に寄ってから寝るか。
エロイ人やん !!
0504デフォルトの名無しさん
NGNGγ´ `ヽ_`と.__ )( ・ ∩( 《 ( ・∀・) ゴロン
)) ,、 , ) <、_,.ノ ヽ、.__,ノ l つ つ
((_/し∪V .ヽ.__ノ!__)) ゴロン
∧__∧ ∧_∧ ∧_∧
( ) ( ;´Д`) (・∀・ ) エロイ人から逃げられると思うなよ。
( つ (U_U )つ (つ と)
.ヽ___ノj 503 (⌒Y⌒)
∧__∧ . / ̄ヽ ̄
(・ ) __ ( __ ) ( ゴロン
と ヽ ( ̄))∧_∧ /´ `Y⌒) VUVJ_)
(__ト、__丿 〉 》∩ _) ( .__つ´
ヽ、.__,ノ ヽ、__,.>
0505デフォルトの名無しさん
NGNGあさっぱらからワラタヨ
0506デフォルトの名無しさん
NGNGターゲットはWindowsなんですが、
関数を書くときに
破壊していいレジスタ/いけないレジスタ
というのはあるのでしょうか?
今まで全部破壊してはいけないと思ってたのですが
VC++で書いた単純なCコードに汗リストを吐かせると
ebp しか push してなかったので。
0507デフォルトの名無しさん
NGNG処理系によって違うから、その処理系のマニュアルを見るべし。
(全部自前で書くなら適当に決めればいい。)
とりあえず VC++ とかなら
http://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/vccore/_core_using_and_preserving_registers_in_inline_assembly.htm
とかを参考にスレ。
0508デフォルトの名無しさん
NGNGFPU SSEレジスタはコンパイラ毎に扱いが違うが関数呼び出しで破壊されると仮定した方が良い気がする
0509デフォルトの名無しさん
NGNG即レスサンクス!
汎用的に呼び出したい(更にはDLLにするかもしれない)ので
心配だったんです。
MSDNまで教えていただいたので公の仕様が手に入って安心しました。
#でもこんな奥深くにあったら分からないって
FPU SSEがコンパイラ毎に違うというのがちょっと気がかりですが、
今回とりあえず使わないので良しとします。
#破壊「されてる」のはコールした関数のバグかも、
#とか思えるからまだしも、自分が破壊してもいいものかどうか...
0510デフォルトの名無しさん
NGNG心配なら保存しとけばいいと思うが...。
0511デフォルトの名無しさん
NGNGWin32APIではEBX,ESI,EDI、EBPが非破壊。
このくらい調べられないようじゃお先真っ暗だぞ。
0512デフォルトの名無しさん
NGNG> このくらい調べられないようじゃお先真っ暗だぞ。
はい...頑張ります。
0513デフォルトの名無しさん
NGNG呼び出すにはどうすればいいのか教えてください。
http://www.microsoft.com/japan/msdn/library/ja/vcsample/html/vcsammasmprimesstep2.asp
というのを見つけたのですが概要だけのようでして。
0514デフォルトの名無しさん
NGNG処理系によって引数の渡し方が異なるから、
まずはCで簡単なテストプログラムを作って
コンパイラにアセンブリ・リストを吐かせてみたら?
0515デフォルトの名無しさん
NGNGえぇと、C側は
?hoge@@YAXXZ PROC NEAR
みたいにハッシュ化(?)されちゃうようなんです。
毎回リスト吐かせて調べて
extrn ?hoge@@YAXXZ
みたいに書かなきゃいけないのかな、と思いまして。
0516デフォルトの名無しさん
NGNGそれCじゃなくてC++だよ
extern "C"とかで対処
0517デフォルトの名無しさん
NGNGなるほど!
ありがとうございました。
あぁ、「このくらい調べられないようじゃ」という声が、、、
0518デフォルトの名無しさん
NGNG0519デフォルトの名無しさん
NGNG{
asm("imul %2, %0"
:"=r(a)"
:"0(a)",
"r(b)"
);
return a;
}
と
int kakezan(int a, int b)
{
asm("imul %2, %0"
:"=r(a)"
:"r(a)",
"r(b)"
);
return a;
}
って 実行結果は同じなんですが、内部的にはどう違うか教えて下さい。
0520デフォルトの名無しさん
NGNG0521デフォルトの名無しさん
NGNG実行結果ちがうでー。
0522デフォルトの名無しさん
NGNG:"=&r"(a)
:"r"(a),"r"(b));
だよね
0523デフォルトの名無しさん
NGNGアセンブラ出力結果見ればいいじゃん
>>522
?
0524デフォルトの名無しさん
NGNG0525519
NGNG0526デフォルトの名無しさん
NGNG%1見てないならどっちでもいいんでは?
0527デフォルトの名無しさん
NGNGよく分かってないんだが、
上のは、
mov eax, a
mov ebx, b
imul eax, ebx
だけど、
下のは、
mov ecx, a
mov ebx, b
imul eax, ebx
で、imul結果が不定にならない?
0528527
NGNGのレジスタは、てきとーに書きました。
出力の"r"(a)と入力の"r"(a)が同一レジスタに
なる保証はないのかと・・・
だから、"0"(a)なんて書き方があるのかと・・・
0530デフォルトの名無しさん
NGNG0531デフォルトの名無しさん
NGNGDOSで動くやつでもいいんですが・・・
0532デフォルトの名無しさん
NGNG前にアセンブラとAPI組み合わせていたのを見たのだが。
なんでこんなこと聞くのって?
いや、ウィンドウ使える新しい言語作る人とかいるじゃん?
HSPとかACTIVEBASICとか・・・。
このかたがたってアセンブラで言語作ってんだと思っているんだ。
んで、この人達がEXEファイルを出力できるからさぁ、どういう仕組みなんだって気になってな・・・。
0533デフォルトの名無しさん
NGNG0534デフォルトの名無しさん
NGNG> windowsで動くMotorola 68000 アセンブラってないですか?
Ex68 (X68000 シミュレータ) 上で AS.X 動かすってのはダメ ?
ttp://www.ksky.ne.jp/~yamama/emul/
0535デフォルトの名無しさん
NGNGDOS用で良ければ
68000 クロスマクロアセンブラ AS68K
ttp://www.vector.co.jp/soft/dos/prog/se007609.html
0536デフォルトの名無しさん
NGNGDelphi製らしいです
0537デフォルトの名無しさん
NGNGx68買え....て 無理か
0538デフォルトの名無しさん
NGNG別にX68k買わなくても
run68.exe+has.x
で良いような
0539名無し@沢村
NGNGどうよ?
0540デフォルトの名無しさん
NGNG0541デフォルトの名無しさん
NGNGhttp://wave8.hp.infoseek.co.jp/bckp.html
0542デフォルトの名無しさん
NGNG変数の型を short や char ではなく int にすると、
足し算するところに、よく、lea という命令を
使うようになります。
short の場合だと movzx, add などが連続しているのに対して
int の場合だと lea だけですませているようです。
質問1
add よりも lea のほうが効率がいいのですか?
質問2
lea は int 以外(short や char など)では使えないのですか?
質問3
やはり int の計算は、char や short よりも効率がいいのですか?
質問4
整数の型は(たとえもっと小さい型ですむ場合でも)
int を第一に考えるのが最も自然なのですか?
ところで、最近、計算の型をそろえるということは
効率(実行速度)への影響が実は大きいのでは…と
感じてきました。
なんだかコンパイラ(アセンブラ?)が裏でコソーリとやっている
型合わせ処理が、無視できないコストなのでは…大げさかな
アホな感想ですいません
0543デフォルトの名無しさん
NGNG486-Pentiumクラスの知識で答えてるんで最近のx86じゃ
違うかも知れない。
1 殆どの場合no. つーか単純加算でleaなんか生成するっけ?
掛け算ならわかるが(eax*5 == lea reg,[eax+eax*4],etc)
2 だいたいyes. 16bitのleaはレジスタ組み合わせが少ない
3 yes.
4 yes.
型変換が結構なコストになるのは周知の事実だろう
0544デフォルトの名無しさん
NGNG0546デフォルトの名無しさん
NGNGMOV DX,00F3H
の機械語を教えてくれ
0547デフォルトの名無しさん
NGNGt季右・tE畿
0548デフォルトの名無しさん
NGNG('A`)
0549デフォルトの名無しさん
NGNG「そんなに長くなるわけねーだろ」と言いたそうだな。
0550546
NGNGMOV AX, CS
MOV DS, AX
みたいのならわかるんだが(´・ω・`)
0551546
NGNG('A`*( * )
0552デフォルトの名無しさん
NGNG0554デフォルトの名無しさん
NGNGXP で DEBUG 起動した事ある奴と、UFO 見た事ある奴、どっちが多いかな?
0555546
NGNGMOV AL,の部分まではB0になるのは分かるんだ
90Hやら00F3Hってのがわからねぇぇぇぇぇぇぇええぇぇぇっぇぇぇぇぇえっぇ
0556デフォルトの名無しさん
NGNGdebugでは数値は16進数入力だから、後ろのHはいらんぞ。
0558デフォルトの名無しさん
NGNGだから、後ろのHはいらんてばさ。
0559デフォルトの名無しさん
NGNGsymdeb.exeなら、結構役に立つが。mapsym使ってシンボルファイル
作って、学生時代にTurboPASCALのコードのデバッグしてた。
TurboDebuggerだとでかすぎて読み込めないプログラムも、ちゃんと
デバッグできたし。
そういえば、新電子立国で一太郎の話が出とったときは、デバッガが
symdebだったナー
0560デフォルトの名無しさん
NGNG一応DOSだけ買えば、アセンブリ開発環境は揃ってしまうと(w
0561デフォルトの名無しさん
NGNG98すか?
2.11がmasm+link+debug
3.1がlink+symdeb
で、そのうち拡張セット(だったっけ?)に入るようになった。
と思うんだけど、さすがに昔過ぎて記憶があいまい。
0562デフォルトの名無しさん
NGNGとりあえずDOS上からとDOSエクステンダ上からどれくらいの割り込み
までかけられるのかなぁとやってみたのですが、割り込みコントローラ
と割り込みリターンの速度上CPUが1GHz以上でも200kHzあたりで頭
うちになるっぽいです。
1.AT互換機上でやるのがまちがい
2.DOSでやるのがまちがい
3.80x86でやるのがまちがい
4.実はやりかたがある
のどれあたりなのか、もしご存知ならお教えください。なんかせっかく
クロックの高いCPUがあるのにもったいないなぁとおもったので・・・
0563デフォルトの名無しさん
NGNG仮想86モードを使わない。
x86って応答そんなに早くないけど。そこまでひどくないと思う。
0564デフォルトの名無しさん
NGNGそれともI/Oに何か読み書きしてる? I/Oの読み書きするだけで結構
時間がかかるんだけど。。
あと>>563で指摘されてるよーに、DOSでHIMEM.SYSだけ組み込んでやれば
ちっとは速くなるんじゃないかナ。
0565デフォルトの名無しさん
NGNGなにも組み込んでないPC-DOSだと、仮想86モードにはなってないんじゃない
かと思ってたんですが、実は違うんでしょうか?
ちょっとぐぐってみました。EMM86って仮想86にして仮想EMSを実現してたの
ですね。知りませんでした。HIMEMだけにしたり、なにも無い状態にしたりして
テストしてみます。
>564
最初は8ビットI/Oを1ヶ所だけ読み出していたのですが、200KHzくらいのテスト
の時には特定1ワードのメモリをインクリメントするだけの割り込みルーチンに
しました。I/OにはEOIを書込みしています。
メモリの読み書きが遅いとは思えないので、割り込みの突入、EOIの書込み、
retiのどれかが重いと思っていたのですが、まさかこれらでμS単位の時間が
消えるとも思えないので・・・
お二方に教えていただいたことでまた実験してみます。ありがとうございます。
0566デフォルトの名無しさん
NGNG何の割り込みを使ってるのか分からんが「割り込みの突入」に
激しく大きなペナルティーがあるはず。
まぁCHIPSETなんてなかった単独の割り込みコントローラーが
あった時代の話だが、、、(^^;
定期的に200KHz以上の周期が本当に欲しいのか
デザインしなおすほうがいいかも。
普通は割り込み側にFIFOバッファなどおいて
割り込み周期は落とすようにしてある。
0567565
NGNG使用してたのはISAバスの割り込み腺です。
4ビットカウンタを適当なクロックでまわしておいて、その値を割り込み時に
読み出すようなテスト回路を作ってみてました。とりあえず定期的な割り込
みで50〜1MHz位で試してみて、どのくらいまで取りこぼさずにとれるのか
なぁって。1GHzのCPUで1000clockもあるわけだから、まぁいけるんじゃない
のかな?って思ったのです。
さすがにISAバスももうないので、パラレルポートで割り込み&データ溜め
込み&HDDに記録&ちょっぴりの制御 なんかができたら、いろいろ遊べる
かなぁと思ったのです。せっかくGHzクラスのCPUがあるんだし。
>激しく大きなペナルティーがあるはず。
>まぁCHIPSETなんてなかった単独の割り込みコントローラーが
>あった時代の話だが、、、(^^;
今はチップセットなんかがCPUの近くで全部面倒見てるんだから、割り込
み応答も高速になってると思っていいんでしょうか?DOSから8259相当と
してたたくと遅くなるだけとかだということなんでしょうか?
>定期的に200KHz以上の周期が本当に欲しいのか
>デザインしなおすほうがいいかも。
>普通は割り込み側にFIFOバッファなどおいて
>割り込み周期は落とすようにしてある。
そういうFIFOのついた安いPCIのボードとかPCMCIAのカード、もしご存知
でしたらお教えください。さがしてみても数万円しちゃうようで、ちょっと遊
んでみるには高価なので・・・
お教えいただいてありがとうございます&長文失礼しました
0568デフォルトの名無しさん
NGNGマシンコードと見なしてcallしたいんですが、
インストラクションコードがわかりません。
最初、nearの
8E <フラットアドレス32bit>
かと思ったんですが、これじゃなくて、どうやら
FF ?? <フラットアドレス32bit>
という形式にしないと駄目らしいんですが、
??に何を入れたら良いんでしょうか?
0569デフォルトの名無しさん
NGNGは、32bitの絶対値です。
0570デフォルトの名無しさん
NGNGISAバスだと、 4MHzじゃなかったっけ?
それと、割り込みとかDMAって技術はクロック数10メガの世界迄で、今のCPU速度にとっては双方邪魔
0571デフォルトの名無しさん
NGNGmallocで確保した領域をcall出来たかな?
VirtualAlloc で PAGE_EXECUTE_READWRITE とかで確保してないとダメじゃないの? Windowsだよね?
0572567
NGNG問題ないです。
普通にmallocした領域にインストラクションコードを並べるだけでokです。
0573568
NGNG0574568
NGNG別のヒープのマシンコードをcallで呼び出したいという事です。
そのときのアドレスの指定の仕方で悩んでます。
最初のヒープの実行には成功してます。
0575568
NGNGB8 <フラットアドレス32bit> ;mov eax, addr
FF D0 ; call eax
というEAXレジスタ間接呼び出しには成功しました。
これを直接、
call <フラットアドレス32bit>
とできればいいんですが・・・
0576デフォルトの名無しさん
NGNGアドレスをレジスタに入れて
call eax
みたいな形でコール。
0577デフォルトの名無しさん
NGNGE8 cd CALL rel32 相対 near コール、次の命令とディスプレースメント相対。
FF /2 CALL r/m32 絶対間接 near コール、r/m32 でアドレスを指定。
9A cp CALL ptr16:32 絶対 far コール、オペランドでアドレスを指定。
FF /3 CALL m16:32 絶対間接 far コール、m16:32 でアドレスを指定。
という事で、絶対 near コールは無い
0578563
NGNG割り込みの制御は今も基本的には同じ。
>>570
8MHzじゃなかったっけ?
たまーに10MHzとか言うのもいたような気もするが。
割り込みだけなら、バスクロックの影響は無いと思う。
Bridge経由になる分PCIより遅くなるかな?
0579568
NGNGその表の見方がわからんのです。
/2とか/3とか。
0580デフォルトの名無しさん
NGNG3.1.1.1. オペコード欄
/digit - 0 から7 までの数字で、命令のModR/M バイトがr/m ( レジスタまたはメモリ) オ
ペランドだけを使用することを示す。reg フィールドには、命令のオペコードを拡張する数
字が入っている。
具体的にはその前の2章を読め
0581568
NGNGその辺のマニュアルの説明読んでも、
いまいち実際の値がどうなるのかがわかりません。
値の設定の仕方が何処にも載ってないし・・。
0582568
NGNGコピペしてる状況です。
しんどいです。
0583デフォルトの名無しさん
NGNGそこは Try & Error で乗り切るしかないだろ。
0584568
NGNGさっぱりでした。
そういえば/3とかのフラグ系以外にも、
SIBバイトというのが意味不明でした。
0585デフォルトの名無しさん
NGNG表 2-2. ModR/Mバイトによる 32ビット・アドレス指定形式
の表の上から6つめに
/digit (Opcode) REG =
ってあるだろ?
0586568
NGNGVCソースのstubに
___asm {
call 12345678
}
とか書いて、codファイル出そうとしたんですが、
>error C2415: オペランドの型が無効です。
でエラーになりました。
やっぱ無理っぽいですね。
0587568
NGNGお手数かけます。
これから読んでみます。
0588デフォルトの名無しさん
NGNG0589568
NGNGちなみに、どのマニュアルのことでしょうか?
IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル
の、上・中・下巻が手元にありますが、これでいいんでしょうか?
0590568
NGNG0591568
NGNGまさしくそれっぽいです
やっと意味がわかりそうです。
ありがとうございました。
0592デフォルトの名無しさん
NGNG作り方の書いてあるホームページあったら教えてください
直接ここで教えてもいいですよ
ちなみにレスはしません
0593デフォルトの名無しさん
NGNG折角pdfで提供してくれてるんだから、検索を活用してね。
0594デフォルトの名無しさん
NGNG作り方の書いてあるホームページないので教えません
0595デフォルトの名無しさん
NGNG0596デフォルトの名無しさん
NGNGどうせならC++で書けばいいじゃない。
0597デフォルトの名無しさん
NGNG0598デフォルトの名無しさん
NGNG教えてください
0599デフォルトの名無しさん
NGNGlea eax, DWORD PTR [eax+1] と inc eax
ってどっちが速いんですか?
0600デフォルトの名無しさん
NGNG0601デフォルトの名無しさん
NGNGたぶんどっちでも同じだろう。 命令コードが短い方がトータルではキャッシュが効いて有利だ。
0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNG短い方にしといた方が条件ジャンプとかでも有利ですよね。
ありがとうございました。
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNGハッカーキターーーーーーーーーーーーーー!!!!!
0606デフォルトの名無しさん
NGNG0607デフォルトの名無しさん
NGNG/ / \、i, ,ノ ヽ ヽ
| (-=・=- -=・=- ) |
0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNGサポートしているアセンブラ教えれ
0610デフォルトの名無しさん
NGNG0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNG0613デフォルトの名無しさん
NGNG0614デフォルトの名無しさん
NGNGいったいぜんたい何回言われればわかるのか。
マ ニ ュ ア ル 読 め
0615デフォルトの名無しさん
NGNG0616デフォルトの名無しさん
NGNG0617デフォルトの名無しさん
NGNGhttp://www.intel.com
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNG誰かおしえてぴょん
0620デフォルトの名無しさん
NGNGISAは8MHzですなぁ。
マジメに速いのを作りたいなら、PCIの拡張ボードを自作してしまう
ことをお奨めする。取りあえず趣味で作るだけなら、I/O固定の
PCIモドキボードでもいけますし。下のとことかね。
ttp://elm-chan.org/works/pci/report.html
つーか、1GHzのCPUと言っても、内部だけだからねぇ。外部は
所詮100MHzとか133MHzで動いてるわけだし。まして、I/OはPCI
なら33MHzだ。
0621デフォルトの名無しさん
NGNG0622デフォルトの名無しさん
NGNGフリーだと他には
fasm http://fasm.sourceforge.net/
wasm http://www.openwatcom.org/
0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNGmasm7.1単体配布してるとこ教えて!
0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNG0627デフォルトの名無しさん
NGNGNWSA
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNGはつみみです
0630デフォルトの名無しさん
NGNG0631デフォルトの名無しさん
NGNG0632デフォルトの名無しさん
NGNGvisual stuio netから取り出したmasm7..0が普通に配られてるよ
0633デフォルトの名無しさん
NGNG0634デフォルトの名無しさん
NGNGホントに無料「配布」可なのか ?
>>633
無料ダウンロード可と無料配布可じゃ全然違うぞ。
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNG0637デフォルトの名無しさん
NGNG0638デフォルトの名無しさん
NGNGいらない奴は捨てるから大丈夫
0639デフォルトの名無しさん
NGNGご自慢のcab形式にしてホシイ
0640デフォルトの名無しさん
NGNGうp報告以外不要
0641デフォルトの名無しさん
NGNGhttp://users.easystreet.com/jkirwan/pctools.html
0642デフォルトの名無しさん
NGNG0643デフォルトの名無しさん
NGNGWin98DDKに入ってるのは6.11。古いんだyp!
vcpp.exe(VS6SP4用)かvcpp5.exe(VS6SP5用)には6.15が入っとる。
0644デフォルトの名無しさん
NGNGダウソ板逝け
0645デフォルトの名無しさん
NGNGpush eax
と
push 0
ってどっちが良いの?
0646デフォルトの名無しさん
NGNG0647デフォルトの名無しさん
NGNG無駄にレジスタ使う理由も無いだろうと思うがな。
ついでにレジスタ初期化する必要があるなら別だが。
0648名無し@沢村
NGNGというのはアセンブル言語とマシン語は1対1で対応したものだから、単純な変換だからよ。
コンパイラのように字句解析とかパーサをつくる必要もないよ。
といっても、
MOV AX 100
の場合、MOVに対応したネイティブコード、AXに対応したネイティブコード、100に対応したネイティブコードと続いて保存されるわけではなくて、一命令の全部のオペランドが加算されてひとつのネイティブコードになるから、ちょっとややこしいけどな。
まあ、ものすごく根気のいる作業だが、難度の高いことは何もないから、おまいらもつくってみろ?
0649デフォルトの名無しさん
NGNG2パスアセンブラは結構作るのが面倒だった。
0650デフォルトの名無しさん
NGNG<test-part>
test eax, eax
je L2
<then-part>
jmp L1
L2:
こういう相互ジャンプのジャンプ先のオフセット計算は
スマートにやるとどうやるの?
<test-part>と<then-part>のサイズによって、
short/nearジャンプの切り替えがある。
je L2はjmp L1の長さが判ってないとだめだし、
jmp L1はje L2の長さが判ってないとだめ。
それと、沢村うるさい。
0651デフォルトの名無しさん
NGNGマクロとか、欲しくなって複雑になっていく罠
0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG全部shortと仮定して、だめなところを順次nearにしていくとか?(あてずっぽう
0654デフォルトの名無しさん
NGNG簡単にやるには、1パス目で飛び先が確定していないものについては near だと仮定してしまう。
で、2パス目で実は short でも大丈夫とわかったら short にしてあとに nop を詰める。
> それと、沢村うるさい。
毎回言われてることだが、「無視しろ」。
0655デフォルトの名無しさん
NGNG今は有償。
多分
>>633
が正解。
0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNG0658名無し@沢村
NGNGmasmにはたくさんのファイルがついてくるが、その中のQEditorというのが開発環境だよ。
このQEditorでアセンブル言語を打ち込んでアセンブルやビルドをするんだよ。
またQEditorにはプログラミングが楽になるようにテンプレートもついているし、APIやスクリプトも使えるよ。
なかなか高機能のアセンブラといえるね。
またBintodbというファイルはバイナリエディタだよ。
0659名無し@沢村
NGNGmasm32v8なら
http://www.movsd.com/
からダウンロードできるよ。
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNGQEditorなんて使ってられないよ
0662デフォルトの名無しさん
NGNGWin98DDKならまだ落とせる。ただし直リンのみ。入っているmasmは6.11。
http://download.microsoft.com/download/win98SE/Install/Gold/W98/EN-US/98DDK.EXE
0663デフォルトの名無しさん
NGNGいい加減なコードを読ませたら、最適化しつつアセンブルしてくれるようなアセンブラって無いですか?
push ESIとpop ESIで囲っている領域で、ESIを使って無かったら自動でpush/popも取り除いてくれるとか
計算を一時的にスタックを使って行っても、勝手に未使用レジスタを割り当ててくれるとか。
…無いですよね。無いですね。
0664デフォルトの名無しさん
NGNGそこまでやられたら、アセンブラの意味がないような…
やるならプリプロセスかなぁ?探せばありそう。
0665デフォルトの名無しさん
NGNG今では TIのDSPくらいしか見ないな
0666デフォルトの名無しさん
NGNGまだあったのか・・・わざわざInternet Archiveで落としてた
0667デフォルトの名無しさん
NGNG欲しい人いる?
0668デフォルトの名無しさん
NGNG別にインストールせずとも簡単に取り出せるわけだし。
0669名無し@沢村
NGNGおれはアセンブル言語でHelloWolrdをつくったよ。
コンソールじゃないぞ。ちゃんとしたWindowsアプリケーションだぞ!アセンブラでだぞ!
おれは天才だな♪
http://hp.vector.co.jp/authors/VA015412/
0670山崎渉
NGNG0671デフォルトの名無しさん
NGNGブラクラ
0672デフォルトの名無しさん
NGNGライブラリーとか付いて無いし単体だけあってもいみねーしー
0673デフォルトの名無しさん
NGNG上からVC++ 6.0のプロセッサーパックvcpp.exeを落としてきて
解凍して、
ml.exe
ml.err
h2inc.exe
h2inc.err
を抜き出して、MASMという名前か何かのフォルダに仕舞えば完了ですか?
あと説明書として
PPreadme.htm
procpack.chm
MasmRef.doc
も必要かな。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGわかりにくいので
追加使用許諾契約書>承諾する>
ttp://download.microsoft.com/download/vb60ent/Update/6/W9X2KXP/EN-US/vcpp.exe
で落とせるぞ。
vcpp.cabにして解凍する。
MASMの意味がわかってないんだけどね。
h2inc.exeはいらないのか?
0676デフォルトの名無しさん
NGNG0677デフォルトの名無しさん
NGNGとかすればc:\tmpに解凍できるんだけどな。
0678デフォルトの名無しさん
NGNG変換してくれるツールはないですか?フリーで
または、インテルのサイトのマニュアルをふつうのテキストファイルか
またはHTMLファイルに変換して公開しているところはないですか?
0679デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=pdf2txt&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0680デフォルトの名無しさん
NGNGそれだけだとアセンブラだけですよね。
ライブラリ、リンカ、逆アセンブラ・・・・
実際にMASMにはこの他に何があるのでしょうか?
教えてください。
0681名無し@沢村
NGNGハゲ!!おまい、PDFをふつーのテキストにしたら図や写真が見れねーだろ!!
PDFはRTFかHTMLにしねーとダメよ。
アクロバットリーダーはコピー&ペーストができねーから不便ではあるよな。
コピー&ペーストでもっと簡潔に読みやすくしてファイルサイズを小さくできると便利だよな。
おまいはちゃんと考えてみろ?
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNG0684デフォルトの名無しさん
NGNG0685名無し@沢村
NGNGハゲ!!アクロバットはフリーでDLできるよ。
10MB近くあるけど落とせ。
またテキストに変換するにはアクロバットでPDFを開いて「全て選択」「コピー」をし、
ワードパッドか何かにペーストすればいいよ。ただしテキストだけ、図や写真は無理だけどな…。
またPDFはサイズがでかいものが多いから、メモ帳じゃ無理があるよ。
ワードパッドかWORDのほうがいいよ。
0686デフォルトの名無しさん
NGNGへえどのワレで落としたんだ?
0687名無し@沢村
NGNGハゲ!!ここから落とせるつーの!!
http://www.adobe.co.jp/products/acrobat/readstep2.html
0688デフォルトの名無しさん
NGNGそれは、Acrobat Readerであって、Acrobatとは違う。
0689デフォルトの名無しさん
NGNGAcrobat Readerにはコピーするテキストの長さに制限がある。
0690名無し@沢村
NGNGだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁあああああああああああ
あああああああああああああああああああああああああああ
あああああああああああああああああああああああああああ
あああああああああああああああーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーっ!!!きさまぁぁぁぁあああ
あああああああーーーーーーーーーーーーーーーーーーっ!
0691デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
NGNG> Acrobat Readerにはコピーするテキストの長さに制限がある。
ふ〜〜〜ん、今 800ページ (6MB) ぐらいのやってみたけど、ちゃんとコピペできたよ。
どこまで必要なの ?
まさか、メモ帳に貼り付けて途中までしかコピーしてね−とか騒いでいる厨房じゃないよね ? (藁
0693デフォルトの名無しさん
NGNG0694デフォルトの名無しさん
NGNG0695デフォルトの名無しさん
NGNG特撮板のシャイダースレ見るとき困る(爆)
0696デフォルトの名無しさん
NGNG0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNG1オペコードごとのクロック数が書いてあるんですが
今のインテルから落とせるマニュアルに(中巻)に
はクロック数とか書いてないんですよね
686とかNetburstは
1オペコードあたりのクロックは状況によりけりってことでしょうか
0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNG順序どおりに実行されないし(結果は順序どおりに反映されるけど)、
レジスタリネーミングなんかもあいまって、内部で起こってることを予想するのすら困難。
ハッキリしてたのは586までかな。
0701今日始めますた
NGNGhttp://www5c.biglobe.ne.jp/~ecb/assembler2/assembler10.html
にあるプログラムを入力して、EXEを作ることは出来るのですが、
なぜか実行するとエラーが出ます。
このサイトにリンクされてる
「多摩ソフトウェア LASM Ver2.32 体験版」
でコンパイルしたからでしょうか?
環境はWin98SEであります。
0702デフォルトの名無しさん
NGNGどんなエラーがでるかくらい書け。
それから、そのページのプログラムはみんな.com用の様だが?
0703デフォルトの名無しさん
NGNGCOMなんて時代遅れスよ。これからは.Net
0704デフォルトの名無しさん
NGNG最近ブックオフで「はじめて読む8086」という本を偶然見つけて買いました。
MS−DOSのコマンドプロンプトで簡易的にアセンブラを体験できる事を初めて知りました。
とりあえずこの本をマスターしようと思います。
0705デフォルトの名無しさん
NGNG普通に他の言語覚えれば?人生は短いよ。
0706704
NGNG今はCOBOLERです。
古いプログラムにはアセンブラもあるので、それを少しでも分かればと思って。
704の本はもう今週中には読み終えるので、それからC言語の復習→Javaと勉強する予定です。
IBM汎用機のアセンブラの本も同時並行で読んでいくつもりです。
0707デフォルトの名無しさん
NGNGintとかの割りこみは勉強になるだろうけど。
これからやるなら386以降が楽しいと思う。
0708704
NGNG0709デフォルトの名無しさん
NGNG本買う必要ないよ。入門書は1冊軽く読む程度でok。
図書館行った方が良質な本が見つかる可能性が高い。
CPUがIntelであれば、マニュアルはWebサイトから落とせる。
あとはgoogleでasmやらeaxやらで検索すれば色々サイトが見つかる。
例えば
ttp://tt.sakura.ne.jp/~suzu/asm/index.html
とか。
上のサイトでも書いてある様に、32bitのアセンブラはCと連携する
事が多いから、Cも多少かじっとくと学習効率がいいよ。
(アセンブラだけでももちろんいいけど)
0710デフォルトの名無しさん
NGNGhttp://www.intel.com/jp/developer/design/pentiumiii/manuals/
ここの
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル、上巻:基本アーキテクチャ (日本語 PDF ファイル: 4,183KB)
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル、中巻:命令セット・リファレンス (日本語 PDF ファイル: 9,139KB)
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻:システム・プログラミング・ガイド (日本語 PDF ファイル: 7,838KB)
この3つの中身は知っておいた方がいいよ。
(命令とかを全部覚える必要は全くない)
0711デフォルトの名無しさん
NGNGttp://www.e-net.or.jp/user/missing-link/assembler/menu.html
ここの掲示板は結構人が来てる
0712デフォルトの名無しさん
NGNG0713名無し@沢村
NGNGふつーの言語では演算によって結果を求めるが、量子指向言語ではすべての結果は重ねあわせの状態ですでに存在しているから、その中から求める結果を選ぶだけよ。
求める結果は重ねあわせの係数で決まるのよ。
このあたりがいままでの言語と大きく文法が異なるところだな。
つまり画期的よ!!!
おまいらよ、これからの言語といったら量子指向言語しかないぞ!!量子でない言語なんてザコだぞ!!
0714デフォルトの名無しさん
NGNGいいから病院いけ
そんなんだとこの先つらいぞ
0715デフォルトの名無しさん
NGNGなんでそんな簡単に釣られる...。
いいかげん放置しとけよ。
0716山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0717デフォルトの名無しさん
NGNG0718デフォルトの名無しさん
NGNGなぁ、ヌヒよ。それは、ニューロコンピューた言うんとちゃうのか?
0719デフォルトの名無しさん
NGNGこれ、俺からのお願いだ。
0720デフォルトの名無しさん
NGNG>>718 言わないしバカネタを重ねても面白くないし
0722デフォルトの名無しさん
NGNGショートカットみたいなことをしたいんですけど、
この場合
【1文字入力】
AH = 01,06,07,08のいずれか
DL = FFh(AH=06のときのみ)
INT 21h
これ↑は使えるのですか?
0723デフォルトの名無しさん
NGNG0724デフォルトの名無しさん
NGNGアセンブラなんだからCPUとOS書いた方がいいよ
0725デフォルトの名無しさん
NGNGとよく聞きますが、では、条件分岐とは具体的に何の命令を
指しているのでしょうか?
cmp, test, jmp, jz, jge, cmov, pcmpgt, ...?
0726デフォルトの名無しさん
NGNG例に出ているのだと
jz,jge
こういうことは、アセンブラで一通り書ける様になってから考慮すれ、
0728725
NGNGここで、divの使い方を聞いて、その後にMMXのソースを書いていた者です
jz,jgeは乱すけど、その他は乱さないのですね。
cmp,testが乱さないのは、なんだか驚きました、が、
動作の意味が非破壊(とかいうヤツ)だから納得しました。
ところで、jmpは乱すのですか?無条件なのに?
ようするに、書いてある順番に実行されるかされないか、ということ?
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG条件分岐は分岐する/しないが実行時でないと確定しない。
また、分岐先アドレスが即値ではなくレジスタが含まれる場合も同様。
「分岐予測」を参考のこと。
0731デフォルトの名無しさん
NGNG日 本 語 か ら や り な お し
0732デフォルトの名無しさん
NGNGadd eax, ebx
sub eax, ecx
みたいなレジスタのストールにぶち当たった
(スケジューラでも並び替えできなかった)
場合の遅延時間はやっぱり同じなの?
0733デフォルトの名無しさん
NGNG違うものを比較してどうする?
0734デフォルトの名無しさん
NGNG試してないので想像だがレジスタリネーミング失敗のペナルティの方が
断然小さいと思われ。
条件分岐の予測失敗がおきると、並行して実行していた後の命令を
途中ですべて捨てて最初からやり直しになる。
パイプラインあたりを勉強しる!
0735デフォルトの名無しさん
NGNGpush ebp ・・・・ア
この次の行で
mov ebp,esp ・・・・イ
こうする事になんの意味があるんでしょうか?
「ア」でebpの値(仮にA)がスタックespに保存され、
「イ」ではスタックの最新の値(つまり、A)がebpに上書きされるだけで
ebpはA→Aで何も変化しませんよね?2行目はいらないんじゃ・・・
0736デフォルトの名無しさん
NGNG細かい事は気にしないほうがいいよ
0737デフォルトの名無しさん
NGNGebpを基準にローカル変数や引数をアクセスするわけです。
別の関数を呼ぶと、その関数の中で新しくスタックフレームを作り
関数終了時に呼び出し前の状態に戻さなければいけません。
そこで、push ebp で ebpを保存しておいて
mov ebp,esp で現在のスタックポインタを ebpに持ってくるわけです
関数終了時は逆に esp<-esp にして pop ebp する事になります。
0739デフォルトの名無しさん
NGNGmov ebp,esp と mov ebp,[esp]の違いが分かるか?
0741735
NGNG0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNG監視したいと思っています。ところが調べてみたところ、
このデータのアドレスが、毎回変わってしまうことに気づきました。
そこでそのアドレスを保持している箇所を調べてみました。
そこが固定な数値なら良かったのですが、実際は下記の通りで詰まってしまいました。
MOV DWORD PTR DS:[ESI+32],1
はたしてこのESIの値を特定することは、がんばれば可能なのでしょうか?
当方「はじめて読む8086」を読んだ程度しか無いので、
どんな些細なアドバイスでも頂ければ嬉しいです。
0744743
NGNG0745デフォルトの名無しさん
NGNG0746743
NGNGレスありがとうございます。凄い助かります。
やはり地道に追うのが一番なんですね。固定値でるまでやればいいのかな・・・。
貧弱な脳内ですが、ブレークポイント置きまくりで頑張ってみます。
しっかし難解ですねぇ(´Д⊂
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGこれが何の毎回かわからないけど、
その命令にブレークかけて、その時点のレジスタの値でデータのアドレスは
算出できるから、変わってしまうまではそのアドレスで監視できないの?
0749743
NGNG>>747
はい、残念ながら無いみたいなのです…(一応うちの専用ツールみたいですが)
>>748
言葉足らずですいません。毎回=対象ツールを起動する毎にです。
748さんの仰る通りにできる技術が、私にあれば良いのですが(´Д⊂
実際はReadProcessMemoryで、そのツールの指定アドレスを監視するのが精一杯でして・・・。
(Win環境で、監視ツール自体はC&WinAPIで書いてます)
しかしレジスタの値を、読めれば本当に一発ですね。
読むタイミングは問題無さそうなので、レジスタの読み方を勉強してみます。感謝です。
0750743
NGNGこれは失言でした・・・そんな単純じゃないですね。
0751デフォルトの名無しさん
NGNGWindowsなのか
だったらHookを使ってDLLを読ませてコード自体にパッチを当てるのが楽
0752743
NGNG馴染みのある言葉が、出てきてホッとしたのも束の間、
理解できる頭がなかったりで・・・。DLLの置き換えや
グローバルフックの事では無いですよね。
ちょっと検索したくらいじゃ分からなくて(レジスタの方も)・・・、
折角良いアドバイス頂いたのに、生かせなくて情けないやら不甲斐ないやら。
もう少し修行して出直してきます。方向示唆、ありがとうございました。
(それでもアセンブラ、面白いですねぇ)
0753デフォルトの名無しさん
NGNG以下のアセンブラコードを出力させると
#include <windows.h>
extern int f(int x);
void g()
{
f(0);
GetDC(0);
}
f()については、push/popが組になっているのですが
GetDC()についてはpushだけでpopがなく、
組になっていないのですが…なぜでしょうか?
なんか怖いのですが
0754デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNGMSDN読めってことですよ
cdecl
stdcall
で検索
0757デフォルトの名無しさん
NGNG「呼ばれ側の担当」かっていうルールが、言語毎にあるんでしょ?
0758デフォルトの名無しさん
NGNG0759753
NGNG引数についてのスタック管理権を持つか、
ということか…
Win32APIは、全部が__stdcallなのでしょうか?
http://msdn.microsoft.com/library/en-us/vclang/html/_core___stdcall.asp?frame=true
の最初に
The __stdcall calling convention is used to call Win32 API functions.
とあるけど…
0760デフォルトの名無しさん
NGNG注意書きがない場合はすべてそうです。
0761753
NGNG解決できて、すっきりしました。
どうもありがとう
0762デフォルトの名無しさん
NGNGモニターの機能を作りました(単に打った文字を表示するだけw)
そんでその機能をつかって簡単なタイピングを作ろうと思うのですが
バックスペース、エンター、カーソールキーを押すことでいろいろな
動作を行いたいのですがマイコンの方でどのようにこれらのキーを
押したことを判定すればいいのでしょうか?たとえばAという文字を
打つならマイコンの方でAにあたるアスキーコードで判定できるわけですが
これらのキーにもアスキーコードなりなにか割り当てられているのでしょうか?
0763デフォルトの名無しさん
NGNG機種依存なのでなんとも言えない。
エコーバックするプログラムが組めるんなら、
文字コードを表示するプログラムでも組んで確かめてみたら?
0764デフォルトの名無しさん
NGNGそうっすかー
地道に調べてみます・・・
0765デフォルトの名無しさん
NGNGちとオレも詳細キボンしていいかな
アプリやゲーム起動するごとに、それを感知してコードを書きかえるってこと?
違うか…
0766デフォルトの名無しさん
NGNGいやその通り
MOV DWORD PTR DS:[ESI+32],1
と前後の命令をサーチしてCALL命令なりに書きかえれば
ESIが得られるのではないかという話
0768デフォルトの名無しさん
NGNG吐かせると擬似命令で.cploadや.cprestoreが使用されてるんです。
デバッガで見ると擬似命令のところにレジスタに値を入れてるような
コードが・・・このcpload等の擬似命令がなんのものかご存知ないで
しょうか?
PIC(position-independent code)には必要とかなってて、どうも外部
ライブラリを呼び出す時に必要らしい?ところまではわかったのです
が、正確にはわからないでいます。ライブラリを呼び出さないサブルー
チン自身でも上記擬似命令で使用していないレジスタ操作をして、上
位にリターンして他の関数にはいったらまた破壊され・・・となんの役に
も立ってないように見えるんです。実際に削ってコードかいても一応
動作したりするのでより混乱してます。
0769デフォルトの名無しさん
NGNGWebからpdfが落とせるはず。
0770デフォルトの名無しさん
NGNGgpレジスタ使うシステム(libraryが使ってるとか)じゃなければ必要ないので、
gcc -mno-abicalls すればよろし。出力されないよ。
0771768
NGNG早速落として読んでみます。
>770
たしかにデバッガでみてみるとgpレジスタを更新してたような気がします。
正確にはマニュアルを読んで確認となるんでしょうが、教えていただいてgpレ
ジスタ相対のためのものって言うのがわかってかなりすっきりしました。
お二方ありがとうございました。
0772デフォルトの名無しさん
NGNGそれを表示するにはどうすればいいっすか?
アスキーコードしか使えない場合のみでお願いします
1を表示するには数値0x31、7を表示するには数値0x37
を入力するようにすればいいのですが17をどうやって
その二つに分ければいいのやらわからないっす
0773デフォルトの名無しさん
NGNG10の桁・・・10で割った数値に0x30足す
1の桁・・・10で割ったあまりに0x30足す
0774772
NGNGすみませんです・・・
68kアセンブラで割り算ができないのですが
その場合は地道に引き算しかないですか?
0775デフォルトの名無しさん
NGNG>68kアセンブラで割り算ができないのですが
意味が分からない。
本当にアセンブラが割り算命令を解釈できないなら
命令コードを直接数値で書いてしまえばいい。
0776デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNGこれこれ、嘘はいけません。
divs/divu命令ありますがな。
68kのアセンブラなら、ぐぐれば過去の遺産が大量に引っかかるはず。
0779デフォルトの名無しさん
NGNGむちゃくちゃ遅いがナ
0780デフォルトの名無しさん
NGNGその値は不定なのでしょうか?
なんだか妙な感じにみえるのですが
0781780
NGNG私のは関係無くて、Intel系の話です
0782デフォルトの名無しさん
NGNG8086とか最初のころに未定義としてしまったから、以降もわざわざ
定義せずにいるほうがプロセッサの実装が楽になるかもとかあった
のではないでしょうか?
最近だとちゃんと命令順に実行されないので更に複雑怪奇なフラグ
反応になってるか、NOPのように無反応とかかも・・・
0783772
NGNGあ、検索にひっかかりましたね・・・
日本語のサイトばっか探してたんでダメだったみたいです(w
これからはそれをつかってやります(やっぱ見にくいし)
引き続き駄レスすみませんでした
0784デフォルトの名無しさん
NGNGつまり、不定ということですか?
歴史的な理由があったのですか…しらんかった
フラグを使えないのは不便だな〜
0785デフォルトの名無しさん
NGNG本家ザイログ製のZ80はだいぶ前に製造中止だが、
互換チップは何種類か生産されていて現役。
Z80プログラムの需要もある。
0786デフォルトの名無しさん
NGNG以下のようなコードをよくみます
push ebp
mov ebp,esp
この時点でebpとespが同じ値を持ってますが…
アセンブラがわざわざmovしているのだから、
ebpにespの値をセットしておくことは重要だ
(プログラマはebpレジスタを破壊してはいけない)
と思いました。
それでは、もともとその値を保持していたespレジスタは、
もはや破壊してよい
(プログラマはespレジスタを自由に使ってよい)
といことなのでしょうか?
つまり、関数の中で
自由に使ってよい...eax,ebx,ecx,edx,esi,edi,esp
使えない...ebp
ということでしょうか?
0787デフォルトの名無しさん
NGNG> それでは、もともとその値を保持していたespレジスタは、
> もはや破壊してよい
まあこれはいいとして (よくないけど) ...
> 自由に使ってよい...eax,ebx,ecx,edx,esi,edi,esp
なんでこんな結論に至るんだ ?
eax, ... edi は保存されて無いだろ。
0788デフォルトの名無しさん
NGNG>なんでこんな結論に至るんだ ?
>eax, ... edi は保存されて無いだろ。
保存しておけば、自由に使っていいのですね?
これらのレジスタを使ったら、保存するコードを
プログラマが書かなくても、アセンブラが自動的に
追加してくれているようでした(ありがたいことだ)
ところで、
>> それでは、もともとその値を保持していたespレジスタは、
>> もはや破壊してよい
>まあこれはいいとして (よくないけど) ...
これは、どういうことでしょうか?
いい?わるい?
どっちでしょうか?
espもebpも、そのまま触れないでおくのでしょうか
0789デフォルトの名無しさん
NGNGきがおきまへん。
0790デフォルトの名無しさん
NGNG0791デフォルトの名無しさん
NGNG> マジレスするならコンパイラ依存
わかりました。
スレを汚して失礼しました。
あ〜
0792デフォルトの名無しさん
NGNG特定の値に序所に近づけていくためのコードを究極にまで高速化したいんですけど
良い方法ないですかね?、3ヶ月ほど悩んでるんで。
無かったら放置でお願いします、
まぁ微妙にスレ違いですけどほかに適所がみつからなかったんで、
C言語か86アセンブラでお願いします
int value = xxx;
int value_target = 5120;
void func(){
if(value < value_target)value++;
if(value_target < value)value--;
}
0793デフォルトの名無しさん
NGNG0794デフォルトの名無しさん
NGNG秒間41000かいよばれます
0795デフォルトの名無しさん
NGNG0796デフォルトの名無しさん
NGNG0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNGまぁ結局条件分岐つかうしかないんですかね…
0799796
NGNGMOV EAX,[value]
MOV ECX,[value_target]
CMP EAX,ECX
ADC EAX,0
CMP ECX,EAX
SBB EAX,0
value<0もあるなら普通に汁
0800デフォルトの名無しさん
NGNGADC r/m,0
SBC r/m,0
0801デフォルトの名無しさん
NGNG0802デフォルトの名無しさん
NGNGしかもSBCはZ80だった
0803デフォルトの名無しさん
NGNGなるほど、サンクス。
しかしこれ、変化量1以外だと無理っす…
ようするにあきらめて条件分岐しろってことですかね
0804デフォルトの名無しさん
NGNGAND EAX,任意
ADD 何か,EAX
とか
クリッピングがレアケースなら
分岐予測に任せた方が速い場合もあるよ
0805796
NGNG>>803
MOV EAX,[value]
MOV ECX,[value_target]
CMP EAX,ECX
SBB EDX,EDX
AND EDX,-変化量
ADD EAX,EDX
後半は自分で考えて
0807デフォルトの名無しさん
NGNGどうもありがとうござました。
0808デフォルトの名無しさん
NGNGずっと悩んでたんだけどまさかSBBを使うとは…
こういうのってアセンブラやってる人にとっては常識っぽいけど
どうやって勉強してるんですか?
まぁそれを調べるのからして
自分でしなきゃダメって言われたらもうそのとおりなんですけど。
0809デフォルトの名無しさん
NGNG99%の努力(人のソースを読む、コンパイラの出力を読む、gccのソースを読む)、
そして1%のひらめき。
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNG> これは、どういうことでしょうか?
> いい?わるい?
いいか悪いか自分で判断できないなら使うなよ。
0812デフォルトの名無しさん
NGNGAX == 0 -> CF = 0
AX != 0 -> CF = 1
とするにはどうすればいいのでしょうか?
0813デフォルトの名無しさん
NGNGCMP AX,1
無理してアセンブラ使わないほうが良いんじゃない?
0814デフォルトの名無しさん
NGNGこれって AX == 2 のときでもキャリーフラグが立つのでしょうか?
0815デフォルトの名無しさん
NGNG0816デフォルトの名無しさん
NGNGあぁ、なるほど!
どうもありがとうございました
0817デフォルトの名無しさん
NGNG0818デフォルトの名無しさん
NGNGregister short int a = 100;
register short int b = -200;
a = b / 2;
if ( a > b ) a = 1;
else a = 0;
}
上のCソースに対してgcc -Sを使って吐かせると、
a = b / 2の部分が以下のように出力されました。
movl $-200, %edx
movl %edx, %eax
sarw $15, %ax
shrw $15, %ax
leal (%eax,%edx), %eax
sarw %ax
私は、この部分は、算術右シフト命令のsarだけで終わると
予想していたのですが・・・。
なぜ上のようになるのでしょうか?
どなたか教えてください。
0819デフォルトの名無しさん
NGNG0820818
NGNG符号を表す最上位ビットを取り出して、
それを加算することによって0の方向に丸められるようにする
これで、あってますか?
これで一応解決しましたが、気になる所が・・・
先ほどのアセンブラの
sarw $15, %ax
shrw $15, %ax
この部分は、なぜ算術右シフトをした後に、シフトしているのでしょうか?
シフトだけで良いような気がするのですが・・・。
0821デフォルトの名無しさん
NGNG0823デフォルトの名無しさん
NGNGたぶんさ、short にしてるでしょ? だからそこまで最適化されてないんじゃないの?
コンパイラにしては頑張ってるコードだと思うよ。
自分なら符号付1/2は 左シフトして Add With Carry して算術シフトかな
0824818
NGNG> 確かにsarwは不要だと思うよ。
> たぶんさ、short にしてるでしょ? だからそこまで最適化されてないんじゃないの?
> コンパイラにしては頑張ってるコードだと思うよ。
なるほど。
> 自分なら符号付1/2は 左シフトして Add With Carry して算術シフトかな
おぉ、そういう方法もありますね。
16ビットシフトして最上位ビットがキャリーフラグに入るのを利用する、ということですね。
いろいろと勉強になりました。最後にひとつ。
sarw %axはsarw $1, %axと同等ですよね?
0825デフォルトの名無しさん
NGNG他に sar 15bit して 元から引くという方法もあるね
0827デフォルトの名無しさん
NGNG0829786
NGNG>以下のようなコードをよくみます
>push ebp
>mov ebp,esp
786でこんな質問をしました。
なんとなく意味がわかってきた気がするのですが、
以下であっていますか?
ebpはこの関数でこれから使うスタックの先頭を指し、
espはスタックの最後を指す。
スタックの最後とは、この関数で使うスタックの最後でもあるし、
プログラム全体で使っているスタックの最後でもある。
C++のコンテナクラスのbegin(),end()に似ている。
0830786
NGNG文字列でたとえると、
| ↓ebp ↓esp
|■■■■□□□□□
|
←メモリの後方 メモリの前方→
ebpの値を保存し、ebpにespの値をいれる事で
部分文字列の先頭をセットする。
この先頭の位置を基準にして文字を追加していく。
追加するたびに最後の位置を表すespが進む。
関数の最初でebpとespが同じ値になっているのは
まだなにも追加していないからだ。
push eax と書いてある場合、espはここに表示されてないが
espの値は変更される。
ebp,espともに大事な値を管理しているので
破壊してはならない。
0831デフォルトの名無しさん
NGNGmov ebp,esp
とするのは、そのようにした方が関数の引数やローカル変数が扱いやすいから。
引数やローカル変数はスタック上に置かれるが、espを基準にアクセスすると
push/popするたびに基準の位置が変わってしまって面倒。そこで、関数に
入った時点のespの値をebpに入れて、以降はebpを基準にアクセスする。
最近はめったに使われないが、これのための命令としてenter, leaveというものもある。
0832デフォルトの名無しさん
NGNGする。この場合、EBPはレジスタ変数として使える。
EBPを使う場合は命令長が短くなるのがメリット、なんだけど、
Pentium以降のコードキャッシュが大きいCPUでは殆ど意味が
ないんじゃないかと思う。
0833デフォルトの名無しさん
NGNGgcc だと omit-frame-pointer あたりで抑制可能。
それやっておくと、ebp+4 が常にreturn address となって色々ハッピーなのだよ。
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGoffsetってアセンブラがアセンブル時に
解決してくれるのでしょうか?
(global_xは大域変数です)
(A)は「レジスタに即値を転送」ですか?
(B) mov edi, offset global_x+4
この例もそうですか?足し算をしてますが…
0836デフォルトの名無しさん
NGNGどいつもこいつも質問する奴は手を動かさないカスばかり
0837デフォルトの名無しさん
NGNG0838( ´-`)y-~~~
NGNG0839デフォルトの名無しさん
NGNG0840MMX初心者
NGNG自前でループする時のコストが高いのかな。
0841( ´-`)y-~~~
NGNGアラインメントはok?
>>414 でも参照しれ
0843デフォルトの名無しさん
NGNGとりあえず、ソースさらせ
話はそれからだ
0844840携帯
NGNGPC壊れた(涙
どうもグラフィックカードが曲がった感じです。
ケーブル抜かずに引っ張り出したのがいけなかったみたい。
修理後、ベンチやり直して今回の謎(漏れだけか?)を解明したいと思います。
という訳で次の方どうぞ。
0845デフォルトの名無しさん
NGNG0846デフォルトの名無しさん
NGNG何かいい書籍orサイトありますか?
アセンブリ言語はほとんど未経験なので、本当に初心者向けのものがいいです。
0847デフォルトの名無しさん
NGNGが一番じゃね?
0848デフォルトの名無しさん
NGNG0849デフォルトの名無しさん
NGNGhttp://www.nk.rim.or.jp/~jun/lxasm/asm_idx.html
http://www.geocities.com/SiliconValley/Ridge/2544/asm/assembler.html
0850デフォルトの名無しさん
NGNG0851デフォルトの名無しさん
NGNG0852デフォルトの名無しさん
NGNG値を直接転送することはできないのでしょうか?
汎用レジスタで計算したあと、いちいちメモリに書きこんで、
それをロードする形式をとっているのですが、もどかしく感じます。
(特に、関数を呼び出して、その返り値を使うとき)
0853デフォルトの名無しさん
NGNGああ? CPUは何かね?
0854840 MMX初心者
NGNGmovntq[MMX2]なんてあったんですね。
また質問お願いします。
PIIIからP4に変えたのですが、
P4で正確に実行クロック数を測定するのは無理ですか?
いろいろやってみたのですがダメでした。
HTは無効にしてあります。
宜しくお願いします。
{PIIIの時のソース}
xor eax,eax
cpuid
rdtsc
mov start,eax
mov start+4,edx
xor eax,eax
cpuid
[テストしたいコード]
nop
nop
xor eax,eax
cpuid
rdtsc
mov end,eax
mov end+4,edx
テストしたいコードがある時と無い時の差を実クロックとしています。
0856デフォルトの名無しさん
NGNG0857デフォルトの名無しさん
NGNGは?なんでそう思うんだよ
0858855
NGNG・汎用レジスタと浮動小数点レジスタは直接やりとりできない(?)
・MMXレジスタと浮動小数点レジスタは同じもの
と思ったからです。
そんなことはなく、汎用レジスタとMMXレジスタは
直接やりとりできるのか
0859デフォルトの名無しさん
NGNG0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNG0862デフォルトの名無しさん
NGNGそうかもしれない。
0863デフォルトの名無しさん
NGNGソフトウェアから見たら同じに見えるだけで、内部的には別物じゃなかったか。
0864デフォルトの名無しさん
NGNG命令上、別のレジスタに見えるけど、内部は同じもの
じゃないの?
0865デフォルトの名無しさん
NGNGPenIIから内部的に別レジスタになったんじゃなかったかな
仕様との辻褄あわせをどうやってるかは知らない
(ペナルティが発生する?)
0866デフォルトの名無しさん
NGNGmovd mm0, p
pxor mm1, mm1
punpcklbw mm0, mm1
movq mm2, mm0
punpcklwd mm0, mm1
cvtpi2ps xmm0, mm0
punpckhwd mm2, mm1
cvtpi2ps xmm1, mm2
movlhps xmm0, xmm1
で、p を xmm0 に入れることができたのですが、もうちょっと簡単な(効率が良い)やり方があったら教えてください。
同様に
cvtps2pi mm0, xmm0
packssdw mm0, mm1 //packusdw が何故か無い・・・
shufps xmm1, xmm1, 78
cvtps2pi mm2, xmm0
packssdw mm2, mm1 //packusdw が何故か無い・・・
packuswb mm0, mm2
movd p, mm0
で、xmm0 を p に戻すことができたのですが、もうちょっと簡単な(効率が良い)やり方があったら教えてください。
0867デフォルトの名無しさん
NGNG0868デフォルトの名無しさん
NGNGL2:
下のほう
movl$1,%eax
addl%eax,%ebx
movl%ebx,-16(%ebp)
movl$100000,%eax
cmpl%eax,%ebx ←ここについて突っ込み無用(w
movl-16(%ebp),%eax
movl-8(%ebp),%ebx
jlL2:
な感じしたんですけどjlでL2のアドレス(004010CB)に飛ばず
おかしなアドレス(003FDECB)に飛んでSegmentation faultが
発生するんです。
何かご存知の方がいたらご教授ください。
お願いします。
0869デフォルトの名無しさん
NGNG標準語でおながいします。
0870デフォルトの名無しさん
NGNGどう組めばいんでしょか?
0872_
NGNG0873デフォルトの名無しさん
NGNGスレ違いの悪寒
0874デフォルトの名無しさん
NGNG0040128E 8B 8D 50 E5 F9 FF mov ecx,dword ptr [ebp-61AB0h]
00401294 29 C7 sub edi,eax
00401296 01 F7 add edi,esi
00401298 8D B5 54 E5 F9 FF lea esi,[ebp-61AACh]
0040129E 89 7D D4 mov dword ptr [ebp-2Ch],edi
004012A1 8B 7D F4 mov edi,dword ptr [ebp-0Ch]
004012A4 B8 01 00 00 00 mov eax,1
004012A9 01 C3 add ebx,eax
004012AB 89 5D F0 mov dword ptr [ebp-10h],ebx
というコードが、0040129Eのmov命令を実行すると
0040128E 8B 8D 50 E5 F9 FF mov ecx,dword ptr [ebp-61AB0h]
00401294 29 C7 sub edi,eax
00401296 01 F7 add edi,esi
00401298 8D B5 54 E5 F9 FF lea esi,[ebp-61AACh]
0040129E 89 db 89h ←変わってる
0040129F 7D db 7dh ←変わってる
004012A0 D4 8B aamb 8Bh ←変わってる
004012A2 7D F4 jge 00401298 ←変わってる
004012A4 B8 01 00 00 00 mov eax,1
004012A9 01 C3 add ebx,eax
004012AB 89 5D F0 mov dword ptr [ebp-10h],ebx
ようになってしまうんです。
何かご存知の方がいたらご教授ください。
お願いします。
0875デフォルトの名無しさん
NGNGIDEのバグじゃないの?
なに使っているか位書かないと。
0876デフォルトの名無しさん
NGNGそんな現象出会ったことないよ。
デバッガのバグか、自分のプログラムが悪いと思う。
0877876
NGNG寂れたスレだと思ってゆっくり書いたら・・・
割り込まれた!
0878デフォルトの名無しさん
NGNG0880>>874
NGNGレスありがとうございます。
すいません、IDEはVisual Studio.net(vc7)です。
レジスタ値は、mov前が
EAX = 0000000F EBX = 00000000 ECX = 00000004 EDX = 0000000D ESI = 007AE2F4
EDI = FFFFFFF4 EIP = 0040129E ESP = 007AE297 EBP = 0080FDA0 EFL = 00000282
CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 0038 GS = 0000
OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 0 PE = 0 CY = 0
mov後が
EAX = 0000000F EBX = 00000000 ECX = 00000004 EDX = 0000000D ESI = 007AE2F4
EDI = FFFFFFF4 EIP = 004012A0 ESP = 00000004 EBP = 0080FDA0 EFL = 00000282
CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 0038 GS = 0000
OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 0 PE = 0 CY = 0
となっています。
元々、Visual Studio6が入っていたのですが、.netを少し使うために、
余計なことを考えずに済むようvmware上にVisual Studio.netを
入れたのですが、VS6上ではこのような現象がおきていないため
vmwareが何か関係しているのかな?と、今は考えています。
もちろんVS7のバグの可能性もあるのですが。。。
>>868ではないのですが、868のようなジャンプ先アドレスの
異常もあったりしました。vmware上での開発で何か不具合が発生する等
ご存知の方がいればぜひ教えてください。
ありがとうございました。
0881デフォルトの名無しさん
NGNGESPがとんでもない値になってるな
まあVMwareのバグだろうね
0882山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0883デフォルトの名無しさん
NGNGこのあたりの事について初心者向けに詳しく説明した
HPはありませんか?
0884デフォルトの名無しさん
NGNGHPは知らんが
http://pc2.2ch.net/test/read.cgi/tech/1035288252/
のスレで詳しく騙ってた香具師がいるよ
0885883
NGNGhttp://pc2.2ch.net/test/read.cgi/tech/1035288252/173-
0886デフォルトの名無しさん
NGNG取り敢えず、そこのMODRMの説明で分からなければ
もう1度、最初から勉強した方が良い
0887883
NGNG例えば、
MOV EAX,EBX // 89 D8
は MOV r/m32,r32 なので、OPコードは 89 /r になる。
/r は、命令のModR/Mバイトにレジスタオペランドとr/mオペランドが
入っている事を示す。 ここが??です。
機械語なら俺に質問しろ!スレで、両方がレジスタの時は mod は 11 とあったので、
次の3ビットが転送元のレジスタ(EBX→011)
その次の3ビットが転送先のレジスタ(EAX→000)
合わせて 11 011 000 = 0xD8
という事ですか? 答えから過程を導き出していますが…。
MOV AX,BX // 66 89 D8
0x66 はアドレスサイズのプリフィックスだそうです。 ここも??。
MOV [EAX],EBX // 89 18
0x18 = 00 011 000
つまり、
MOV r/m32,r32 において、転送元r32は常にレジスタなので、
ModR/Mバイトの真ん中3bitで転送元のレジスタ(8種類)を指定する。
上位2bitと下位3bitで転送先を指定する。
0888デフォルトの名無しさん
NGNG美少女のくっきりワレメが見れるサイトがあった…
http://plaza16.mbn.or.jp/~satchel/idolno_omanko/
0889デフォルトの名無しさん
NGNGMOV EAX,0x12345678
の場合は、OPコードが B8+rd 。
+rd
単一のオペコードバイトを形成するために、プラス符号の左に与えられた
16進バイトに追加される0から7までのレジスタコード。
B8 にレジスタEAXを表す 000 を足せばいいのかな?
よって、
B8 78 56 34 12
MOV ECX,0x12345678 なら、レジスタECXは001なので
B9 78 56 34 12
0890デフォルトの名無しさん
NGNGよく出来ました。
足すというのはちょっと違うだろと思うけど結果は同じだしな…
ちなみに0x66は32bitの代わりに16bitレジスタ/アドレスを使うということ。
0891デフォルトの名無しさん
NGNGWindows用ソフトを探してみた。
下の他にはHSPの拡張モジュールくらい。
意外に少ない。探し方が悪かったのかも。
CPUID&クロック周波数チェッカー
http://www.vector.co.jp/soft/win95/hardware/se171927.html
CDプレイヤー
http://www.vector.co.jp/soft/win95/art/se210568.html
汎用プロセスメモリエディタ兼デバッガ
http://www.vector.co.jp/soft/win95/hardware/se254476.html
メモリ解放ソフト
http://www.vector.co.jp/soft/win95/hardware/se221932.html
0892無職 ◆jIL7Zh6bTU
NGNGmov a,1
}
cout a << endl;
0893無職 ◆jIL7Zh6bTU
NGNG0894デフォルトの名無しさん
NGNGOpenWatcom ではVCと同じく _asm
BorlandやDigital Marsでは asm か _asm または __asm
0895デフォルトの名無しさん
NGNG_asm mul c
とやった場合、AXレジスタに値が入るのですが、16ビットの変数がないため型が合わず、値を受け取れません
どうすればいいのでしょうか?
0896デフォルトの名無しさん
NGNGint ans;
char c;
_asm {
mul c
and eax, 0FFFFh
mov ans, eax
}
とか。
0897デフォルトの名無しさん
NGNGそれよりも符号付きだからimulつかわんといかんはずだが。
0898デフォルトの名無しさん
NGNGコンパイラに、うまく私の気持ちが伝わらず、registerキーワードを使って
どの変数をレジスタに割り振って欲しいかをはっきり言おうと思ったのですが
この-rdすら無視します(?)
switch文のcaseの偏りが見えているので、それを考慮して
割り振らせたいのです…が、特殊な例(case)のところが
どうしても他と比べて長くなりがちで、たぶんそれで、
特定の変数の使用回数が増えて、だからレジスタに
割り振っているのだと想像しました
その特殊な例の部分を別の関数に掃き出すようにしようかとも
思いましたが…
0899デフォルトの名無しさん
NGNG0900デフォルトの名無しさん
NGNG「( ´,_ゝ`)プッ タブのつもりですか?」
だって。あいつら絶対俺たち舐めてるよ。今度締めなきゃな。
0901898
NGNG0902デフォルトの名無しさん
NGNG何か使いみちあるんでしょうか?
0903デフォルトの名無しさん
NGNG過去の遺物です。
命令長短いのでメモリをけちる時はそれなりに便利。
0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNGトレースキャッシュ搭載のPentium4以降ではほとんど意味が無い
0906902
NGNG0907デフォルトの名無しさん
NGNGをしたいのですが、本がなくてさっぱりわかりません。
例えば、unsigned char a[8] b[8]との内積の和
a[0]*b[0]+a[1]*b[1]+....
をSSE2で書くと、どのようになるのでしょうか。
よろしくお願いします。(_o_)
また、MMXで書いたものはあるのですが、
SSE2に直すことでさらなる速度アップは望めるのでしょうか。
0909デフォルトの名無しさん
NGNGマルチイクナイ(・Α・)
http://pc2.2ch.net/test/read.cgi/tech/1056280510/475
0910デフォルトの名無しさん
NGNGもうひとつのC++版でも聞いてしまいました。
そしたら、アセンブラ版に行けばどうかと、アドバイス
もらったもので。
0911_
NGNG0912デフォルトの名無しさん
NGNG▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
開店セール1枚 500円より→→→http://www.dvd-exp.com
最短でご注文いただいた翌日にお届け!→→→http://www.dvd-exp.com
セルビデオ店の人気商品が24時間お買い物が出来ます。
見やすい画面・注文簡単・時間をかけてゆっくり選んでください!
http://www.dvd-exp.com←へGO!
0913デフォルトの名無しさん
NGNG0914デフォルトの名無しさん
NGNG>>907 です。
誰か助けてください。お願いします。
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNG0917デフォルトの名無しさん
NGNG大部分がアセンブラだった(;´Д`) スゲー
別のCPUのエミュレーションソフトだから、アセンブラで書いた方が
いい部分がたくさんあることは確かなんだが・・・・
(一応アセンブラの他にVC++とVBも使ってましたが・・・
やっぱり向こうの人は凄いんだなぁ。。。
0918デフォルトの名無しさん
NGNGカコイイ
0919デフォルトの名無しさん
NGNGVBとアセンブラ併用するなんて面白いな
0920デフォルトの名無しさん
NGNGnasmのマニュアルに全部書いてあるよ。
英語で。
0921デフォルトの名無しさん
NGNG0922デフォルトの名無しさん
NGNGわお!ありがとうございます。
しばらくマニュアルと格闘してみます。
Visual Studio でSSEを使おうとするだけで、悪戦苦闘でした。
MMXはそのまま使えるのに、SSEは、プロセッサパックなるものを当てなければ
ならない上に、そいつはサービスパック4にしか対応してません。
サービスパック5を当てていた私は、VSのインストールからやり直す羽目に(涙
また、泣きつくこともあるかもしれませんが、よろしくお願いします。
0923デフォルトの名無しさん
NGNGオイオイ
VS6SP5用のVCPPもあるぞ
0924デフォルトの名無しさん
NGNGちゃんと調べろよ
0925デフォルトの名無しさん
NGNGttp://www.microsoft.com/japan/msdn/vstudio/downloads/
ここにあるVCPPだと、だめだったんですが…
0926デフォルトの名無しさん
NGNG0927デフォルトの名無しさん
NGNGああ?英語サイト見ろよ
0928
NGNGそれウソだよ。SP5 環境へは適用できない。
SP5 用に vcpp5.exe ってのが別にあります。
0929デフォルトの名無しさん
NGNG直ぐにお前らもこい!!
【遂に!?】ひろゆきがFFオンラインにキター【登場!】
http://game2.2ch.net/test/read.cgi/game/1059577730/2-
0930926
NGNGあぁ、そうなのか。スマソ
んじゃ、お詫びにこっち貼っておきまつ。
http://msdn.microsoft.com/vstudio/downloads/tools/ppack/download.aspx
0931デフォルトの名無しさん
NGNGなんとか、徐々に動き出しました。
また、よろしくお願いします。
0932デフォルトの名無しさん
NGNG開店セール500円より来てーーーー!アダルトDVDを見ようー!
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
開店セール1枚 500円より→→→http://www.dvd-exp.com
最短でご注文いただいた翌日にお届け!→→→http://www.dvd-exp.com
セルビデオ店の人気商品が24時間お買い物が出来ます。
見やすい画面・注文簡単・時間をかけてゆっくり選んでください!
http://www.dvd-exp.com←へGO!
0933_
NGNG0935デフォルトの名無しさん
NGNGintelの最適化マニュアルもう一度よく嫁
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNGもしかしてLEAの方が速いとか?
0938デフォルトの名無しさん
NGNGLEAが早くなるケースはありえない
lea reg1,[reg2+1]とかの状況依存のケース
があるとでも言いたいのだろう。
0939デフォルトの名無しさん
NGNGPentiumの話としました
0940938
NGNGINC reg
JC adr
JCでストールする。
0941デフォルトの名無しさん
NGNGいってたような気がする
0942デフォルトの名無しさん
NGNGコードが短いしバリバリ使ってますが・・・
0943デフォルトの名無しさん
NGNG最適化なんて興味おきない
0944山崎 渉
NGNG0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNGadd reg,1 ならもちろん1μOPS。
Pen4にとってinc/dec命令はトレースキャッシュや実行ユニットを
無駄に消費する長い命令だ。
0948デフォルトの名無しさん
NGNG0949デフォルトの名無しさん
NGNG0950デフォルトの名無しさん
NGNGワザワザ使う方がアホ。
0951デフォルトの名無しさん
NGNG時代はBASIC。
0952デフォルトの名無しさん
NGNG時代はCOBOL。
0953デフォルトの名無しさん
NGNG時代はPASCAL。
0954デフォルトの名無しさん
NGNGこれからの時代はこれですよ
0955デフォルトの名無しさん
NGNG−−−−−−−−−−−−修了−−−−−−−−−−−−
0956デフォルトの名無しさん
NGNG−−−−−−−−−−−−再開−−−−−−−−−−−−
0957デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNG−−−−−−−−−−−−初恋−−−−−−−−−−−−
0959デフォルトの名無しさん
NGNG−−−−−−−−−−−−妊娠−−−−−−−−−−−−
0960デフォルトの名無しさん
NGNG0961デフォルトの名無しさん
NGNG通り過ぎるだけです、スレには関知しません。
∧_∧ ∧_∧ ∧_∧
( ´∀`) ( ´∀`) (´・∀・`)
(_⌒ヽ (_⌒ヽ (_⌒ヽ
,)ノ `J ,)ノ `J ,)ノ `J
0962デフォルトの名無しさん
NGNG−−−−−−−−−−−−逮捕−−−−−−−−−−−−
0963デフォルトの名無しさん
NGNGとか言われてたのを思い出した。ありがとう。
0964デフォルトの名無しさん
NGNG載ってないのは何で?
0965デフォルトの名無しさん
NGNG過去の遺産だから
0966デフォルトの名無しさん
NGNG(´<_ ` )フーン
0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNG0971デフォルトの名無しさん
NGNG0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNGSSEの対抗
0974デフォルトの名無しさん
NGNGPerformanceなんとかというマニュアル?
0975デフォルトの名無しさん
NGNGhttp://www.google.com/
0976デフォルトの名無しさん
NGNGAMDのサイトにあるマニュアルのなかでどれが参考になるのか、きいてるのだが。
0977デフォルトの名無しさん
NGNGちゃんと何のマニュアルかかいてるだろ
それでもわからないならせめて全部読むくらいの努力はしような
0978デフォルトの名無しさん
NGNG全部落とすのが面倒だから聞いてるんだよ。
まあ、聞いてもわからないなら全部落とすけどね。
0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNGK6-2の頃にあった日本語ドキュメントはなくなってるね
まああるだけ無駄だったけど
0981デフォルトの名無しさん
NGNGマチクタビレタ〜
☆ チン 〃 Λ_Λ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < 次スレまだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
0982デフォルトの名無しさん
NGNG無理なわけないがな。w
まあ全部落とすことにするよ。
>>980
タイトルだけじゃ詳しい内容まではわからん。
0983デフォルトの名無しさん
NGNG0984デフォルトの名無しさん
NGNGレジスタの内容を一時的に退避して、後で使う場合、
・push/popを使う場合
push eax ;eaxにデータが格納されている
〜eaxを使う処理
pop eax
〜次の処理
・あらためてメモリ上の参照元データからレジスタにロードする場合
〜eaxを使う処理
mov eax, DWORD PTR 元データが格納された変数
〜次の処理
どっちが速いんでしょうか?
(push/popは2クロック掛かるから不利?)
0985デフォルトの名無しさん
NGNG気を使うだけ無駄でしょうか?
0986デフォルトの名無しさん
NGNGmov reg, [mem]は5〜6byte
0987デフォルトの名無しさん
NGNGスタックは1次キャッシュに乗ってる可能性がかなり高い
が、ベンチマークするとどっちもキャッシュに乗るから
差が出ない
0988デフォルトの名無しさん
NGNGCPUによって当然条件が違うからさ、
後5年くらいしてIA32が完全に枯れてから気を使った方がいい。
まあその頃はIA64で同じような事悩んでるんだろけどね。
レス数が950を超えています。1000を超えると書き込みができなくなります。