Open4

低レベルプログラミング 第1章

hirahira

問題1

rflagsは、いずれのフラグも直近の演算結果に関するものとなる。直近の演算結果が特定の結果になれば、関連するフラグが1になる。条件を満たさない場合は0になる。

CF

キャリーかボローが発生したらフラグが立つ。キャリー、ボローについては理解していないが、符号なし整数においてオーバーフローが発生したら立つと雑に理解。
本には符号付き演算と書いてあるがたぶん誤り。

AF

よくわかってないが滅多に使われないらしいので一旦置いておく。

ZF

結果が0ならフラグが立つ。

OF

符号あり整数のオーバーフローの際にフラグが立つ。本には符号なし演算と書いてあるがたぶん誤り。

SF

演算結果が負になったらフラグが立つ。

hirahira

pushの説明を読む。

資料の PUSH—Push Word, Doubleword, or Quadword Onto the Stack のあたり。

オペランドの符号が拡張されない場合

たぶんこのあたり

If the source operand is a segment register (16 bits) and the operand size is 64-bits, a zero-extended value is pushed on the stack;
if the operand size is 32-bits, either a zero-extended value is pushed on the stack or the segment selector is written on the stack using a 16-bit move.

オペランドがセグメントレジスタで、かつオペランドのサイズが64bitの場合?オペランドのサイズが32bitの場合も?

hirahira

push rsp命令がメモリとレジスタに与える全ての影響

rspはスタックポインタで、スタックの最も上にある要素の先頭アドレスが格納される。
暗黙的に書き換えられるけど、それ自体をpushする…?

rspレジスタの大きさ分がrspレジスタ自体から減算される。そして減算後の値が、減算後の値が指すアドレスへ書き込まれる、という感じ?

hirahira

問題2~問題9の解答は本に書いてあるとおり。

問題10 スタック内の要素を数えられるか?

スタックの一番上の値の位置情報しかないので数えられない。一番下の値の位置はわからない、というかそもそもそういう概念がない。