低レベルプログラミング・問題解答
投稿日: 更新日:
本記事は『低レベルプログラミング』(翔泳社)の問題に対する、私自身の解答メモです。正解の保証はありません。正式な解答は著者の公式GitHubを参照してください: https://github.com/Apress/low-level-programming
参考文献
Igor Zhirkov(著),吉川邦夫(訳・監修)『低レベルプログラミング』翔泳社,2018年.ISBN:978-4-7981-5503-6.
公式ページ:https://www.shoeisha.co.jp/book/detail/9784798155036
(最終アクセス:2025-08-02)
解いたら更新します。
問題1(p. 15)
- CF : Carry flag・最上位ビットがキャリーかボローが発生した場合にセットされ、それ以外はクリアされるされるフラグ
- AF : Auxiliary Carry flag・3ビット目からキャリーかボローが発生した場合にセットされ、それ以外はクリアされるフラグ
- ZF : Zero flag・結果が0の場合にセットされそれ以外はクリアされるフラグ
- OF : 演算結果がオペランドに収まりきらないほど大きな正の整数もしくは小さな負の整数である場合にセットされそれ以外はクリアされるフラグ
- SF : 符号つき整数で符号を示す最上位ビットと同じ値になる。0は正、1は負
OFとCFの違いはOFは符号付き整数、CFは符号なし整数での結果を示す。
問題2(p.20)
- メモリに命令列とデータの両方が保存されそれを区別する手段はない
- 命令の実行はジャンプ命令を使用しない限りシーケンシャルに実行される
問題3(p.20)
プロセッサ自身が持つメモリセルのこと。応答時間が高速で通常はCPUサイクル2つに等しい。
問題4(p.20)
LIFOのデータ構造。push命令とpop命令と1つのレジスタ(rsp)によって構成される。専用のメモリがあるわけではなく、データは既存のメモリに保存される。
問題5(p.20)
外部イベントを基準として、プログラムの実行順序を変更すること。
問題6(p.20)
遅いメモリの問い合わせをレジスタ、キャッシュで解決。対話性を割り込みで解決。コードを隔離するためのサポートをハードウェアスタックで実装。 プログラムが実行できる命令をプロテクションリングで制限。プログラムを互いに隔離するために仮想メモリを実装。
問題7(p.20)
- rax (r0) accumulatorとして算術演算で使われる
- rcx (r1) ループの回数(cycles)に使われる
- rdx (r2) 入出力処理の間、データを格納する
- rbx (r3) ベースレジスタ
- rsp (r4) スタックポインタ
- rbp (r5) スタックフレームのベースポインタ
- rsi (r6) ストリング操作コマンドのソース側インデックス
- rdi (r7) ストリング操作コマンドのデスティネーション側インデックス
- r8~r15
問題8(p.20)
スタックの次に書き込まれるアドレス、別のアーキテクチャでは最後の要素をさす。
問題9(p.20)
ならない。一回もpushしていなくてもスタックポインタがさすアドレスの内容が返される。
問題10(p.20)
数えられない。popはpush回数に関係なく実行できるし、スタックがどこから始まっているかを知ることはできないため。
問題11 (p.28)
- xor : 排他的理論和をとる命令。xor dest src でdestとsrcの演算結果をdestに格納する。
xor rdi, rdi はrdi ^ rdiを取るのでrdiに0をセットするのと同じ。
問題12 (p.28)
ridが0にセットされているので0
問題13 (p.28)
プログラムのリターンコード。
問題14 (p.29)
mov rax, 0x0123456789ABCDEF
と書き換えてちゃんと0123456789ABCDEF
とでたので問題なさそう。
問題15 (p.29)
sarもshrも右シフトの処理だが、sarはshift arithmetic right(算術右シフト)で最上位ビットを符号が合うようにセットする。 shrはshift logical rightで最上位ビットは0にセットされる。
問題16 (p.29)
- 2進数は末尾にbかyを付けるか、接頭辞に0bか0yを付ける。
- 8進数は末尾にqかoを付けるか、接頭辞に0oか0qを付ける。
- 16進数は末尾にh、接頭辞に0xか0hを付ける。