随笔分类 -  汇编的角度重新认识C

摘要:1、字符串数组与字符串 //字符数组 char arr[6] = {'A','B','C','D','E','F'}; //字符串 char names[] = "ABCDE"; 反汇编代码如下: 0040D4B0 push ebp 0040D4B1 mov ebp,esp 0040D4B3 sub 阅读全文
posted @ 2021-01-04 15:18 heyhx 阅读(170) 评论(0) 推荐(0)
摘要:1.关于地址符&:&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。 char a = 10; short b = 20; int c = 30; //&a &b &c的类型 //&a 是char* 类型 &b是short*类型 &c是int*类型 2、关 阅读全文
posted @ 2021-01-04 12:19 heyhx 阅读(187) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2021-01-03 22:56 heyhx 阅读(162) 评论(0) 推荐(0)
摘要:1、Switch语句与if else的关系:正向开发时,switch 几乎就是If else语句的另一种表达方式。 if(表达式 == 常量1) { //...代码 } else if(表达式 == 常量2) { //...代码 } else if(表达式 == 常量3) { //...代码 } e 阅读全文
posted @ 2021-01-03 21:30 heyhx 阅读(513) 评论(0) 推荐(0)
摘要:1.为什么要字节对齐:需要字节对齐的根本原因在于CPU访问数据的效率问题 对齐原则 数据类型自身的对齐值:为指定平台上基本类型的长度。对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。 结构体或者类的自身对齐值:其成员中 阅读全文
posted @ 2021-01-03 18:43 heyhx 阅读(136) 评论(0) 推荐(0)
摘要:1、定义:结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。 2、结构也可以看做是一种数据类型,与int float short char是平级关系 3、示例: 加入开发一款游戏,需要生命值,魔法值,坐标等等的 AA 然后其中包含坐标的结构体Point struct 阅读全文
posted @ 2021-01-03 17:03 heyhx 阅读(465) 评论(0) 推荐(0)
摘要:反汇编: 8: 9: int arr[3][4] = { 10: {1,2,3,4}, 00401038 mov dword ptr [ebp-30h],1 0040103F mov dword ptr [ebp-2Ch],2 00401046 mov dword ptr [ebp-28h],3 0 阅读全文
posted @ 2020-12-31 19:10 heyhx 阅读(199) 评论(0) 推荐(0)
摘要:1、 8位参数传递 void Function(char x,char y,char z) { } 2、16位参数传递 void Function(short x,short y,short z) { } 3、32位参数传递 void Function(int x,int y,int z) { } 阅读全文
posted @ 2020-12-31 18:14 heyhx 阅读(721) 评论(0) 推荐(0)
摘要:1.do while:所有循环中,性能最好的,所以很多时候加解密之类的操作,do...while循环最常见。 从效率来看,do....while 大于 while 大于 for。 阅读全文
posted @ 2020-12-31 16:27 heyhx 阅读(129) 评论(0) 推荐(0)
摘要:1、变量的声明?什么是赋值? //全局变量的声明,内存的全局变量区域 int a,b,c; void Fun() { a = 10; b = 20; c = a; } 总结: 声明变量就是告诉计算机,我要用一块内存,你给我留着,宽度和存储格式有数据类型决定. 计算机什么时候把这块内存给你,取决于变量 阅读全文
posted @ 2020-12-28 17:45 heyhx 阅读(246) 评论(0) 推荐(0)
摘要:全局变量的特点: 1、全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面 是否有值取决于声明时是否给定了初始值,如果没有,默认为0 2、全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值. 3、全局变量所占内存会一直存在,知道整个进程结束. 4、 阅读全文
posted @ 2020-12-28 16:47 heyhx 阅读(325) 评论(0) 推荐(0)
摘要:一、关于裸函数 1、什么是裸函数? void __declspec(naked) Function() {...} 上面的函数调用时,为什么会出错? void __declspec(naked) Function() { __asm ret } 2、无参数无返回值的函数框架 void __decls 阅读全文
posted @ 2020-12-26 18:35 heyhx 阅读(261) 评论(0) 推荐(0)
摘要:1、编写一个函数能够对任意2个整数实现加法,并分析函数的反汇编. int Plus1(int x,int y) { 添加代码 } 2、编写一个函数,能够对任意3个整数实现加法,并分析函数的反汇编. int Plus2(int x,int y,int z) { 添加代码 } 阅读全文
posted @ 2020-12-26 01:34 heyhx 阅读(103) 评论(0) 推荐(0)
摘要:1.JMP指令:修改EIP的值(只修改了EIP的值,寄存器以及堆栈都没有改变) mov eip,寄存器/立即数 简写为 JMP 寄存器/立即数 2.Call指令:(修改了EIP的值,[ESP-4],把返回地址的值(当前地址+指令所占字节)压栈) push 地址B mov eip,地址A/寄存器 简写 阅读全文
posted @ 2020-12-24 11:42 heyhx 阅读(419) 评论(0) 推荐(0)
摘要:一:指令学习 1. push 指令 push m16/m32 esp=esp-m的内存宽度 push [立即数] esp=esp-4 push r16/r32 2. pop 指令 pop r16/r32 esp=esp+[寄存器数据宽度] pop m16/m32 esp=esp+[容器宽度](wor 阅读全文
posted @ 2020-12-23 19:19 heyhx 阅读(417) 评论(0) 推荐(0)
摘要:1. 32位 16位 8位通用寄存器 EAX ECX EDX EBX ESP EBP ESI EDI AX CX DX BX SP BP SI DI AL CL DL BL AH CH DH BH 2.寄存器的结构:EAX-AX-AH-AL的对应关系 EAX-AX-AH-AL是一个寄存器的不同位 3 阅读全文
posted @ 2020-12-22 00:00 heyhx 阅读(546) 评论(0) 推荐(0)