汇编速记

个人见解:
汇编方面所需的大概知识如下,以后想补充会再更新的(咕咕咕)

概览

  • 汇编指令
  • 寄存器(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 一起存放运算结果等数据(例如乘、除等运算)
  • 指令指针寄存器
    • EIP —- 指令指针寄存器
      • 存储下一条执行的汇编的地址
  • 堆栈指针寄存器
    • ESP —- 存放栈顶地址
    • EBP —- 存放栈底地址
  • 索引寄存器 通常用于字符串操作中
    • ESI —- 指向要处理的数据地址(Source Index)
      • 存储源地址(例如数组的值)
    • EDI —- 指向存放处理结果的数据地址(Destination 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)对应运算产生进位
      • 等等

内存管理

通常.text和.rodata可以放在一起视为code段

  • 数据区
    • .data — 主要存放已定义初始值(0除外)的全局变量及静态局部变量
      • 属性可写
    • .bss — 主要存放无初始值或初始值为0的全局变量及静态局部变量
      • 属性可写
    • .text — 存放机械语和代码
      • 属性可读可执行,但通常不可写
    • .rodata — 存放字符串或者常量(const)
      • 属性只读(read only data)
    • heap — 动态分配的内存段,可用malloc及free等函数动态扩张与缩减
    • stack — 存放临时创建的局部变量(向上增长,堆向下)

各段在内存的排列如下

aa

本文标题:汇编速记

文章作者:Herm1t

发布时间:2019年06月24日 - 22:21:24

最后更新:2020年04月20日 - 11:48:14

原始链接:https://zoomgod.github.io/bin/汇编速记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

U know what I mean