C语言基础语法第一篇

1. 文件由两部分组成:文件名和文件主体,文件的分类有很多种,在这里我们只关注一种分类,分为可执行文件和不可执行文件。

         可执行文件在windows 操作系统中,扩展名为:.exe  .bat    com等的文件是可执行文件;可执行文件由指令和数据构成。Linux是靠文件属性判断是否可执行。

          不可执行文件:其内容是有数据构成的。

 在c/c++语言中 .c/.cpp 源文件(文本文件) .h 头文件(文本文件)   .i 预编译文体 (文本文件)   

.s为汇编文件   .o/.obj为二进制目标文件   .exe 为可执行文件

c语言编译过程:

 2. 定义与声明最大的区别就在于:定义创建了对象并为这个对象分配了一块内存空间,而声明的时候并没有分配内存空间

 3.单引号是字符的定界符,双引号是字符串的定界符

4.转义字符

a. 八进制转义字符最多跟三个数字,\ddd 最大取值\777

b.十六进制转义字符最多跟两个数字,\xdd 最大取值是 \x7f

c.单引号是字符类型的开头和结尾,要使用\',也即' \' '

d.双引号是字符串类型的开头和结尾,要使用\", "1314 \"  521 \" LHY"

e.反斜杠是转义字符的开头,要使用//表示,也即' \\ '

5. 

6. 作用域(可见性):指标识符能够被使用的范围; 只有在作用域内的标识符才可被使用

此阶段针对编译和链接的过程。 

(1.)函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。

(2.)文件作用域也称全局作用域。定义在所有函数之外的标识符,具有文件作用域,作用域为定义处到整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。

7.生命周期。此阶段针对的是程序的执行过程。

生命周期是指标识符从程序执行开始被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的时间段。

(1.) 局部变量的生存期是:程序在执行过程中函数被调用,给形参开辟存储空间,到函数运行结束,由操作系统释放存储空间。还有就是函数内部定义的局部变量,数组等都在函数运行结束由操作系统释放存储空间。

(2.) 全局变量的生存周期:从程序运行前开始,到执行后结束。存储在data区(静态区)。

(3.) 动态生命期是: 标识符由特定的函数调用或运算来创建和释放,如调用 malloc()为变量分配存储空间,变量的生命周期开始,而调用free()释放空间或程序运行结束时,生命周期结束。具有动态生命期的变量存储在堆区.heap。

8.运算符。只有单目运算符++,--能改变运算数自身的值其他运算符均不能!!!

9. 左值:可读可写可赋值

    右值:不可写可读,不能被赋值!

10.   ?  :     C语言唯一一个三目运算符,可用于简化简单的if语句。

11.前置++和 后置++的区别

12.   *=,+=,/=的优先级低于 算数运算符 

13.   汇编 mov指令

MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。 其特点是不破坏源地址单元的内容。

14.  ADD指令

汇编中的ADD指令是加法指令,其功能是把源操作所指出的内容加到累加器A,其结果存在A中。

15.

EAX  是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器

EBX  是"基地址"(base)寄存器,内存寻址时存放基地址

ECX  是计数器(counter), 是重复(REP)前缀指令LOOP指令的内定计数器

EDX  则总是被用来放整数除法产生的余数

ESI/EDI 分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, ESI指向源串, EDI指向目标串.

EBP 是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
push ebp :保存当前ebp
mov ebp,esp :EBP设为当前堆栈指针
sub esp, xxx : 预留xxx字节给函数临时变量.

ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。ESP的值会随PUSH与POP指令的使用改变其值,从而永远指向栈顶。堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。

EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。EBP 是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:

push ebp :保存当前ebp

mov ebp,esp :EBP设为当前堆栈指针
sub esp, xxx : 预留xxx字节给函数临时变量.

EIP :

eip寄存器存储着我们cpu要读取指令的地址,没有了它,cpu就无法读取下面的指令(通俗点讲cpu就无法执行。每次相应汇编指令执行完相应的eip值就会增加

  此时我们假设一个程序开始执行了。首先PE loader装载我们的pe文件,读取我们pe文件的基地址和入口RVA地址(相对于基地址的偏移),并且读取相应节表结构的值,然后将我们的程序映射到内存。

    此时,映射到内存以后.. 此时PE loader把返回的程序入口点给cpu的eip寄存器赋值,然后通知我们的cpu:“ 并且说:我映射完了,你可以执行了。eip也相应的赋值了。此时cpu知道了eip的值,那么它通过将eip的值传送到输入输出电路,并送入相应的地址总线上。那么此时cpu就通过eip读取eip偏移上的二进制数据(我这里用汇编指令来表示)并传送到数据总线上,最后传送到指令缓冲区。传送到指令缓冲区后,那么此时eip会自动的增加其读入指令的数量,以便往下执行, 最后执行控制器第七指令缓冲区的指令并且往下执行。

我们cpu每次执行控制器读取完,相应的就在通过eip寄存器去进行下一次的读取指令工作。。每次cpu读取指令到指令缓冲区,相应的eip寄存器的值增加,增加大小的就是读取指令的字节大小(也可以说是长度)。。

16.  指针

 存储地址的变量成为指针变量。在c语言中指针就是地址。

 指针大小在有编译器决定,在32位下为四字节,在64下为八字节

17. 文件

18.typedef   重命名

typedef把一切合法的变量定义,转化为所谓的类型声明!!!


 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值