汇编
二进制
1、计算机中所有信息都是以二进制的形式储存的
2、CPU只认识0和1,即二进制 CPU<->硬编码<->汇编语言<->C语言代码
3、因为二进制复杂,所以很多软件改用十六进制简写二进制
数据宽度
- 位
- bit,是最基础的概念,在计算机中,由于只存在逻辑0和逻辑1,因此很多东西、动作、数字都要表示为一串二进制。如:1001 0000 1101等。其中每一个逻辑0与1就是一个位,英文名叫‘bit’,是计算机中最基础的单位。
- 字节
- byte,是由八进制组成的一个单元,也就是8个bit组成一个byte。在计算机中,用于表示ASCII字符,便是运用字节来记录表示字母和一些符号。
- 字
- word,表示计算机处理指令或数据的二进制位数,是计算机进行数据储存和数据处理的运算的单位
寄存器
通用寄存器
可以用于传送和暂存数据,也可以参与算数逻辑运算,并保存运算结果。除此以外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途及特殊用途,只有这样,才能在程序中做到正确、合理使用它们。
32位以下:
- EAX:(针对操作数和数据结果)累加器,返回函数结果
- ECX:(字符串和循环操作数)计数器
- EDX:(I/O指针)数据寄存器
- EBX:(DS段中的数据指针)基址寄存器
- ESP:(SS段中栈指针)栈指针寄存器
- EBP:(SS段中栈内数据指针)扩展基址指针寄存器
- ESI:(字符串操作源指针)源变址寄存器
- EDI:(字符串操作目标指针)目的变址寄存器
64位:RAX 16位:AX 8位:AL
标志寄存器
X86架构CPU中,标志寄存器主要有3个作用:
- 存储相关指令执行后的结果,例如:CF、PF、AF、ZF、OF标志位
- 执行相关指令时,提供行为依据,例如执行 JE 指令时会读取ZF的值,来决定是否进行跳转
- 控制CPU的工作方式
16位模式下,标志寄存器名称为FLAG,寄存器大小16位
32位模式下,标志寄存器的名称为EFLAG,寄存器大小32位
64位模式下,为RFLAG,寄存器大小64位
EFLAG寄存器各个位都有不同的用途,灰色的部分为保留位
汇编指令
- r 通用寄存器
- m 代表内存
- imm 代表立即数
如:
r8 代表8位通用寄存器
m8 代表8位内存
imm8 代表8位立即数
按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。
运算
and运算(与)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。
or运算(或)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。
xor运算(异或)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
not运算(非)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
内存寻址
寄存器位于CPU中,执行速度快,内存速度相对较慢,但是空间很大。寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的。
在计算机中每一个字节都有一个编号,这里可以认为内存的编号就是字节,在32位下范围为00000000-FFFFFFFF,最大寻址为FFFFFFFF+1字节,即4G。
cs ds ss es: 在用户层中只是起寻址的作用,在内核层涉及到段、页会有其他的用途。
cs:代码段
ds:数据段
ss:堆栈段
es:附加段
向指定内存写入数据
- ds:data segement register,即数据段寄存器
- ptr:表示后面是一个指针
1 | mov dword segement register 即数据段寄存器 |
- lea:取内存的地址
内存寻址的方式
立即数寻址
1 | mov eax,dword ptr ds:[0x19FF84] |
通用寄存器寻址
1 |
汇编语句
jcc语句
jmp跳转到指定地址:e9
不涉及堆栈变化(不修改ebp&esp)
本质:修改EIP
call语句
call跳转到指定地址并返回当前指令的下一行:e8,会涉及堆栈变化
e8:就近跳转
ff 15:远跳转,无限地址
esp语句
提升4字节,将返回地址压入堆栈





