tkzn.io

低い学習コストで機械語で遊ぶ

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