x86インラインアセンブラ

VC++では、__asmキーワードを用いてx86インラインアセンブラのコードを書くことができる。

メモ

  • C言語の変数名がそのまま使える。
  • 語順はギブミーチョコレート語順。ARMと同じ。モトローラ系やH8とかとは逆。
  • ARMと違ってレジスタ⇔メモリのやりとりもmov命令。
  • x64では使えない。
  • あいかわらず汎用レジスタが少ない。30年前から変わってない。
  • eaxとかのeは32ビットの印。もともと16ビットのaxとかだったから。
  • 1行1命令ならセミコロンは不要。(ふつう1命令しか書かないし。)
  • 分岐命令jccは条件によっていろいろ
    • 無条件 jmp
    • 等号 je(==), jne(!=)
    • 符号つきの大小比較 jg(>), jl(<), jge(>=), jle(<=)
    • 符号なしの大小比較 ja(>), jb(<), jae(>=), jbe(<=)
    • 異名もある je=jz, jng=jleなど

足し算のコード

#include<stdio.h>

int main(void)
{
    int a, b, c;
    a = 10;
    b = 20;
    
    // c = a + b
    __asm{
        mov eax, a
        add eax, b
        mov c, eax
    }

    printf("c = %d\n", c);

    return 0;
}

1から10までの総和を求めるコード

#include<stdio.h>

int main(void)
{
    int x;

    // x = sum of 1...10
    __asm{
        xor eax, eax
        mov ecx, 1
    label1:cmp ecx, 10
        jg label2
        add eax, ecx
        inc ecx
        jmp label1
    label2:mov x, eax
    }

    printf("x = %d\n", x);

    return 0;
}