Open4
低レベルプログラミング 第1章
問題1
rflagsは、いずれのフラグも直近の演算結果に関するものとなる。直近の演算結果が特定の結果になれば、関連するフラグが1になる。条件を満たさない場合は0になる。
CF
キャリーかボローが発生したらフラグが立つ。キャリー、ボローについては理解していないが、符号なし整数においてオーバーフローが発生したら立つと雑に理解。
本には符号付き演算と書いてあるがたぶん誤り。
AF
よくわかってないが滅多に使われないらしいので一旦置いておく。
ZF
結果が0ならフラグが立つ。
OF
符号あり整数のオーバーフローの際にフラグが立つ。本には符号なし演算と書いてあるがたぶん誤り。
SF
演算結果が負になったらフラグが立つ。
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の場合も?
push rsp命令がメモリとレジスタに与える全ての影響
rsp
はスタックポインタで、スタックの最も上にある要素の先頭アドレスが格納される。
暗黙的に書き換えられるけど、それ自体をpushする…?
rspレジスタの大きさ分がrspレジスタ自体から減算される。そして減算後の値が、減算後の値が指すアドレスへ書き込まれる、という感じ?
問題2~問題9の解答は本に書いてあるとおり。
問題10 スタック内の要素を数えられるか?
スタックの一番上の値の位置情報しかないので数えられない。一番下の値の位置はわからない、というかそもそもそういう概念がない。