做ppt网站有哪些内容吗,wordpress做一个html登陆页面,wordpress移动端转发分享,怎样用代码做网站目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换#xff08;一般用于小转大#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符#xff1a; || !3.8 单目运算符3.9 三目运算符… 目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换一般用于小转大3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符 || !3.8 单目运算符3.9 三目运算符 四、作业1、交换两个变量值2、将一个数组中的数倒序输出3、找出数组里面最大的值并返回4、将数组所有的元素相加将结果返回5、将两个等长数组相同位置的值相加存储到另外一个等长的数组中6、写一个函数int prime(int x)如果x是素数返回值为1否则返回07、俩俩比较数组的值将最大的一个存储到数组的最后一个位置8、编写程序实现一个冒泡排序的算法9、判断数组是否是对称的如果是返回1不是返回0 05 循环语句 一、缓冲区溢出的HelloWorld
void HelloWorld(){printf(Hello World);getchar();
}
void Fun(){int arr[5] {1,2,3,4,5};arr[6] (int)HelloWorld;
}
int main(int argc, char* argv[]){Fun();return 0;
}
原理arr[5]是ebp的位置而arr[6]是ebp0x4的位置即函数的返回地址赋值给arr[6]相当于是修改了eip寄存器。
二、永不停止的HelloWorld
void Fun(){int i;int arr[5] {0};for(i 0; i 7; i){arr[i] 0;printf(Hello World %d\n, i); //0-6循环出现}
}
int main(int argc, char* argv[]){Fun();return 0;
}反汇编i等于7时修改了rbp0x1c-0x20即rbp-0x4位置的值将其置为0而该位置为i的值所以每一轮for过后将i重新置0就造成了不停的循环。
三、基础知识
3.1 变量的声明
声明一个变量就是告诉计算机程序要用一块内存这块内存需要保留宽度和存储格式由数据类型决定计算机什么时候把这块内存给你取决于变量的作用范围如果是全局变量在程序编译完就已经分配了空间如果是局部变量只有所在的程序被调用的时候才会分配空间全局变量如果不赋初始值默认是0但局部变量在使用前一定要赋初值。
3.2 类型转换一般用于小转大
MOVSX 先符号扩展前面符号位是什么就填充什么
适用于有符号数
MOV AL,0xFF 000000FF
MOVSX CX,AL 0000FFFF
MOV AL,0x80 00000080
MOVSX CX,AL 0000FF80MOVZX 先零扩展
适用于无符号数
MOV AL,0xFF 000000FF
MOVZX CX,AL 000000FF
MOV AL,0x80 00000080
MOVZX CX,AL 00000080类型转换举例
有符号数扩展 无符号数扩展
char i 0xFF; unsigned char i 0xFF;
short k 0xFFFF; unsigned short k 0x00FF;
int h 0xFFFFFFFF; unsigned int h 0x00000000FF;示例代码
//有符号小转大
void Function1(){char ci 0xFF;short si ci;int ni ci;
} //无符号小转大
void Function2(){unsigned char ci 0xFF;unsigned short si ci;unsigned int ni ci;
}//有符号数大转小 //截取低位
void Function1(){int ni 0x12345678;short si ni;char ci si;
}3.3 表达式
表达式的特点
表达式无论多么复杂都只有一个结果只有表达式可以编译通过但并不生成代码需要与赋值或者其他流程控制语句一起组合的时候才有意义当表达式中存在不同宽度的变量时将结果转换为宽度最大的那个。
char a;
int b;
a 10;
b 20;
printf(%d,ab);当表达式中同时存在有符号和无符号数的时候表达式的结构将转换为无符号数
unsigned char a;
char b;
a 0xFE;
b 1;
printf(%d,ab);char b 1;
unsigned int a 0xFFFFFFFE;
printf(%d,ab);//结果为-1
原因
• char b 1;的汇编代码是mov byte ptr [ebp-4],1
• unsigned int a 0xFFFFFFFE;的汇编代码是mov dword ptr [ebp-8],0xFFFFFFFE
• 执行ab的操作前首先将b的值使用有符号扩展movsx eax,byte ptr [ebp-4]即0x00000001
• 接着执行相加操作0xFFFFFFFE0x000000010xFFFFFFFF在计算机的底层架构存储32位1。
• 输出时因为使用的是“d%”所以计算机将0xFFFFFFFF当做有符号的-1输出反之使用“u%”时则输出无符号的0xFFFFFFFF。计算机底层存的东西是一样的有无符号只对人类有意义3.4 语句和程序块
语句对cpu或内存有影响 if-else语句是整体
3.5 参数与返回值
略
3.6 关系运算符
“”、“!”、“”、“”、“”、“”
3.7 逻辑运算符 || !
3.8 单目运算符 输出11-11 输出11-10
3.9 三目运算符 四、作业
1、交换两个变量值
代码
void exchange(int x, int y){int temp;temp x;x y;y temp;
}2、将一个数组中的数倒序输出
代码
void fun(){int arr[8] {0,1,2,3,4,5,6,7};int n 7;while (n0){printf(%d\n, arr[n]);n--;}
}int main()
{fun();return 0;
}3、找出数组里面最大的值并返回
代码
int fun(){int arr[8] {0,1,2,3,4,5,6,7};int len 8;int i;int max 0;for(i 0; i len; i){if(max arr[i]){max arr[i];}}return max;
}int main()
{printf(%d\n, fun());return 0;
}
4、将数组所有的元素相加将结果返回
代码
int fun(){int arr[8] {0,1,2,3,4,5,6,7};int len 8;int i;int num 0;for(i 0; i len; i){num arr[i];}return num;
}
int main()
{printf(%d\n, fun());return 0;
}5、将两个等长数组相同位置的值相加存储到另外一个等长的数组中
代码
int arr1[8] {0,1,2,3,4,5,6,7};
int arr2[8] {0,1,2,3,4,5,6,7};
int arr3[8] {0};
void fun(){int len 8;int i;for(i 0; i len; i){arr3[i] arr1[i] arr2[i];}
}6、写一个函数int prime(int x)如果x是素数返回值为1否则返回0
代码
int prime(int x){
int i;
for(i 2; i x; i){if(x % i 0){return 0;}
}return 1;
}7、俩俩比较数组的值将最大的一个存储到数组的最后一个位置
代码
int arr[8] {7,1,2,3,4,5,6,0};
void Max(){int g_r;for(int i 0; i 8-1; i){if(arr[i] arr[i1]){g_r arr[i];arr[i] arr[i1];arr[i1] g_r;}}
}8、编写程序实现一个冒泡排序的算法
代码
int n[8] {7, 6, 5, 4, 3, 2, 1, 0};
void fun(){int i, j, temp;int len 8;for (i 0; i len - 2 ; i){for (j 0; j len - 1 - i; j){if (n[j] n[j 1]){temp n[j];n[j] n[j 1];n[j 1] temp;}}}
}9、判断数组是否是对称的如果是返回1不是返回0
代码
int arr[10] {0};
int fun(){int i, temp;int len 10;for (i 0; i len/2 ; i){if(arr[i] arr[len-1-i]){continue;}else{return 0;}}return 1;
}05 循环语句