著作一覧 |
while (0 < i) { ... }
が、
test bx, bx jl $label
とコンパイルされて、はて、なぜこうなるんだ? とちょっと悩む。
cmp $0, bx #ちょっと嘘かも。 jge $label
なら、わかるんだけど。cmpだし(最適化しないとこうなるのだが、それは別の話)。
で、testはANDの結果をフラグに設定するということをWikipedia(インストラクションレベルでページがあるんだね)を軽く読んで(固有の単語がいっぱい並んでいるので読む気が失せたのだった)理解したので、0はまあ良いとする。
0 and 0は、0だからzフラグが立つし、1 and 1は1だからzフラグはクリアされる。
で、再びWikipediaを眺めるとMSBという文字が見えたので、ああ、と理解できた。0xffffffff and 0xffffffffは0xffffffffだからMSBが立つ。testはどうやら算術テストのようだからそれは負値でつまりLとみなされるということなのだろう。
久々にアセンブリリスト眺めるとおもしろいな。
x86アセンブラ入門―PC/ATなどで使われている80x86のアセンブラを習得 (TECHI―Processor)(大貫 広幸)Windowsのお勧めは32ビットアプリケーションだということは、まだ当分、このタイプも役に立つんだろうなぁ(おれは買わないんだけど、まだ必要かどうかはとても悩ましい)。
ジェズイットを見習え |