2022-01-13 · 2분
専用レジスタ
CPU の専用レジスタ — アキュムレータ、プログラムカウンタ、命令レジスタ、MAR、MBR、状態・データ・アドレスレジスタ — とユーザー可視/不可視の区分に関する学習ノート。
2021-07-10 · 4분
この記事は公開から2年以上経過しています。
レジスタ:CPU の変数

- 汎用レジスタ:CPU で使う変数の一種
- EAX
算術計算を行い、リターン値を渡します。
最もよく使う変数です。
- EDX
大きな数の掛け算または割り算の演算
- ECX
C:Counter である。
繰り返し文でのカウンター、for 文の i++ の役割だが、繰り返し回数分だけ値を保存した後 減少 する形でのみ動作します。
- EBX
EAX、EDX、ECX のような一種の変数
- ESI
文字列や各種の反復データを処理、またはメモリを移すのに使います。
- EDI
一種の変数
ESI は始点インデックス、EDI は目的地インデックス
スタック(Stack) BOJ #10828 スタック問題:https://www.acmicpc.net/problem/10828 スタックとは?スタック(Stack)は制限的にアクセスできる並び構造である。片方の端でのみデータを入れたり出したりできる LIFO(Last In First Out)形式の.. — nabomhalang.tistory.com
スタックを知っておく必要があります。
- ESP:stack pointer
stack frame の終点アドレスが入ったポインタ
- EBP:base pointer
stack frame の最初の開始アドレスが入ったポインタ
- EIP:instruction pointer
次に実行すべき命令のアドレスポインタ

endian(エンディアン)は、コンピュータのメモリのような 1 次元の空間に複数の連続した対象を配列する方法を意味し、バイトを配列する方法をバイト順序といいます。
エンディアンは通常、大きい単位が前に来る ビッグエンディアン(Big-endian)と、小さい単位が前に来る リトルエンディアン(Little-endian)に分けられ、どちらにも属さないか両方を支持するものを ミドルエンディアン(Middle-endian)と呼ぶこともあります。
offset:特定のメモリアドレスを参照するときは大括弧を使います。
eax から +4 だけ離れたメモリアドレスの表記:[eax+4]
mov a, b:a に b を入れよ。(a = b)
mov [ecx], eax : *ecx = eax
add a, b: a を b だけ増加させる(a += b)
sub a, b: a を b だけ減少させる(a -= b)
mul a : eax(ax, ah, al) *= a
div a: eax(ax, ah, al) /= a
imul a, b : a *= b
idiv a, b : a /= b
lea a, [b] : a に [b] を入れよ。(a = [b]) mov との違い — mov は値を代入、lea はアドレスを代入
push a: stack に a を push(esp -= 4)
pop x: stack にある値を a に pop する(esp += 4)
Inc a : a++
Dec a : a-- neg a : -a not a : ~a nop : 何もしない命令(eip だけ次に増加)
and a, b : a &= b
or a, b : a |= b
xor a, b : a ^= b
xor の場合、xor eax, eax をすると eax を 0 に初期化する。
shl a, b : a << b
shr a, b : a >> b
レジスタには状態レジスタである flags が存在します。
ZF:このような命令の演算結果が 0 の場合、zf フラグは 1 になる
演算結果 == 0 -> '偽' -> ZF:1
演算結果 != 0 -> '真' -> ZF:0
CF:符号なしの演算でビット上がりやビット下がりが発生すると CF が 1 になる
SF:符号ありの演算で結果が正のとき、つまり最上位ビットが 0 なら SF=0、反対なら 1 になる
OF:符号ありの演算での CF の役割(overflow flag)
call location:関数を呼び出す命令、func は関数のアドレス
call:push eip; jmp func
push eip:関数呼び出し後に復帰するアドレスを push、このときの eip を(RET)Return address といいます。
jmp location:location へ eip を移す
スタックフレームを解除するための作業
関数が終わると、関数を最初に呼び出した地点に戻るための作業
- leave
mov esp, ebp:esp を ebp と同じに合わせる(関数が始まったときの初期値に復元)
pop ebp:元の ebp 値に戻す
- ret
pop eip:call するとき push eip した、その eip を持ってくる
jmp eip:call する前の eip の位置へ移動
!> ****](https://nabomhalang.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8B%B1-%EC%8A%A4%ED%83%9D%ED%94%84%EB%A0%88%EC%9E%84%EC%9D%B4%EB%9E%80)
追加:[ハッキング/リバーシング] - [リバーシング] スタックフレームとは..? [[リバーシング] スタックフレームとは..? What's the stack frame? スタックフレーム(Stack Frame)とは、関数が呼び出されるとき、その関数だけのスタック領域を区分するために生じる領域である。この空間には関数に関係するローカル変数 — nabomhalang.tistory.com
出典
https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8
原文(韓国語): tistory — 2021-07-10 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。
…