2017/12/24 sqrt 求给定值的平方根
sqrt() 用来求给定值的平方根,其原型为:
double sqrt(double x); 【参数】x 为要计算平方根的值。
如果 x < 0,将会导致 domain error 错误,并把全局变量 errno 的值为设置为 EDOM。
【返回值】返回 x 平方根。
Exp:
#include main(){ double root; root = sqrt(200); printf("answer is %f\n", root); } pow 求x的y次方(次幂)
pow() 函数用来求 x 的 y 次幂(次方),其原型为:
2017/12/24 C语言数据类型 基本类型 整数类型 char、short、int、long char 8BIT 1字节 0~0xFF short 16BIT 2字节 0~0xFFFF int 32BIT 4字节 0~0xFFFFFFFF long 32BIT 4字节 0~0xFFFFFFFF 特别说明:
int 在16位计算机中与short宽度一样,在32位以上的计算机中与long相同
存储格式 char x = 1; //0000 0001 0x01 char x = -1; //1111 1111 0xFF (反码、补码、源码规则存储) 数据溢出 char x = 0xFF; //1111 1111 …
2017/12/21 int x = 123; //补码 int float f = 123.4F; //IEEE编码 int i = "A"; //神马情况??? 我们在代码中写入
int i = "A"; 反编译后汇编就编程了
mov dword ptr ss:[esp-4],0x41 为什么会变成41呢?
字符类型 ASCII 表 (American Standard Code for Information Interchange 美国标准信息交换代码)
维基百科: https://zh.wikipedia.org/wiki/ASCII
字符类型 ASCII表最大 127 16进制 是 0x7F 也就是只需 …
2017/11/18 计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 位运算)
与运算 两个位都为1时,结果为1 and(&)
或运算 只要有一个为1 就是1 or(|)
异或运算 不一样的时候是1 xor(^)
非运算(单目运算) 0变1 1变0 not(~)
左移 各二进制位全部左移若干位,高位丢弃,低位补0 shl(>) 在汇编中shr补0,sar补符号位
2017/11/17 数据宽度 因为计算机受硬件制约,数据都是有长度限制的(数据宽度),超过最多宽度的数据会被丢弃
计算机中常见的数据宽度: 位(BIT) -> 一个0或1 字节(BYTE) =8位 范围 0-> FF 字(Word) = 16位 0->FFFF 双字(DoubleWord) = 32位 0-FFFFFFFF 超过范围的数会被丢弃
有符号数和无符号数 有符号数还是无符号数是个人约定的
2017/09/21 之前可以修改EIP寄存器的指令
JMP,CALL,RETN
所有JCC指令的动作->根据标志寄存器修改EIP的值
标志寄存器 EFLAGS CF(bit 0)[Carry flag] C位 若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零
这个标志通常用来指示无符号证书运算的溢出状态
2017/09/19 寄存器传参和堆栈传参 寄存器传参 MOV ECX,1 MOV EBX,2 CALL XX MOV EAX,ECX ADD EAX,EBX RETN 堆栈传参 –ESP寻址 PUSH 1 PUSH 2 CALL XXX MOV EAX,DWORD PTR SS:[ESP+8] //当内存中括号中包含ESP或者EBP的话 用SS ADD EAX,DWORD PTR SS:[ESP+4] RETN 8 堆栈传参 –EBP寻址 PUSH 1 PUSH 2 CALL XXX PUSH EBP MOV EBP,ESP SUB ESP,10 //提升堆栈 MOV EAX,DWORD PTR …
2017/09/19 什么是函数 函数就是一系列指令的几个,为了完成某个会重复使用的特定功能
函数调用 用JMP来执行函数 用CALL来执行函数 函数的参数和返回值 通常情况下,会将函数的计算结果放到EAX寄存器中
EAX 通常用来放返回值
简单的加法函数
ADD ECX,EDX //传参 MOV EAX,ECX //传结果到EAX中 RETN 堆栈传参 如果参数很多怎么办?10个数相加
2017/09/17 EIP寄存器 EIP寄存器表示CPU下次执行的位置
JMP指令 JMP指令相当于给EIP寄存器赋值
JMP后面只能是32位的
指令格式:
MPV EIP,寄存器/立即数/内存
简写:JMP 寄存器/立即数/内存
JMP 0x00FF19 -> MOV EIP,0X00FF19 JMP EAX -> MOV EIP,EAX JMP DWORD PTR DS:[0x18ffa0] ->MOV EIP,DWORD PTR DS:[0x18ffa0] #这里内存指针只能用32位的 CALL指令 PUSH下一行地址
MOV EIP,立即数/寄存器/内存
简写 CALL 立即数/寄存器/内存
2017/09/17 什么是堆栈 程序启动的时候操作系统会给每个程序一块虚拟的4G内存当程序需要使用的时候必须要和操作系统申请内存
堆栈是程序的心脏,程序中需要用到的重要数据,都在堆栈中体现
就是一块特殊的内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用 和数据结构的堆栈无关 查看堆栈 正常内存使用从小地址往大地址使用,堆栈中从大地址往小地址使用
当堆栈用完了就会出现堆栈溢出错误
2017/09/16 寄存器数量和容量有限,为了存储大量数据,所以我们需要内存
每个程序都会有自己的独立的4GB内存空间( 这里的内存其实是虚拟的,并不是真的给了程序4G内存,当程序读或者写这段内存的时候,操作系统才会把使用的内存映射到物理内存上
物理内存和内存条之间还有一层映射
2017/09/16 标志寄存器 EFL EFL是32位寄存器
其中的每一位,含义都是不同的
0x00000246 16进制 0000 0000 0000 0000 0000 0010 0100 0110 二进制 第十位(从下标开始算 从右往左):DF位
DF位为``的时候: MOVS 执行完毕之后 ESI和EDI的值会增加
DF位位1的时候: MOVS 执行完毕之后 ESI和EDI的值会减少
2017/09/16 1. MOV指令(赋值) 含义:前者被后者赋值
exp:
MOV EAX,0xFFFFFFFF 此时 EAX = 0xFFFFFFFF
指令格式:
MOV r/m8,r8 MOV r/m16,r16 MOV r/m32,r32 MOV r8,r/m8 MOV r16,r/m16 MOV r32,r/m/32 MOV r8,imm8 MOV r16,imm16 MOV r32,imm32 r – 通用寄存器
m – 内存
imm – 立即数
r8 – 8位通用寄存器
m8 – 8位内存
imm8 – 8位立即数
2. ADD指令(加法) 含义:前者与后者相加,结果赋值给前者
2017/09/16 寄存器介绍 寄存器是什么 计算机在三个地方可以存数据
cpu 内存 硬盘 所谓寄存器,就是cpu中硬盘存储数据的地方
寄存器的大小 寄存器大小取决于cpu的位数
比如32位 那么cpu所提供的容器有三种 8位 16位 32位
如果64位 那么cpu所提供的容器有四种 8位 16位 32位 64位
05年后的电脑cpu几乎都是64位的。