アセンブラ… (゜□゜) ↑アッー!↓

このエントリーをはてなブックマークに追加
935デフォルトの名無しさん:2007/02/14(水) 02:24:01
まあ、バイナリエディタで機械語直書きからアセンブラ、コンパイラ組み込み関数までいろいろ書き方はあるけど、
自分が使うCPUにどういう命令があって、その実行にどれだけのコストがかかるかという知識がいらなくなる時代はまだ当分こないだろうな。

重要なのはそういう知識であって、アセンブラの文法とか機能はわりとどうでもいい。
936デフォルトの名無しさん:2007/02/14(水) 02:25:59
そういう時代がきちゃったら、プログラマは廃れちゃうな
実力が
937デフォルトの名無しさん:2007/02/14(水) 10:06:54
CASL2のバイブル的な本ってどれですか。
入門書とかじゃなくて。
詳しく買いてるやつ。
938デフォルトの名無しさん:2007/02/14(水) 13:03:47
最近やたらめったらいろんなアーキテクチャの仕事があるんで
インストラクションセットを覚える暇すらない
みんな8bitとか16bitとかだけど
命令表を斜め読みして
「げ、左シフトねーじゃんこのCPU」とか
「符号反転ねーよ」とか
「乗算命令じゅーよー」だの
「わは。レジスタ4つ、こっちは32個ー」とか言いつつテンパってる
939デフォルトの名無しさん:2007/02/14(水) 13:55:11
>>938
でも一つもアセンブリ齧ってないとそれも判らないんだよね
940デフォルトの名無しさん:2007/02/14(水) 16:04:08
>>938
たぶんそう思ったヤツが高級言語作ろうと思ったんだろうな
941デフォルトの名無しさん:2007/02/14(水) 16:28:30
>>938
4つのせりふのうち3つは何だかわかった。

orz
942デフォルトの名無しさん:2007/02/14(水) 17:22:05
しかもハーバード型、ノイマン型も満遍なく取り揃えられておりますorz
943デフォルトの名無しさん:2007/02/14(水) 23:04:01
  そだ  |------、`⌒ー--、
  れが  |ハ{{ }} )))ヽ、l l ハ
  が   |、{ ハリノノノノノノ)、 l l
  い   |ヽヽー、彡彡ノノノ}  に
  い   |ヾヾヾヾヾヽ彡彡}  や
  !!    /:.:.:.ヾヾヾヾヽ彡彡} l っ
\__/{ l ii | l|} ハ、ヾ} ミ彡ト
彡シ ,ェ、、、ヾ{{ヽ} l|l ィェ=リ、シ} |l
lミ{ ゙イシモ'テ、ミヽ}シィ=ラ'ァ、 }ミ}} l
ヾミ    ̄~'ィ''': |゙:ー. ̄   lノ/l | |
ヾヾ   "  : : !、  `  lイノ l| |
 >l゙、    ー、,'ソ     /.|}、 l| |
