用語集 *目次 #contents *単位 :bit|ビット。0と1の2値を取るものをよく目にする。~ よく電気信号で「Hは1でLは0」と説明されているが、IntelのCPUに関して言うと「Hは0で、Lは1」だと言うことを有名な某書で見た。 :Byte|バイト。bitが8つ並んでいるものが現代では良く使われているが、~ 昔は7bitで1Byteだったり(英数字と記号を表すだけならこれで十分だった)~ 9bitで1Byteだったり(これについては詳しく知らない。)したらしい。~ :KiB|キビバイト。1KiBは1024Byteであり、1000Byteではない。一方1KBはどちらでもありうる。 :MiB|メビバイト。1MiBは1024KiB。1MBと言うとそれが1000000Byteの事なのか1024000Byteの事なのか1048576Byteの事なのか、~ 文字だけでは判断できないことがある。 *演算記号 :(type)|キャスト。コンパイラを黙らせる為に使う場合が殆ど。バグの温床になりやすいので注意して扱うべき。~ 例えば次のコードはコンパイラを黙らせてるわけだけど、どうまずいのかぱっと見で分かる?~ 分からないあなたは#defineとtypedefについてよく調べてみるべきだ。 #define IntPtr int * void foo(){ IntPtr p,q; /* 色々なコード */ q=(int)p; // なぜかこの変なキャストをつけないとコンパイラが警告を吐く。 /* 色々なコード */ return; } :%|剰余演算。a%nとすると、aをnで割った余りを求められる。アセンブリ化されるとこんな感じになる。 ; r=a%n; mov eax,a xor edx,edx mov ecx,n idiv ecx;eaxに商、edxに剰余がそれぞれ代入される mov r,edx *アセンブリ言語 **フラグ 算術演算で主に変化するフラグ :OF(オーバーフローフラグ)|計算した結果、オーバーフロー(桁あふれ)が起きたら1になる。 :SF(サインフラグ)|計算した結果が2の補数表現でマイナスになったら1になる。~ もっと簡単に言うと、計算した結果の一番上のbit(例えば31bit目)と同じになる。 :ZF(ゼロフラグ)|計算した結果が0だったら1になる。 :PF(パリティフラグ)|計算した結果の立っているbitの数を数えて、偶数だったら1になる。~ パリティについて少し知ってるなら「こいつを含めて奇数パリティになる」で通じるだろうか。 :CF(キャリーフラグ)|加算した時に、繰り上がりが生じたら1になる。~ じつは減算のときにも「桁借り(ボロー)」フラグとして使われる :AF(補助キャリーフラグ)|下位4bitとその上位の4bitの間でキャリーがあったら1になる。~ 全ての条件付きジャンプについて参照されていないのだが、BCD演算という主に用途の分からない演算の為に使われる。 **命令語 シフトやローテートは、溢れた最後の1bitをキャリーに記録する。 :SHL|左論理シフト。符号無し整数型を左シフトするのに使う。実はSALと挙動は同じ。 :SHR|右論理シフト。符号無し整数型を右シフトするのに使う。 :SAL|左算術シフト。符合あり整数型を左シフトするのに使う。実はSHLと挙動は同じ。 :SHR|右算術シフト。符合あり整数型を右シフトするのに使う。シフトする対象が2の補数表現で負の数なら、穴埋めには0ではなく1が使われる。 :ROL|左ローテート。32bitの符号無し整数xを1bit左ローテートするのは、(x<<1)|(x>>31)とほぼ同じ。 :ROR|右ローテート。32bitの符号無し整数xを1bit右ローテートするのは、(x<<31)|(x>>1)とほぼ同じ。 :RCL|キャリーを含んだ左ローテート。キャリーフラグをcとして、32bitの符号無し整数xを1bit左ローテートするのはc|(x<<1)とほぼ同じ。 :RCR|キャリーを含んだ右ローテート。キャリーフラグをcとして、32bitの符号無し整数xを1bit右ローテートするのは(c<<31)|(x>>1)とほぼ同じ。 :LEA|Load Effective Addressの略。[[Source]]が最も好きな命令で、最も一般的な使い方からしてトリッキー。~ 例えばedxの8倍にecxを足して1000をそこから引いて、それをeaxに代入するならその4ステップ(掛けて足して引いて代入)をこれ1命令で書ける。 LEA EAX,[EDX*8+ECX-1000] しかし、例えばi486や初代Pentium(i586)でLEAを使って掛け算を高速化するのは、単純で複雑な制限があってパズルのように難しい。~ 「AGIストール」とかでググれば資料が出てくると思う。 :CPUID|CPUのベンダ(IntelかAMDか)、モデルとバージョン、シリアルナンバー、その他いろいろな情報を取得できる命令。~ CPUID命令に関する仕様書を見ながら使うような命令である事は確実。 :NOP|No Operationの略。実はNOPとXCHG EAX,EAXは同じ機械語をアセンブラに生成させる。 *コメント -誤りがあったり、あるいは疑問点があったりしたら自由にコメントしてください。 -- [[Source]] SIZE(10){2008-08-24 (日) 20:16:22} #comment