1. 数据宽度
类型 | 大小 | 范围 |
---|---|---|
bit | 1位 | 0~1 |
Byte | 8位 | 0~0xFF |
Word | 16位 | 0~0xFFFF |
DWord(Double Word) | 32位 | 0~0x FFFF FFFF |
QWord(Quad Word) | 64位 | 0~0x FFFF FFFF FFFF FFFF |
2. 有符号数与无符号数
- 无符号数
1 0 0 1 1 0 1 0 十六进制:0x9A 十进制:154
-
有符号数,最高位是符号位:1(负数),0(正数)
-
原码反码补码
- 原码:最高位是符号位
- 反码:
- 正数:反码和原码相同
- 负数:符号位是1,对原码的其余位取反
- 补码:
- 正数:反码和原码相同
- 负数:符号位是1,对原码的其余位取反再加1
3. 位运算实现加减乘除
4 + 5 ?
# 计算机实现加运算
0000 0100
0000 0101
-------------
0000 1001
# 计算机实现原理
# 第一步:异或,如果不考虑进位,异或就可直接出结果
0000 0100
0000 0101
-------------
0000 0001
# 第二步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0100
0000 0101
-------------
0000 0100
# 第三步:将与运算的结果,左移一位
0000 1000
# 第四步:将第一步与第三步结果异或
0000 0001
0000 1000
-------------
0000 0101
# 第五步:与运算(判断进位,如果与运算结果为0,则没有进位)
0000 0001
0000 1000
-------------
0000 0000
# 最终结果是第四步的结果
4 - 5 ?
# 计算机实现减法
4 + (-5): 4 + 5的补码
(-5的补码): 1111 1011
# 第一步:异或
0000 0100
1111 1011
-------------
1111 1111
# 第二步:与运算
0000 0100
1111 1011
-------------
0000 0000
# 第三步:将与运算的结果,左移一位
0000 0000
# 第四步:将第一步与第三步结果异或
1111 1111
0000 0000
-------------
1111 1111
# 第五步:与运算,将第一步与第四步结果与一下(判断进位,如果与运算结果为0,则没有进位)
1111 1111
0000 0000
-------------
0000 0000
4 * 5 ?:加法 + 移位
4 / 5 ?:减法 + 移位
4. 汇编语言
4.1 OD (Ollydbg)
- Ollydbg 通常称作OD,是反汇编工作的常用工具
4.2 寄存器
- 32位CPU 8 16 32
- 64位CPU 8 16 32 64
通用寄存器:32位的通用寄存器只有8个
存值的范围:0 ~ 0xFFFFFFFF
mov指令:修改计算机中的值
mov 存的地址, 存的数 # 将存的数传给地址
mov 存的地址1, 存的地址2 # 将地址2中的值传给地址1
Eg:
mov eax, 1
mov ecx, eax
通用的寄存器:
FFFF FFFF FFFF FF
32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
ENP NP CH
ESI SI DH
EDI DI BH
L代表低8位,H代表高8位
除了通用寄存器外,其他的所有寄存器每一位都有自己特定的功能
4.3 内存
每个内存地址都有一个编号,可以通过这些编号向内存里存值。
表示地址的六种方式:
形式一:立即数(内存)
读取内存的值
mov eax,dword ptr ds:[0x13FFC4]
向内存中写入数据
mov dword ptr ds:[0X13FFC4],eax
形式二:[立即数+偏置]
ds:[0x13FFC0+4]
形式三:[寄存器]
读取内存的值
move ecx,0x13FFD0
mov eax,dword ptr ds:[ecx]
向内存中写入数据
mov edx,0x13FFD8
mov dword ptr ds:[edx],0x87654321
形式四:[寄存器+偏置]
读取内存的值
mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx+4]
向内存中写入数据
mov edx,0x13FFD8
mov dword ptr ds:[edx+0xC],0x87654321
形式五:[寄存器+寄存器*{1,2,4,8}]
读取内存的值
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+eax*4]
向内存中写入数据
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+eax*4],0x87654321
形式六:[寄存器+寄存器*{1,2,4,8}+偏置]
读取内存的值
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+eax*4+4]
向内存中写入数据
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+eax*4+4],0x87654321
5. 汇编语言常用指令
一、常用指令:MOV指令、ADD指令、SUB指令、AND指令、OR指令、XOR指令、NOT指令
MOV 的语法:
MOV r/mX,rX r 通用寄存器,X 表示位数可以8、16、32
MOV rX,r/mX m 代表内存
MOV rX, immX imm 代表立即数
1、源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元.
2、目标操作数可以是通用寄存器、段寄存器或者内存单元.
3、操作数的宽度必须一样.
4、源操作数和目标操作数不能同时为内存单元.
mov dword ptr ds:[0x0012FF34],0x12345678 的含义:
dword :要读/写多少此时是4字节 byte == 1字节 word == 2字节
ptr::Pointer 代表指针 (指针的意思就是里面存的不是普通的值,而是个地址)
ds:Data Segment 段寄存器
0x0012FF34:内存编号,必须是32位的 前面0可以省略
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)
ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样
SBB指令:带借位减法
格式同上;
XCHG指令:交换数据
格式同上;
MOVS指令:移动数据 内存-内存
MOVS BYTE|WORD|DWORD PTR ES:[EDI],BYTE PTR DS:[ESI]
STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTEBYTE|WORD|DWORD PTR ES:[EDI]
REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
MOVSX 先符号扩展,再传送
MOV AL,80
MOVSX CX,AL
MOVZX 先零扩展,再传送.
MOV AL,80
MOVSX CX,AL
二、寄存器与内存区别:
1、寄存器位于CPU内部,执行速度快,但比较贵。
2、内存速度相对较慢,但成本较低,所以可以做的很大
3、寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的。
4、寄存器常用的有8个:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。
5、计算机中的几个常用计量单位:BYTE WORD DWORD QWORD
我们称计算机CPU是32位或者64位,主要指的就是内存编号的宽度,而不是寄存器的宽度。计算机内存的每一个字节会有一个编号,就是地址值。
三、寻址方式
寻址公式一:[立即数]
MOV EAX,DWORD PTR DS:[0x13FFC4] ;读取内存的值:
MOV DWORD PTR DS:[0x13FFC4],eax ;MOV DWORD PTR DS:[0x13FFC4],eax
LEA EAX,DWORD PTR DS:[0X13FFC4] ;获取内存编号:实际上就是0X13FFC4
寻址公式二:[reg] reg代表寄存器 可以是8个通用寄存器中的任意一个
同上,只是0x13FFC4 改成 寄存器;MOV EAX,DWORD PTR DS:[ECX]
寻址公式三:[reg+立即数]
MOV EAX,DWORD PTR DS:[ECX+4]
寻址公式四:[reg+reg*{1,2,4,8}]
MOV EDX,DWORD PTR DS:[EAX+ECX4]
寻址公式五:[reg+reg{1,2,4,8}+立即数]
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]