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; }