本帖最后由 lyl610abc 于 2021-3-12 16:36 编辑
继续更新个人的学习笔记,
其它笔记传送门
逆向基础笔记一 进制篇
逆向基础笔记三 通用寄存器和内存读写
逆向基础笔记四 堆栈篇
逆向基础笔记五 标志寄存器
逆向基础笔记六 汇编跳转和比较指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析C语言
逆向基础笔记九 C语言内联汇编和调用协定
逆向基础笔记十 汇编寻找C程序入口
逆向基础笔记十一 汇编C语言基本类型
逆向基础笔记十二 汇编 全局和局部 变量
逆向基础笔记十三 汇编C语言类型转换
逆向基础笔记十四 汇编嵌套if else
逆向基础笔记十五 汇编比较三种循环
逆向基础笔记十六 汇编一维数组
逆向基础笔记十七 汇编二维数组 位移 乘法
逆向基础笔记十八 汇编 结构体和内存对齐
逆向基础笔记十九 汇编switch比较if else
逆向基础笔记二十 汇编 指针(一)
逆向基础笔记二十一 汇编 指针(二)
逆向基础笔记二十二 汇编 指针(三)
逆向基础笔记二十三 汇编 指针(四)
逆向基础笔记二十四 汇编 指针(五) 系列完结
数据宽度
计算机数据
数学上的数字是没有大小限制的,可以无限大。但在计算机中,由于硬件的制约,数据是有长度限制的,超过数据宽度的数据会被丢弃
同一个数据,表示无符号数和有符号数则其含义不同
例:
当数据宽度为4时,即数据只能存储4位2进制位0000~1111
无符号数:
数据 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
十六进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
二进制 |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
有符号数:
正数:
数据 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
十六进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
二进制 |
0 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
负数:
数据 |
-1 |
-2 |
-3 |
-4 |
-5 |
-6 |
-7 |
-8 |
十六进制 |
F |
E |
D |
C |
B |
A |
9 |
8 |
二进制 |
1111 |
1110 |
1101 |
1100 |
1011 |
1010 |
1001 |
1000 |
可以发现当数据为1011,把数据看作无符号数时,数据表示为B
把数据看作有符号数时,数据表示为-5
无符号数的表示范围为0~2^4-1即0~15\\
有符号数的表示范围为-2^3~2^3-1即-8~7
几个重要的计量单位
BYTE 字节 8BIT
WORD 字 16BIT 2字节
DWORD 双字 32BIT 4字节
逻辑运算
或运算(or |)
只要有一个为1则结果为1
与运算(and &)
两个都是1结果才为1
异或运算(xor ^)
相同为0 不同为1
非运算(not !)
取反 1是0 0是1
CPU如何计算2+3?
X:0010
Y:0011
先异或
R:0001
异或完以后要判断是否运算结束
将两个数进行与运算 然后左移一位
0010<<1 ==0100
如果结果全为0,结果则为我们所要的结果
否则,把上面异或得到的值赋值到X
把左移后的结果赋值到Y
X:0001
Y:0100
重复操作
先异或
R:0101
再将两个数进行与运算 然后左移一位
左移完结果全是0,结果则为我们所要的
最终结果为0101=5
CPU如何计算2-3?
X:0010
Y:1101
先异或
R:1111
将两个数进行与运算 然后左移一位
0000<<1=0000
如果结果全为0,结果则为我们所要的结果
最终结果为1111 = -1
如何取某个值的第N位的数值
与操作
如我们想要查看23h这个十六进制数的第3位则可以进行如下运算:
先将23h转化为二进制:0010 0011
最简单的加密算法
通过异或加密数据 再次异或后则解密数据
要加密的数据:2021:0010 0000 0010 0001
密钥:54:0101 0100
高位:0111 0100 = 74
低位:0111 0101 = 75
原本的2021加密成了7475
然后再次进行异或操作进行解密:
高位:0010 0000 = 20
低位:0010 0100 = 21
解密回了原来的数值2021
|