个人见解:
汇编方面所需的大概知识如下,以后想补充会再更新的(咕咕咕)
概览
- 汇编指令
- 寄存器(x86)
- 内存管理
汇编指令
- Qword — 8个字节
- Dword — 4个字节
- Word — 2个字节
- Byte — 1个字节
一些最常用的汇编指令如下(INTEL格式):
此段源自长亭科技专栏
- MOV:数据传输指令,将 SRC 传至 DST,格式为
MOV DST, SRC;
- PUSH:压入堆栈指令,将 SRC 压入栈内,格式为
PUSH SRC;
- POP:弹出堆栈指令,将栈顶的数据弹出并存至 DST,格式为
POP DST;
- LEA:取地址指令,将 MEM 的地址存至 REG ,格式为
LEA REG, MEM;
- ADD/SUB:加/减法指令,将运算结果存至 DST,格式为
ADD/SUB DST, SRC;
- AND/OR/XOR:按位与/或/异或,将运算结果存至 DST ,格式为
AND/OR/XOR DST,SRC;
- CALL:调用指令,将当前的 eip 压入栈顶,并将 PTR 存入 eip,格式为
CALL PTR;
- RET:返回指令,操作为将栈顶数据弹出至 eip,格式为
RET;
寄存器(x86)
- 通用寄存器
- EAX —- 累加寄存器(Accumulator)
- 用以进行算数运算和返回函数结果等
- EBX —- 基址寄存器(Base)
- 在内存寻址时用以存放基地址存储数据指针(如数组的[0])
- ECX —- 记数寄存器(Counter)
- 循环计数用(从大到小递减)
- EDX —- 数据寄存器(Data)
- 配合 eax 一起存放运算结果等数据(例如乘、除等运算)
- EAX —- 累加寄存器(Accumulator)
- 指令指针寄存器
- EIP —- 指令指针寄存器
- 存储下一条执行的汇编的地址
- EIP —- 指令指针寄存器
- 堆栈指针寄存器
- ESP —- 存放栈顶地址
- EBP —- 存放栈底地址
- 索引寄存器 通常用于字符串操作中
- ESI —- 指向要处理的数据地址(Source Index)
- 存储源地址(例如数组的值)
- EDI —- 指向存放处理结果的数据地址(Destination Index)
- 存储目标地址(例如数组的下标)
- ESI —- 指向要处理的数据地址(Source Index)
- 段寄存器
- CS —- 存储当前代码段(Code Segment)的段基址
- DS —- 存储数据段(Data Segment)的段基址
- SS —- 存储函数调用栈(Stack Segment)的段基址
- ES —- 附加的存储数据段地址的寄存器
- FS —- 附加的存储数据段地址的寄存器
- GS —- 附加的存储数据段地址的寄存器
- 标志位寄存器
- EFLAGS —- 32位中的大部分被用于标志数据或程序的状态
- OF(Overflow Flag)对应数值溢出
- IF(Interrupt Flag)对应中断
- ZF(Zero Flag)对应运算结果为0
- CF(Carry Flag)对应运算产生进位
- 等等
- EFLAGS —- 32位中的大部分被用于标志数据或程序的状态
内存管理
通常.text和.rodata可以放在一起视为code段
- 数据区
- .data — 主要存放已定义初始值(0除外)的全局变量及静态局部变量
- 属性可写
- .bss — 主要存放无初始值或初始值为0的全局变量及静态局部变量
- 属性可写
- .text — 存放机械语和代码
- 属性可读可执行,但通常不可写
- .rodata — 存放字符串或者常量(const)
- 属性只读(read only data)
- heap — 动态分配的内存段,可用malloc及free等函数动态扩张与缩减
- stack — 存放临时创建的局部变量(向上增长,堆向下)
- .data — 主要存放已定义初始值(0除外)的全局变量及静态局部变量
各段在内存的排列如下