用語集
*目次
#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