:.lヽ ヽ   ー_ ‐-‐ァ'  /::ノl ト、
:.:.:.:\ヽ     二"  /::// /:.:.l:.:.
:.:.:.:.:.::ヽ:\     /::://:.:,':.:..:l:.:.
;.;.;.;.;;.:.:.:.\`ー-- '" //:.:.:;l:.:.:.:l:.:
難しい問題ほど、解けると達成感あるのよね。
944デフォルトの名無しさん:2007/02/17(土) 21:49:42
extern unsigned int crcTable[];
unsigned int updateCRC32( unsigned char *src, unsigned int size, unsigned int crc )
{
while ( size-- )
crc = ( crc << 8 ) ^ crcTable[ ( crc >> 24 ) ^ *src++ ];
return crc;
}
誰かこれを高速化して下され。
Cの範囲じゃやはりこれが限度っぽい。
後はアセンブラしかなさそうなのです。
せめてここまでコード最適化してからだね。
アルゴリズムの改良を試みずにアセンブラに頼るのは知性の敗北
http://www.intel.co.jp/jp/developer/technology/magazine/communications/slicing-by-8-0306.htm


コードはこちらからどーぞ
http://sourceforge.net/projects/slicing-by-8
946デフォルトの名無しさん:2007/02/17(土) 22:26:40
移植性のないポインタ変換とエンディアンの決め打ちがあるから
どちらかというとアセンブラで書くべきアルゴリズムだけどな
947デフォルトの名無しさん:2007/02/17(土) 22:35:18
>>937
CASLなんて通過した後は一切触らないから
毎年IPAが配ってる案内書に付属してる仕様書だけで十分。
命令が読めりゃ後は何も困ることないでしょ。
948デフォルトの名無しさん:2007/02/18(日) 05:22:21
>>944 のコードのままでも、do whileにしただけで1命令は速くなるね。
949デフォルトの名無しさん:2007/02/18(日) 06:47:01
mov eax, crc
mov ecx, size
mov esi, src
rep crc32
950デフォルトの名無しさん:2007/02/18(日) 08:06:08
>>948
処がだ、最近のコンパイラはforに特化した最適化をすることが多いから一概には言えない。
951デフォルトの名無しさん:2007/02/18(日) 14:09:14
最近のコンパイラは賢いからなぁ
ていうかCPUの内部が複雑杉
>>949
Nehalemキター
953デフォルトの名無しさん:2007/02/18(日) 14:50:04
コンパイラ何よ?
954デフォルトの名無しさん:2007/02/19(月) 07:54:37
ファミ通にアセンブラ経験者の求人が乗っててひいた
955デフォルトの名無しさん:2007/02/19(月) 18:22:15
アセンブラですか・・・漫画は読んだんだけどOKですかね?
とか?                          Z80でいいなら・・・(・∀・)
956デフォルトの名無しさん:2007/02/19(月) 20:26:41
いまさらZ80みたいな変態CPUは無いだろう。
どうみてもCell一択です

Wiiでもやるんかな、性能稼ぐために
958デフォルトの名無しさん:2007/02/20(火) 02:09:12
Wiiは既に死に体だからアセンブラ駆使してまでゲーム作んないぞ。
>Wiiは既に死に体だから
それはひょっとしてギャグで言ってるのか?
960デフォルトの名無しさん:2007/02/20(火) 04:53:08
>>956 川崎の石は現役ですよ。日立の64180はさすがに作ってないみたいだけど。
961デフォルトの名無しさん:2007/02/20(火) 06:07:13
>川崎の石
あの変態なZ80に、更に変態なメモリ管理命令増やした奴だっけ?
#いや、割りと好きですがw

>>957
この前は漏れがそう書いたら社員乙とか書かれた気がするが……
962デフォルトの名無しさん:2007/02/20(火) 06:52:22
>>957
今時アセで組む必要があるなんて
余程余裕のない組み込みか
Cellみたいな変な石使う時だろうしそうかもね
963デフォルトの名無しさん:2007/02/20(火) 08:31:10
質問です。ml.exeのインラインアセンブラを使って汎用レジスタと
セグメントレジスタの値を表示したいのですが、次のようなコードで
おkですか?

int eaxv, ebxv, ecxv, edxv, esiv, ediv, ebpv, espv;
wchar_t csv, dsv, ssv, esv, fsv, gsv;
eaxv = ebxv = ecxv = edxv = esiv = ediv = ebpv = espv = 0;
csv = dsv = ssv = esv = fsv = gsv = 0;
__asm {
mov eaxv, eax;
mov ebxv, ebx;
mov ecxv, ecx;
mov edxv, edx;
mov esiv, esi;
mov ediv, edi;
mov ebpv, ebp;
mov espv, esp;
mov csv, cs;
mov dsv, ds;
mov ssv, ss;
mov esv, es;
mov fsv, fs;
mov gsv, gs;
}
printf( "EAX=%08X EBX=%08X ECX=%08X EDX=%08X\n", eaxv, ebxv, ecxv, edxv );
printf( "ESI=%08X EDI=%08X EBP=%08X ESP=%08X\n", esiv, ediv, ebpv, espv );
printf( "CS=%04X DS=%04X SS=%04X ES=%04X FS=%04X GS=%04X\n", csv, dsv, ssv, esv, fsv, gsv );
964デフォルトの名無しさん:2007/02/20(火) 10:36:56
片っ端から変数に代入しようとすると、結局レジスタを消費してしまって正しく表示できないと思われ。
全部纏めてでなく、一個ずつやらないとダメなんでない?
#つーか、デバッガで見ることはできないのか?
965デフォルトの名無しさん:2007/02/20(火) 15:47:34
>944
速いかどうかは、解らないが、とりあえず国産CISCCPU(32bit?)の場合

#pragma PARAMETER update32(A0,R3R1,R2R0)
----
_updateCRC32:
$updateCRC32:
PUSHM A1
__loop:
MOV.W R2,A1
SHL.W #-8,A1

XOR.B [A0],A1
SHL.L #2,A1 ; Long Index
SHL.L #8,R2R0
XOR.L _crcTable[A1],R2R0
ADDX #1,A0
SUBX #1,R3R1
JNZ __loop

POPM A1
RTS
966デフォルトの名無しさん:2007/02/20(火) 18:50:36
>>964
スタックに突っ込めばいいんじゃないかな。
でもってespを適当な構造体のポインタに格納したりして。
967デフォルトの名無しさん:2007/02/20(火) 19:54:37
>>963
ml.exeのインラインアセンブラってなんだよ。 等の細かいツッコミは置いといて。
表示するだけならそれで良い。

アセンブリ出力(VC++なら/FAs)を出して確認すれ。
968デフォルトの名無しさん:2007/02/20(火) 23:42:56
インラインasm使う必要すらないじゃん
969デフォルトの名無しさん:2007/02/21(水) 02:43:28
>>964,>>966,>>967,>>968
みなさん、貴重なアドバイスをありがとうございます。
.asmファイルを見てみると、インラインアセンブラに対応するコードは
下のようになっていました。
余分な処理はないようなので、一応問題なくレジスタの内容を
ストア(?)できているようです。

mov DWORD PTR _eaxv$[ebp], eax
mov DWORD PTR _ebxv$[ebp], ebx
mov DWORD PTR _ecxv$[ebp], ecx
mov DWORD PTR _edxv$[ebp], edx
mov DWORD PTR _esiv$[ebp], esi
mov DWORD PTR _ediv$[ebp], edi
mov DWORD PTR _ebpv$[ebp], ebp
mov DWORD PTR _espv$[ebp], esp
mov WORD PTR _csv$[ebp], cs
mov WORD PTR _dsv$[ebp], ds
mov WORD PTR _ssv$[ebp], ss
mov WORD PTR _esv$[ebp], es
mov WORD PTR _fsv$[ebp], fs
mov WORD PTR _gsv$[ebp], gs
970デフォルトの名無しさん:2007/02/21(水) 14:15:18
WindowsだったらGetThreadContextで一発というオチ。
971デフォルトの名無しさん:2007/02/21(水) 14:40:27
GetThreadContextを自スレッドに呼び出すと呼び出しは成功するけど中身の保証は無し
972デフォルトの名無しさん:2007/02/23(金) 00:05:17
最近勉強中でちょっと悩みがあります。
メモリのアドレスを特定のルーチンだけで利用するんですが、
スタックに入れてpush,popするべきなのか、
メモリから読んでまた書き戻すべきなのか、
どっちがいいんでしょう?
値を更新するので所謂Cのポインタなのですが。
やはりスタックの方が若干速そうなのですがその内バグりそうです。
慣れるまではメモリを使うべきでしょうか?
973デフォルトの名無しさん:2007/02/23(金) 00:10:01
>>972
レジスタ
974デフォルトの名無しさん:2007/02/23(金) 01:12:27
65816アセンブラの勉強中で詰まってしまいました。
例えば
AD E0 11 LDA
で11E0の値が260以上ならXにジャンプ
260以下ならYにジャンプという命令はどのようにしたらいいですか?
AD E0 11
CD 60 02
F0 04
5C XX XX XX
5c YY YY YY
とやりましたがゼロフラグを使っての分岐なので
260だったときでした。
「260以上はXにジャンプ、260以下はYにジャンプ」の分岐の方法を
何方かご教授下さい。
975デフォルトの名無しさん:2007/02/23(金) 01:34:34
>>974
65816は知らんが、ニモニック表をよく見てみ。
条件分岐命令にゼロフラグチェック以外にもキャリーフラグチェックのがあるはずだから。
976デフォルトの名無しさん:2007/02/23(金) 03:01:21
>>974
おまい、OKWaveでも同じこときいてたな。>>975の説明でも
理解できなさそうだ。

なあ、206以下と260以上で分けるていってるけどさ、「260」のときは
どっちに分岐させんだいw

977デフォルトの名無しさん:2007/02/23(金) 08:47:17
>>975
65816ではこうやって覚えとけばいい。
同じ(A = CMP xxxx):BEQ F0
以外(A ≠ CMP xxxx):BNE D0
未満(A < CMP xxxx):BCC(BLT) 90
以上(A ≧ CMP xxxx):BCS(BGE) B0

あと、CD 60 02だとCMP $260、つまり$260番地の内容との比較になる。
即値と比較がしたかったらC9 60 02とやるべき。
978デフォルトの名無しさん:2007/02/23(金) 09:25:36
>>975
フラグの意味がわかってませんでした。

>>976
260以下と260未満でした。
すみません。

>>977
ありがとうございます!
無事260以上の命令が出来ました。

皆様お忙しい中有難うございました。
979デフォルトの名無しさん:2007/02/28(水) 00:03:34
> 260以下と260未満
980デフォルトの名無しさん:2007/03/17(土) 23:56:27
あげ
981デフォルトの名無しさん:2007/03/21(水) 00:07:46
age
982デフォルトの名無しさん:2007/03/21(水) 17:34:48
NASMでSSE3やそれ以上は使えるのですか。
983デフォルトの名無しさん:2007/03/21(水) 17:52:27
マクロアセンブラならどんなニモニックだろうと(自分で追加すれば)使える。
984デフォルトの名無しさん
まず勉強