二进制C-数组、参数反汇编
xiu返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include "stdafx.h"
char fun() { char x=3; return x;
}
int main(int argc, char* argv[]) { int y=fun(); return 0;
}
|


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include "stdafx.h"
__int64 fun() { __int64 x=3; return x;
}
int main(int argc, char* argv[]) { __int64 y=fun(); return 0;
}
|

局部变量
函数调用的时候编译器会提升堆栈分配新的内存空间,栈顶ESP提升的空间就被称为缓冲区,不同的编译器会分配不同的默认空间
参数在函数调用前就已经分配了内存空间,局部变量只有当函数调用后才会分配空间
参数
参数传递本质就是将上层函数的变量或者表达式的值复制
一份传给下层函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include "stdafx.h"
char fun(char x) { x+=1; return x;
}
int main(int argc, char* argv[]) { int x=1; char y=fun(x); return 0;
}
|

数组
数组定义必须使用正整数,不能使用变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include "stdafx.h"
void fun() { char arr[4]={1,2,5,3}; }
int main(int argc, char* argv[]) { fun(); return 0;
}
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include "stdafx.h"
void fun() { char a=1; }
int main(int argc, char* argv[]) { fun(); return 0;
}
|
数组空间分配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include "stdafx.h"
void fun() { int arr[10]={1,2,5,3,2,2,3,3,4,6}; }
int main(int argc, char* argv[]) { fun(); return 0;
}
0040B7C8 mov dword ptr [ebp-28h],1 0040B7CF mov dword ptr [ebp-24h],2 0040B7D6 mov dword ptr [ebp-20h],5 0040B7DD mov dword ptr [ebp-1Ch],3 0040B7E4 mov dword ptr [ebp-18h],2 0040B7EB mov dword ptr [ebp-14h],2 0040B7F2 mov dword ptr [ebp-10h],3 0040B7F9 mov dword ptr [ebp-0Ch],3 0040B800 mov dword ptr [ebp-8],4 0040B807 mov dword ptr [ebp-4],6
|
桶排序
使用场景:需要排序的数组最大数不能太大
原理:将所排序数组的最大数加一,作为辅助数组的下标,排序数组的数值出现一次,辅助数组的的下标加一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include "stdafx.h"
void fun() { int arr[10]={1,2,5,3,2,2,3,3,4,6}; int trr[7]={0}; int t=0;
for(int i =0;i<10;i++) { trr[arr[i]]=trr[arr[i]]+1; }
for(int j=0;j<7;j++) { t=trr[j]; while(t>0) { printf("%d ",j); t--; } } }
int main(int argc, char* argv[]) { fun(); return 0;
}
|
