zoukankan      html  css  js  c++  java
  • 汇编语言与逆向工程

    1.寄存器
    基本知识
      CPU的基本组成部件:时钟、ALU、CU和寄存器。
        时钟是计算机运行的“节拍器”,机器指令的最小执行时间就是一个时钟周期;
        ALU是算术逻辑单元,功能就是执行各种算术运算和逻辑运算;
        CU是控制单元,由指令寄存器、指令译码器和指令控制器组成,它协调各个指令的执行顺序;
        寄存器是临时存储数据和地址供CPU使用的东西,它包括8个通用寄存器(EAX、EBX、ECX、EDX、EDI、ESI、ESP、EBP)、1个指令指针寄存器(EIP,始终指向下一条待执行指令的地址)、1个CPU状态寄存器(EFLAGS)和6个段寄存器。
     
      总线是用于连接芯片的导线,分为地址总线、数据总线和控制总线。
        地址总线:CPU要访问内存中的指令和数据,就得首先访问内存的地址;CPU访问哪个地址,地址总线上就是这个地址。宽度为N的地址总线的寻址空间为2^N;
        数据总线:用于传输指令和数据;
        控制总线:它是不同控制线的集合。有多少条控制总线,就有多少种控制,所有控制总线的宽度决定了CPU对外接设备的控制能力。
     
    什么是寄存器
      寄存器是CPU的重要组成部分,它是存储指令、数据和地址的高速存储部件。在CU中存在指令寄存器(IR,Instruction Register),在ALU中存在累加器(ACC,accumulator)。
     
    寄存器分类
      IA-32架构是Intel 80386到目前奔腾系统所用的Intel处理器架构有16个寄存器构成(8个通用寄存器、1个指令指针寄存器、1个CPU状态控制器和6个段寄存器)
     
    通用寄存器
      32位CPU的通用寄存器有8个:EAX(可存储4字节内容,即DWORD内容),EBX,ECX,EDX,EDI,ESI,ESP,EBP;
      16位CPU(8086CPU)的通用寄存器有8个:AX(可存储2字节内容,即WORD内容),BX,CX,DX,DI,SI,SP,BP;
      8位CPU的通用寄存器有8个:AH/AL,BH/BL,CH/CL,DH/DL。
      通用寄存器可以用来存储传输以下数据:算术和逻辑运算的操作数、用于地址计算的操作数、内存指针。
      EAX:累加寄存器,是操作数和结果数的累加器;
      EBX:基址寄存器,是指向DS段中数据的指针;
      ECX:计数寄存器,是字符串或循环操作的计数器;
      EDX:数据寄存器
      (上面四个寄存器主要用于算术运算ADD/SUB/XOR/OR,用于保存常量或变量的值)  
      (ESI、EDI)变址寄存器
        ESI(字符串操作源指针)源变址寄存器;
        EDI(字符串操作目的指针)目的变址寄存器。
        变址寄存器在字符串操作中使用的较多,经常和串指令(MOVS/LODS/STOS)一起使用。
        变址寄存器存放存储单元在段内的偏移量,用它们可实现多种寻址方式。
      (ESP、EBP)指针寄存器
        ESP:堆栈指针寄存器,用于存放当前堆栈的栈顶地址,不能用作一般的通用寄存器;
        EBP:基址指针寄存器,用于存放栈区域的基地址。当函数被调用时存储ESP的值,调用完毕后返回给ESP值。
    段寄存器
      8086CPU有20条地址总线,最大寻址空间是1MB;但它却是16位的CPU,表现出的寻址能力是64KB。因此,采用两个16位地址合成的方法,形成20位的物理地址。
      8086CPU的段寄存器有CS(代码段)、DS(数据段)、SS(堆栈段)、ES(其他),物理地址=段基址(段地址*10H)+偏移地址。20位地址总线寻址范围分段,每段地址空间为2^4=16B,一共有2^20/2^4=64KB个段。
      80386CPU有32条地址和数据总线,最大寻址空间是4GB;它是32位CPU。它有6个段寄存器:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(其他数据段)、FS(其他数据段)、GS(附加数据段)。
      80386CPU中,CS即存放应用代码所在段的段基址,它是高16位,下同;
      DS即存放数据所在段的段基址;
      SS即存放堆栈所在段的段基址;
      ES、FS、GS即存放附加数据所在段的段基址。
     
    程序状态与控制寄存器(即标志寄存器)
      它可以存储操作的结果、为CPU的指令提供行为依据、控制CPU的工作方式。它包括一组状态标志、一个方向标志和一组系统标志。
      状态标志表示算术指令和结果。
        (0)CF:进位标志位,用于无符号运算中;
        (2)PF:奇偶标志位,表示结果中1的个数是否为偶数;
        (4)AF:辅助进位标志位。在字运算中,记录低字节向高字借位或进位时;在字节运算中,记录低4位向高4位借位或进位时;
        (6)ZF:零标志位;
        (7)SF:符号标志位,记录结果是否为负;
        (8)OF:溢出标志位,用于有符号运算中。
    指令指针寄存器(EIP)
      它保存着CPU下一条要执行指令的相对于代码段基址的偏移地址。当程序运行,CPU从EIP取走地址,它会自动增加地址。不能直接修它的值,可通过JMP、JCC、CALL、RET、中断和异常来修改。
     
    2.x86指令集
    数据传送指令
      数据传送指令分为通用数据传送指令、地址传送指令和标志寄存器传送指令。其中,通用数据传送指令分为数据传送指令、堆栈操作指令和数据交换指令。
      数据传送指令是将数据、地址或立即数传送至寄存器或存储单元中的指令,它通常不影响状态标志位,除了涉及标志寄存器的指令(SAHF和POPF)。
      通用数据传送指令
        MOV
          将源操作数传送至目的操作数。MOVSX:带符号扩展;MOVZX:带零扩展。
          源操作数可为存储器、通用寄存器、段寄存器和立即数,目的操作数可为存储器、通用寄存器、段寄存器(除了CS)。立即数不能传送至段寄存器,两存储单元之间、两段寄存器之前不能传送数据,IP寄存器不能作为源操作数或目的操作数;立即数传送至存储器时很难确定长度,所以经常添加类型BYTE PTR或WORD PTR;。
        PUSH/PUSHA/PUSHAD
          PUSH:操作数进栈
          PUSHA:将
  • 相关阅读:
    面向接口程序设计思想实践
    Block Chain Learning Notes
    ECMAScript 6.0
    Etcd Learning Notes
    Travis CI Build Continuous Integration
    Markdown Learning Notes
    SPRING MICROSERVICES IN ACTION
    Java Interview Questions Summary
    Node.js Learning Notes
    Apache Thrift Learning Notes
  • 原文地址:https://www.cnblogs.com/HYWZ36/p/10297375.html
Copyright © 2011-2022 走看看