#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レジスタにストアする.ソースオペランドには,汎用レジスタまたはメモリロケーションを使用できる. この命令の処理は,以下の表に示すように,オペランドサイズ(被除数/除数)に依存する.
|
||||||||||||||||||||||||
|