#include "stdafx.h"
struct person{
int age;
int sex;
char name[20];
};
struct person GetPerson(int age,int sex,char* name)
{
struct person p;
p.age = age;
p.sex = sex;
strcpy(p.name,name);
return p;
}
int main()
{
int m = 0x7ffff123;
int n = 0x7ffff456;
int k = 0x7fffffff;
//匯編指令:imul,mul
long long x = (long long)(m * n); //返回值類型為 int,然后強制轉換為long long,最后賦值給x,
long long y = (long long)m * n; //返回值類型為 long long,然后賦值給y,注意強制類型轉換括號的位置,
long long z = m * n; //返回值類型為 int,然后賦值給x.
/*
匯編指令:
004114BC mov eax,dword ptr [m]
004114BF imul eax,dword ptr [n]
004114C3 cdq //數據擴展指令,將雙字數據擴展為四字類型
//CDQ—Convert Double to Quad (386+),該指令把edx擴展為eax的高位,也就是說變為64位。
004114C4 mov dword ptr [z],eax
004114C7 mov dword ptr [ebp-4Ch],edx
*/
printf("m = %d,n = %d \n",m,n);
printf("x = %lld\n",x);
printf("y = %lld\n",y);
printf("z = %lld\n",z);
int m1 = 8;
int n1 = 3;
int k1 = m1/n1;
double k2 = m1/n1; //返回值類型為 int,然后賦值給k2,匯編指令:idiv
/*
匯編指令:
0041155E mov eax,dword ptr [m1]
00411561 cdq
00411562 idiv eax,dword ptr [n1]
00411565 mov dword ptr [ebp-1F4h],eax
0041156B fild dword ptr [ebp-1F4h]
00411571 fstp qword ptr [k2]
fild和fstp都是x87指令
fild浮點加載整數 然后轉換為長雙精度
fild是將整數轉化為長雙精FP80壓棧(壓到st0),
fstp是將彈棧指令,將st0彈出。
*/
double k3 = (double)(m1/n1); //返回值類型為 int,然后強制轉換為double,最后賦值給k3,匯編指令:idiv
double k4 = (double)m1/n1; //返回值類型為double,然后賦值給k4,注意強制類型轉換括號的位置,匯編指令:fidiv
/*
匯編指令:
00411590 fild dword ptr [m1]
00411593 fidiv dword ptr [n1]
00411596 fstp qword ptr [k4]
*/
printf("k1=%d \r\n",k1);
printf("k2=%f \r\n",k2);
printf("k3=%f \r\n",k3);
printf("k4=%f \r\n",k4);
char l1 = 127;
char l2 = 122;
int l3 = l1* l2;
/*
匯編指令:
0041162E movsx eax,byte ptr [l1]
00411635 movsx ecx,byte ptr [l2]
0041163C imul eax,ecx
0041163F mov dword ptr [l3],eax
*/
char l4 = l1* l2;
/*
匯編指令:
00411645 movsx eax,byte ptr [l1]
0041164C movsx ecx,byte ptr [l2]
00411653 imul eax,ecx
00411656 mov byte ptr [l4],al
*/
int l5 = l1/l2;
int l6 = double(l1)/l2;
long double k5 = l1* l2;
/*
匯編指令:
004116A6 movsx eax,byte ptr [l1]
004116AD movsx ecx,byte ptr [l2]
004116B4 imul eax,ecx
004116B7 mov dword ptr [ebp-1F4h],eax
004116BD fild dword ptr [ebp-1F4h]
004116C3 fstp qword ptr [k5]
*/
printf("l3=%d \r\n",l3);
printf("l4=%d \r\n",l4);
printf("k4=%lf \r\n",k5);
long long o1 = 0xff34567812345677;
long long o2 = 0xab34567834125615;
long long o3 = o1 * o2; //溢出
int age = 5;
int sex = 1;
char name[20] = "Aaron";
struct person p1 = {5,1,"Aaron"};
struct person p2;
struct person* pp1 = &p1;
struct person* pp2 = &p2;
p2= p1;
/*
匯編指令:
00414348 mov ecx,7
0041434D lea esi,[ebp-188h]
00414353 lea edi,[ebp-1ACh]
00414359 rep movs dword ptr es:[edi],dword ptr [esi]
//ecx 是計數器(counter),是重復(REP)前綴指令和LOOP指令的內定計數器。
因為sizeof(person) = 28,所以才有mov ecx,7
*/
struct person p3;
p3= GetPerson(age,sex,name);
//結論:
/*
整數類型:
小于等于4字節的返回值放在eax中,
8字節的返回值放在edx + eax中,其中edx為高位,eax為低位.
浮點數類型:
計算是通過壓棧的方式,如匯編指令:fild
返回是通過出棧的方式,如匯編指令:fstp
結構體類型賦值:
是通過內存拷貝的方式,如匯編指令:rep movs
將源值的地址放入esi,
將目標值的地址放入edi,
00414393 lea esi,[ebp-2D8h]
00414399 lea edi,[ebp-1D0h]
0041439F rep movs dword ptr es:[edi],dword ptr [esi]
結構體類型返回值:
通過eax將結構體的指針返回
*/
system("pause");
return 0;
}
//111111111111111111111111111111
//00000000000000000000000000000001
//
//111111111111111111001010111100
//10000000101011010101110111000010
//取反加一 1111111010100101010001000111110
//11111001111111111111111111111110000011000
//11111111111111111111110000011000
//1111101000
//11111010000000000000000000000000000000000 = 0
//00000000000000000000000000000000
//
//1111111111111111111110000011000