まあ、バイナリエディタで機械語直書きからアセンブラ、コンパイラ組み込み関数までいろいろ書き方はあるけど、
自分が使うCPUにどういう命令があって、その実行にどれだけのコストがかかるかという知識がいらなくなる時代はまだ当分こないだろうな。
重要なのはそういう知識であって、アセンブラの文法とか機能はわりとどうでもいい。
そういう時代がきちゃったら、プログラマは廃れちゃうな
実力が
CASL2のバイブル的な本ってどれですか。
入門書とかじゃなくて。
詳しく買いてるやつ。
最近やたらめったらいろんなアーキテクチャの仕事があるんで
インストラクションセットを覚える暇すらない
みんな8bitとか16bitとかだけど
命令表を斜め読みして
「げ、左シフトねーじゃんこのCPU」とか
「符号反転ねーよ」とか
「乗算命令じゅーよー」だの
「わは。レジスタ4つ、こっちは32個ー」とか言いつつテンパってる
>>938 でも一つもアセンブリ齧ってないとそれも判らないんだよね
>>938 たぶんそう思ったヤツが高級言語作ろうと思ったんだろうな
>>938 4つのせりふのうち3つは何だかわかった。
orz
しかもハーバード型、ノイマン型も満遍なく取り揃えられておりますorz
そだ |------、`⌒ー--、
れが |ハ{{ }} )))ヽ、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の範囲じゃやはりこれが限度っぽい。
後はアセンブラしかなさそうなのです。
移植性のないポインタ変換とエンディアンの決め打ちがあるから
どちらかというとアセンブラで書くべきアルゴリズムだけどな
>>937 CASLなんて通過した後は一切触らないから
毎年IPAが配ってる案内書に付属してる仕様書だけで十分。
命令が読めりゃ後は何も困ることないでしょ。
>>944 のコードのままでも、do whileにしただけで1命令は速くなるね。
mov eax, crc
mov ecx, size
mov esi, src
rep crc32
>>948 処がだ、最近のコンパイラはforに特化した最適化をすることが多いから一概には言えない。
最近のコンパイラは賢いからなぁ
ていうかCPUの内部が複雑杉
コンパイラ何よ?
ファミ通にアセンブラ経験者の求人が乗っててひいた
アセンブラですか・・・漫画は読んだんだけどOKですかね?
とか? Z80でいいなら・・・(・∀・)
いまさらZ80みたいな変態CPUは無いだろう。
どうみてもCell一択です
Wiiでもやるんかな、性能稼ぐために
Wiiは既に死に体だからアセンブラ駆使してまでゲーム作んないぞ。
>Wiiは既に死に体だから
それはひょっとしてギャグで言ってるのか?
>>956 川崎の石は現役ですよ。日立の64180はさすがに作ってないみたいだけど。
>川崎の石
あの変態なZ80に、更に変態なメモリ管理命令増やした奴だっけ?
#いや、割りと好きですがw
>>957 この前は漏れがそう書いたら社員乙とか書かれた気がするが……
>>957 今時アセで組む必要があるなんて
余程余裕のない組み込みか
Cellみたいな変な石使う時だろうしそうかもね
質問です。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 );
片っ端から変数に代入しようとすると、結局レジスタを消費してしまって正しく表示できないと思われ。
全部纏めてでなく、一個ずつやらないとダメなんでない?
#つーか、デバッガで見ることはできないのか?
>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
>>964 スタックに突っ込めばいいんじゃないかな。
でもってespを適当な構造体のポインタに格納したりして。
>>963 ml.exeのインラインアセンブラってなんだよ。 等の細かいツッコミは置いといて。
表示するだけならそれで良い。
アセンブリ出力(VC++なら/FAs)を出して確認すれ。
インラインasm使う必要すらないじゃん
>>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
WindowsだったらGetThreadContextで一発というオチ。
GetThreadContextを自スレッドに呼び出すと呼び出しは成功するけど中身の保証は無し
最近勉強中でちょっと悩みがあります。
メモリのアドレスを特定のルーチンだけで利用するんですが、
スタックに入れてpush,popするべきなのか、
メモリから読んでまた書き戻すべきなのか、
どっちがいいんでしょう?
値を更新するので所謂Cのポインタなのですが。
やはりスタックの方が若干速そうなのですがその内バグりそうです。
慣れるまではメモリを使うべきでしょうか?
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にジャンプ」の分岐の方法を
何方かご教授下さい。
>>974 65816は知らんが、ニモニック表をよく見てみ。
条件分岐命令にゼロフラグチェック以外にもキャリーフラグチェックのがあるはずだから。
>>974 おまい、OKWaveでも同じこときいてたな。
>>975の説明でも
理解できなさそうだ。
なあ、206以下と260以上で分けるていってるけどさ、「260」のときは
どっちに分岐させんだいw
>>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とやるべき。
>>975 フラグの意味がわかってませんでした。
>>976 260以下と260未満でした。
すみません。
>>977 ありがとうございます!
無事260以上の命令が出来ました。
皆様お忙しい中有難うございました。
> 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やそれ以上は使えるのですか。
マクロアセンブラならどんなニモニックだろうと(自分で追加すれば)使える。
まず勉強