x86インラインアセンブラ - 滴了庵日録 のつづき。
メモ
配列の総和を求めるコード
#include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int sum; __asm{ xor eax, eax xor ecx, ecx _LOOP: add eax, a[ecx * 4] // 32ビット整数なら*4 inc ecx cmp ecx, 5 jl _LOOP mov sum, eax } printf("%d\n", sum); return 0; }
スタックを使う
#include <stdio.h> int main(void) { int a, b, c; __asm{ push 1 push 2 push 3 pop a // a に 3 が入る pop b // b に 2 が入る pop c // c に 1 が入る } printf("%d %d %d\n", a, b, c); return 0; }
文字列のコピー
int main(void) { char a[] = "hello, world!\0"; char b[14]; __asm{ mov ecx, 14 // カウントレジスタ lea esi, a // ソースインデックス lea edi, b // デスティネーションインデックス cld // アドレスはインクリメント sldならデクリメント rep movsb // ecxぶんだけ1バイトずつコピー } printf("%s\n", b); return 0; }