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:将
  • 相关阅读:
    Redis 分布式锁
    Angular VS Blzaor
    Chorme 跨域的快捷解决
    旋转3角形
    .Netcore AD 操作
    .Netcore 2.2 和3.1 的模板
    Command3
    CSS Selector
    弹性盒子
    Label_strange_labels
  • 原文地址:https://www.cnblogs.com/HYWZ36/p/10297375.html
Copyright © 2011-2022 走看看