低レイヤを学ぶ
c/c++
コンパイラ
cpu
CPUの創りかた
アセンブリ
実践的低レイヤプログラミング
x86_64 プログラミング入門
x86_64 では、さきほど見たように、汎用レジスタが16個あった。汎用レジスタは一個8byteあるので、16個あれば、128byteのデータ...... あたりまで
https://www.gifu-nct.ac.jp/elec/ktajima/jugyo/arch/data/architecture0630.pdf
低レイヤのグラフィック処理
2の補数
http://www.cc.kyoto-su.ac.jp/~kbys/kiso/number/int-op.html
http://asp.mi.hama-med.ac.jp/comp-basic/memory/#id2494915 メモリ管理
低レイヤを知りたい人のためのCコンパイラ作成入門
x86-64では、比較はcmp命令を使って行います。スタックから2つの整数を〜 まで
専用記事 => 低レイヤを知りたい人のためのCコンパイラ作成入門
https://www.cc.kyoto-su.ac.jp/~kbys/kiso/index.html
コンパイラの構成と最適化
MIPSシュミレーターを使ったアセンブリの学習講座
http://www.cc.kyoto-su.ac.jp/~kbys/kiso/cpu/mips.html
http://www.cc.kyoto-su.ac.jp/~kbys/kiso/cpu/mips2.html
http://www.cc.kyoto-su.ac.jp/~kbys/kiso/cpu/mips3.html
http://www.cc.kyoto-su.ac.jp/~kbys/kiso/cpu/mips4.html
malloc.c を読む (malloc / free)
逆アセンブル解析 - gdb | リバースエンジニアリング入門#2 - BioErrorLog Tech Blog
低レイヤ関連でよく使うコマンド
O'Reilly Japan - Binary Hacks Rebooted
gdb
GUNデバッガ
Linux環境での標準のデバッガ
アセンブリやC言語を初め、様々な言語に対応
マニュアル
Debugging with GDB - Table of Contents
gdb でレジスタの値を書き換えてみる - ablog
同僚に教えてもらった gdb で実行中のプロセスにアタッチして、writeシステムコール発行直前でレジスタのファイルディスクリプタを書換えるというのを試してみた。
アセンブリプログラムのデバッグはgdbによって行うことができる
実践的低レイヤプログラミング
start : プログラムを開始してmain関数の先頭で処理を止める
info registers : レジスタの値を表示 info r と省略できる
disassemble : 現在実行中の関数に含まれる命令を表示
stepi : 一命令実行する
quit : gdb を終了
print <レジスタ名|即値|計算式>: レジスタ名|即値 の値を表示、または計算式の計算結果を表示 printの後ろに /xを付けると16進数で表示する。 p と省略できる
例
print /x $rax : raxレジスタの値を16進数で表示
print /x $rax - 1 : raxレジスタの値 - 1 の値を16進数で表示
display <$レジスタ名> で、step実行の度に指定したレジスタの値を表示する
例:display $eflags でstep実行の度にフラグレジスタを表示する
x/g 0x<メモリアドレス> で、メモリの中の値を16進数で表示
デバッグ中にレジスタの中身を操作する方法
gdb でコード解析、デバッグするときによく使うコマンドまとめ - Nodachisoft
(gdb) set $eflags &= ~(1 << 6) ← 6ビット目(ZFフラグの場所)を 0 に変更
(gdb) print $eflags
$6 = [ PF IF ] ← ZFフラグが消えてる!
(gdb) set $eflags |= (1 << 6) ← 6ビット目(ZFフラグの場所)を 1 に変更
(gdb) print $eflags
$7 = [ PF ZF IF ] ← ZFフラグが立った!
eflagsには立ってるレジスタだけが表示される
まえがき | x64 UEFI 対応 OS 自作入門 ~実機で動作する OS を作ってみよう~
https://www7b.biglobe.ne.jp/~yizawa/design_cpu/chap1.htm
第1回 骨董的アセンブラへの招待 | gihyo.jp
「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで|Tech Village (テックビレッジ) / CQ出版株式会社
| 作って分かる! x86_64機械語入門
スタックとポインタ
第五話:スタックとLIFO、だから何?(怒)|トリコロールな猫
スタック領域に関係する重要なレジスタとして、「ESP」と「EBP」があります。EBPは次回に持ち越すとして、今回はESPに注目しましょう。
ESPはExtended Stack Pointerの略で、今どこのスタック領域を使っているかを指し示しています。
第六話:EBPとESP、スタック領域の使われ方|トリコロールな猫
では、スタック領域はどうやって各関数に分けるのか?ここで登場するのがEBP、ベースポインタです。
ベースポインタは、平たく言うと「今実行中の関数が使用しているスタック領域の底」です。底だからベースね。先ほどの図で説明するとこんな感じです。
スタックとアセンブリ