NEGと SBB を使ったよくあるアセンブラの記述

覚えておきたいパターン(1) | さすらいのプログラマ - 楽天ブログ

ここの日記を振り返ってみていて覚えておきたいなぁというのがあった。

  MOV EAX, data
  MOV ECX, data
  ADD ECX, 8
  NEG EAX
  SBB EAX, EAX
  AND EAX, ECX

  MOV data, EAX

JMPを使わないのでパイプラインがフラッシュされないというメリットがあるのだろう。
どういった処理なのかは、ここの日記の中にあります・・・(^^;

赤字の部分、コンパイルしたコードで定石的なコードなのだが
処理の内容をもったいぶっているのが気になったので探してみた(・ω・)

C++クラス part2(その2) | さすらいのプログラマ - 楽天ブログ

アセンブラは詳しくないので、マニュアルを参照して
調べたのでだが、eaxとecxにmcの値(MyClassのインスタンスのアドレス)を代入する。ecxに8を加える。ここまでは、問題ないだろう。neg と sbb という命令だ。
neg は2の補数に変換をする。つまり、eax にセットされた値を2の補数に変換する。
sbb は、桁借りを含む引き算をする。桁借りというのは後で説明するが、eax から eax
を引き算している。結果は0になるから意味があるのと思った人、ここで先ほどの桁借りが関係してくるのだ。桁借りの状態のときは、さらに -1
される。eax - eax は、0 または、-1となることとなる。
じゃあ、桁借りって?neg を調べると、ソース(この場合、eax)が0の場合CFが0になり、0以外のとき1になる。

正直何を言ってるか分からないのだが、実はごく単純なコードだ。

data の値を読み込んで、0だった場合は 0、0ではない場合は、8増やすという処理だ。

例えば、 data = data ? data + 8 : 0;

みたいな処理をやれば上記のコードになるのである ・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です