#include <stdio.h> int add_int (int a, int b) { int c; __asm { mov eax, a // eaxレジスタにaの値をコピー add eax, b // eaxレジスタとbの値を加算してeaxレジスタに保存 mov c, eax // cにeaxレジスタの値をコピー } return c; } int sub_int (int a, int b) { int c; __asm { mov eax, a // eaxレジスタにaの値をコピー sub eax, b // eaxレジスタからbの値を減算してeaxレジスタに保存 mov c, eax // cにeaxレジスタの値をコピー } return c; } int mul_int (int a, int b) { int c; __asm { mov eax, a // eaxレジスタにaの値をコピー mul b // eaxレジスタとbの値を乗算してeaxレジスタに保存 mov c, eax // cにeaxレジスタの値をコピー } return c; } int div_int (int a, int b) { int c; __asm { mov eax, a // eaxレジスタにaの値をコピー mov edx, 0 // edxレジスタの値を0にする div b // eaxレジスタとbの値を乗算して結果はeaxレジスタに,余りはedxレジスタに保存 mov c, eax // cにeaxレジスタの値をコピー } return c; } int main (void) { printf ("4 + 2 = %d\n", add_int (4, 2)); printf ("4 - 2 = %d\n", sub_int (4, 2)); printf ("4 * 2 = %d\n", mul_int (4, 2)); printf ("4 / 2 = %d\n", div_int (4, 2)); return 0; } |
4 + 2 = 6 4 - 2 = 2 4 * 2 = 8 4 / 2 = 2 |
int div_int (int a, int b) { int c; __asm { mov c, edx } printf ("%d\n", c); __asm { mov eax, a mov edx, 0 div b mov c, eax } return c; } |
4 + 2 = 6 4 - 2 = 2 4 * 2 = 8 4344456 4 / 2 = 2 |
SUB - 整数減算 第1オペランドと第2オペランドとの整数減算を行う.減算結果は第1オペランドに代入される. |
||||||||||||||||||||||||||||||
|
MUL - 整数乗算 第1オペランドと第2オペランドとの整数乗算を行う.乗算結果は第1オペランドに代入される.第1オペランドは,オペランドのサイズに応じてAL,AX,またはEAX レジスタとなる暗黙のオペランドである.結果は,オペランド・サイズに応じてレジスタAX,レジスタペアDX:AX,またはレジスタペアEDX:EAX にストアされ,積の上位ビットはそれぞれAH,DX,またはEDX に入る. |
||||||||
|
DIV - 整数除算 AX,DX:AX,またはEDX:EAXレジスタ内の値(被除数)をソースオペランド(除数)で割り,結果をそれぞれAX(AH:AL),DX:AX,またはEDX:EAXレジスタにストアする.ソースオペランドには,汎用レジスタまたはメモリロケーションを使用できる. この命令の処理は,以下の表に示すように,オペランドサイズ(被除数/除数)に依存する.
|
||||||||||||||||||||||||
|