文章目录
1、进制的定义
进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。
- 十进制的定义:由十个符号组成,分别是0 1 2 3 4 5 6 7 8 9 逢十进一。
- 九进制的定义:由九个符号组成,分别是0 1 2 3 4 5 6 7 8 逢九进一。
- 十六进制的定义:由十六个符号组成,分别是0 1 2 3 4 5 6 7 8 9 A B C D E F 逢十六进一。
- 人为定义十进制:由十个符号组成,分别是9 1 5 2 4 7 6 3 8 0 逢十进一。
以下是修正后的二进制与十六进制对照表,以Markdown表格形式呈现:
二进制与十六进制对照表
| 十六进制 | 二进制 |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
| A | 1010 |
| B | 1011 |
| C | 1100 |
| D | 1101 |
| E | 1110 |
| F | 1111 |
扩展:
- 2+3=1成立吗?说明理由。
2、进制的运算
进制运算可通过查找相应进制的加法表、乘法表找到对应的值。
扩展:
- 编制7进制加法表,乘法表。
3、数据宽度
计算机中,由于受硬件的制约,数据都是有长度限制的,我们称为数据宽度。
几个重要的计量单位:
- BYTE 字节 8BIT 1字节
- WORD 字 16BIT 2字节
- DWORD 双字 32BIT 4字节
- 4位宽度表示:假设计算机只能存储4位2进制数(0 ~ F)
- 正数:0 ~ 7
- 负数:F ~ 8 => -1 ~ -8

- 32位宽度表示:假设计算机只能存储32位2进制数(0 ~ FFFFFFFF)

4、逻辑运算
- 或(or |):只要有一个为1就是1;
- 与(and &):两个都为1才是1;
- 异或(xor ^):不一样为1;
- 非(not !): 1是0,0是1。
扩展:
- CPU是如何计算2+3=?
- 如果想获取某个值的第N位的值是多少?
- 最简单的加密算法:异或。
5、32位通用寄存器
32位通用寄存器

不同宽度的寄存器之间的关系

6、MOV指令
r 通用寄存器
m 代表内存
imm 代表立即数
r8 代表8位通用寄存器
m8 代表8位内存
imm8 代表8位立即数
MOV 目标操作数,源操作数
作用:拷贝源操作数到目标操作数
1、源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元.
2、目标操作数可以是通用寄存器、段寄存器或者内存单元.
3、操作数的宽度必须一样.
4、源操作数和目标操作数不能同时为内存单元.
1、MOV r/m8,r8
2、MOV r/m16,r16
3、MOV r/m32,r32
4、MOV r8,r/m8
5、MOV r16,r/m16
6、MOV r32,r/m32
7、MOV r8, imm8
8、MOV r16, imm16
9、MOV r32, imm32
扩展:
- ADD指令
- SUB指令
- AND指令
- OR指令
- XOR指令
- NOT指令
7、寻址方式
1、寻址公式一:[立即数]
MOV EAX,DWORD PTR DS:[0x13FFC4]
2、寻址公式二:[reg] reg代表寄存器 可以是8个通用寄存器中的任意一个
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
3、寻址公式三:[reg+立即数]
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
4、寻址公式四:[reg+reg*{1,2,4,8}]
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
5、寻址公式五:[reg+reg*{1,2,4,8}+立即数]
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
8、堆栈(按一定规则使用内存)
压入数据:相当于往[ESP-4]地址所指的内存写入数据,然后ESP - 4。
PUSH指令
1、PUSH r32
2、PUSH r16
3、PUSH m16
4、PUSH m32
5、PUSH imm8/imm16/imm32
弹出数据:相当于从[ESP]地址所指的内存读取数据,然后ESP+4;
POP指令
1、POP r32
2、POP r16
3、POP m16
4、POP m32
PUSHAD指令
POPAD指令
9、EFLAGS寄存器
EFLAGS寄存器

