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

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS