#include <stdio.h> int sum_int (int n) { int c; __asm { mov eax, 0 // eaxレジスタをゼロクリア mov ecx, n // ecxレジスタにnの値をコピー LOOP1: add eax, ecx // eaxレジスタとecxレジスタの値を加算してeaxレジスタに保存 loop LOOP1 // ecxレジスタがゼロになるまでループ mov c, eax // ループ終了時にeaxレジスタの値をcにコピー } return c; } int main (void) { printf ("sum(10) = %d\n", sum_int (10)); return 0; } |
sum(10) = 55 |
#include <stdio.h> int sum_int2 (int a, int b) { int c; __asm { mov eax, 0 // eaxレジスタをゼロクリア mov ecx, b // ecxレジスタにbの値をコピー LOOP1: add eax, ecx // eaxレジスタとecxレジスタの値を加算してeaxレジスタに保存 cmp ecx, a // ecxレジスタとaの値を比較 loopnz LOOP1 // ecxレジスタがゼロでなく,かつZFが0ならループ mov c, eax // ループ終了時にeaxレジスタの値をcにコピー } return c; } int main (void) { printf ("sum(3, 10) = %d\n", sum_int2 (3, 10)); return 0; } |
sum(3, 10) = 52 |
LOOP/LOOPcc - ECXカウンターによるループ ECXまたはCXレジスタをカウンタとして使用して,ループ操作を実行する.LOOP命令が実行されるたびに,カウント・レジスタが1デクリメントされ,次に0かどうかチェックされる.カウントが0である場合はループは終了し,LOOP命令の次の命令からプログラムの実行が継続される.カウントが0でない場合は,第1オペランドへのnearジャンプが行われる. |
||||||||||||
|
CMP - 2つのオペランドを比較 第1オペランドと第2オペランドを比較し,結果に従ってEFLAGSレジスタ内のステータスフラグをセットする.比較は,第1オペランドから第2オペランドを引き,次にSUB命令の場合と同様にステータスフラグをセットして行われる.オペランドとして即値を使用した場合は,そのオペランドは第1オペランドの長さに符号拡張される. |
||||||||||||||||||||||||||||||
|
名前 | 意味 |
Carry Flag (キャリーフラグ:CF) |
算術演算において,結果の最上位ビットでキャリーまたはボローが生じた場合にセット. 生じなかった場合にはクリア. 符号なし整数演算でのオーバーフロー状態を示す. |
Overflow Flag (オーバーフローフラグ:OF) |
整数の演算結果が大きすぎる正の数であるか小さすぎる負の数で, デスティネーションオペランドに収まらない場合(符号ビットは除く)にセット. そうでない場合にクリア. 符号付き整数(2の補数)演算でのオーバーフロー状態を示す. |
Sign Flag (サインフラグ:SF) |
符号付き整数の符号ビットである結果の最上位ビットと同じ値にセット. 0は正の値,1は負の値. |
Zero Flag (ゼロフラグ:ZF) |
結果がゼロの場合にセット.ゼロでない場合にクリア. |
Adjust Flag (調整フラグ:AF) |
2進化10進(BCD)算術演算において,結果のビット3にキャリーまたはボローが生じた場合にセット. 生じなかった場合にはクリア. |
Parity Flag (パリティフラグ:PF) |
結果の最下位バイトに値1のビットが偶数個含まれている場合にセット. 奇数個の場合にはクリア. |