1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
MOV AL,0xFE
ADD AL,2
2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中"1"的个数的奇偶性。
如果"1"的个数为偶数,则PF的值为1,否则其值为0。
MOV AL,3
ADD AL,3
ADD AL,2
3、辅助进位标志AF(Auxiliary Carry Flag):
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
MOV EAX,0x55EEFFFF
ADD EAX,2
MOV AX,5EFE
ADD AX,2
MOV AL,4E
ADD AL,2
4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
XOR EAX,EAX
MOV EAX,2
SUB EAX,2
5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
MOV AL,7F
ADD AL,2
6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
最高位进位与溢出的区别:
进位标志表示无符号数运算结果是否超出范围。
溢出标志表示有符号数运算结果是否超出范围。
溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:
正 + 正 = 正 如果结果是负数,则说明有溢出
负 + 负 = 负 如果结果是正数,则说明有溢出
正 + 负 永远都不会有溢出.

10、与标志寄存器相关的指令
1、ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样
ADC AL,CL
ADC BYTE PTR DS:[12FFC4],2
ADC BYTE PTR DS:[12FFC4],AL
2、SBB指令:带借位减法
格式:SBB R/M,R/M 两边不能同时为内存 宽度要一样
3、XCHG指令:交换数据
格式:XCHG R/M,R/M/IMM 两边不能同时为内存 宽度要一样
4、MOVS指令:移动数据 内存-内存
标志寄存器中D位的值,影响移动数据的方向:
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSD
5、STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTE PTR ES:[EDI] 简写为STOSB
STOS WORD PTR ES:[EDI] 简写为STOSW
STOS DWORD PTR ES:[EDI] 简写为STOSD
6、REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
MOV ECX,10
REP MOVSD
REP STOSD
11、JMP指令
- MOV EIP,寄存器/立即数 简写为 JMP 寄存器/立即数
- CALL指令:
PUSH 地址B
MOV EIP,地址A/寄存器 简写为:CALL 地址A/寄存器 - RET指令:相当于 pop eip
LEA ESP , [ESP+4]
MOV EIP,[ESP-4] 简写为:RET
12、比较指令
-
CMP指令:
指令格式:CMP R/M,R/M/IMM
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。
只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。
-
TEST指令:
指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.
与的操作表项如下:
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
常见用法:用这个指令,可以确定某寄存器是否等于0。
TEST EAX,EAX
但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。
13、JCC
| 序号 | 指令 | 描述 | 影响标志位 |
|---|---|---|---|
| 1 | JE, JZ | 结果为零则跳转(相等时跳转) | ZF=1 |
| 2 | JNE, JNZ | 结果不为零则跳转(不相等时跳转) | ZF=0 |
| 3 | JS | 结果为负则跳转 | SF=1 |
| 4 | JNS | 结果为非负则跳转 | SF=0 |
| 5 | JP, JPE | 结果中1的个数为偶数则跳转 | PF=1 |
| 6 | JNP, JPO | 结果中1的个数为偶数则跳转 | PF=0 |
| 7 | JO | 结果溢出了则跳转 | OF=1 |
| 8 | JNO | 结果没有溢出则跳转 | OF=0 |
| 9 | JB, JNAE | 小于则跳转 (无符号数) | CF=1 |
| 10 | JNB, JAE | 大于等于则跳转 (无符号数) | CF=0 |
| 11 | JBE, JNA | 小于等于则跳转 (无符号数) | CF=1 or ZF=1 |
| 12 | JNBE, JA | 大于则跳转(无符号数) | CF=0 and ZF=0 |
| 13 | JL, JNGE | 小于则跳转 (有符号数) | SF≠ OF |
| 14 | JNL, JGE | 大于等于则跳转 (有符号数) | SF=OF |
| 15 | JLE, JNG | 小于等于则跳转 (有符号数) | ZF=1 or SF≠ OF |
| 16 | JNLE, JG | 大于则跳转(有符号数) | ZF=0 and SF=OF |
14、堆栈图
