Updated: 2022-10-31, Posted: 2022-10-30
使用するアドレッシングモードを制限する。
基本的にレジスタはRAX,RCXのみ使用する。
レジスタからdataへ代入(8bit)
88 05 00 00 00 00 mov %al,0x00000000(%rip)
dataからレジスタへ代入(8bit)
8a 05 00 00 00 00 mov 0x00000000(%rip),%al
レジスタからdataへ代入(64bit)
48 89 05 00 00 00 00 mov %rax,0x00000000(%rip)
dataからレジスタへ代入(64bit)
48 8b 05 00 00 00 00 mov 0x00000000(%rip),%rax
レジスタからスタックへ代入(8bit)
88 84 24 00 00 00 00 mov %al,0x00000000(%rsp)
スタックからレジスタへ代入(8bit)
8a 84 24 00 00 00 00 mov 0x00000000(%rsp),%al
レジスタからスタックへ代入(64bit)
48 89 84 24 00 00 00 00 mov %rax,0x00000000(%rsp)
スタックからレジスタへ代入(64bit)
48 8b 84 24 00 00 00 00 mov 0x00000000(%rsp),%rax
スタックのアドレスをレジスタへ代入
48 8d 84 24 00 01 00 00 lea 0x100(%rsp),%rax
dataのアドレスをレジスタへ代入
48 8d 05 00 00 00 00 lea 0x00000000(%rip),%rax
レジスタの示すアドレスの内容をレジスタへ代入
48 8b 00 mov (%rax),%rax
レジスタの示すアドレスにレジスタへ代入
48 89 01 mov %rax,(%rcx)
即値をレジスタ(64bit)
48 b8 00 00 00 00 00 00 00 00 movabs $0x0000000000000000,%rax
比較
48 39 c1 cmp %rax,%rcx
比較した内容をレジスタに代入
0f 95 c0 setne %al
リターン
c3 ret ***
関数呼び出し(即値、相対アドレス)
e8 00 00 00 00 callq $0x00000000
関数呼び出し(変数の内容、絶対アドレス)
ff 94 24 00 00 00 00 callq *0x00000000(%rsp)
無条件ジャンプ
e9 00 00 00 00 jmpq $0x00000000 相対アドレス
無条件ジャンプ 絶対間接nearジャンプ
ff 25 00 00 00 00 jmpq *0x00000000(%rip)
条件ジャンプ
0f 85 00 00 00 00 jne $0x00000000 相対アドレス !=
0f 84 00 00 00 00 je $0x00000000 相対アドレス ==
0f 8e 00 00 00 00 jle $0x00000000 相対アドレス >= (符号付き)
0f 8d 00 00 00 00 jge $0x00000000 相対アドレス <= (符号付き)
0f 8c 00 00 00 00 jl $0x00000000 相対アドレス > (符号付き)
0f 8f 00 00 00 00 jg $0x00000000 相対アドレス < (符号付き)
0f 86 00 00 00 00 jbe $0x00000000 相対アドレス >= (符号無し)
0f 83 00 00 00 00 jae $0x00000000 相対アドレス <= (符号無し)
0f 82 00 00 00 00 jb $0x00000000 相対アドレス > (符号無し)
0f 87 00 00 00 00 ja $0x00000000 相対アドレス < (符号無し)
レジスタ同士を交換
48 91 xchg %rax,%rcx
加算 RAX=RAX+RCX
48 01 c8 add %rcx,%rax
減算 RAX=RAX-RCX
48 29 c8 sub %rcx,%rax
符号無し乗算 RAX=RAX*RCX
48 f7 e1 mul %rcx
符号無し除算 RAX=RAX/RCX
48 f7 f1 div %rcx
符号付き乗算 RAX=RAX*RCX
48 f7 e9 imul %rcx
符号付き除算 RAX=RAX/RCX
48 f7 f9 idiv %rcx
ビット演算 RAX=RAX and RCX
48 21 c8 and %rcx,%rax
ビット演算 RAX=RAX or RCX
48 09 c8 or %rcx,%rax
ビット演算 RAX=RAX xor RCX
48 31 c8 xor %rcx,%rax
ビット演算 RAX=RAX << CL
48 d3 e0 shl %cl,%rax
ビット演算 RAX=RAX >> CL
48 d3 e8 shr %cl,%rax
ビット演算 RAX=RAX >> CL (符号付き)
48 d3 f8 sar %cl,%rax
インクリメント RAX++
48 ff c0 inc %rax
デクリメント RAX--
48 ff c8 dec %rax
レジスタ初期化 RAX=0
48 31 c0 xor %rax,%rax
レジスタ初期化 RCX=0
48 31 c9 xor %rcx,%rcx
スタックポインタ加算 関数プロローグ用
48 81 ec 00 00 00 00 sub $0x00000000,%rsp
スタックポインタ減算 関数エピローグ用
48 81 c4 00 00 00 00 add $0x00000000,%rsp
レジスタからスタックへ代入(64bit) 引数用
48 89 94 24 00 00 00 00 mov %rdx,0x00000000(%rsp)
4c 89 84 24 00 00 00 00 mov %r8,0x00000000(%rsp)
4c 89 8c 24 00 00 00 00 mov %r9,0x00000000(%rsp)
スタックからレジスタへ代入(64bit) 引数用
48 8b 94 24 00 00 00 00 mov 0x00000000(%rsp),%rdx
4c 8b 84 24 00 00 00 00 mov 0x00000000(%rsp),%r8
4c 8b 8c 24 00 00 00 00 mov 0x00000000(%rsp),%r9
レジスタ初期化 引数用
48 31 d2 xor %rdx,%rdx
4d 31 c0 xor %r8,%r8
4d 31 c9 xor %r9,%r9