《C++黑客编程解密》05 - 汇编

x86汇编(32位)

CPU工作模式:

  1. 实模式:
    早期Win9x DOS 所支持,可以直接访问硬件,直接对端口操作,对中断进行操作。现在cpu仍支持实模式,一是为了与早期cpu架构兼容,二是因为所有x86架构都是从实模式引导起来的。
  2. 保护模式:
    每个进程间都是隔离的。现在处理器的主要工作模式。

x84 cpu中有4类寄存器

  1. 8个通用寄存器
    EAX  EBX  ECX  EDX  4个,每个都是32位,又可以当做16位和8位的使用。如EAX的低16位可作为AX,AX又可以按高低8位分为AH和AL。
    指针寄存器可以按照32位和16位使用,但无法分为8位

    通用寄存器的特殊用途
    1. EAX 在乘法和除法中被自动使用
    2. CPU 自动使用ECX作为循环计数器
    3. ESP 栈指针寄存器,始终指向栈顶
    4. ESI EDI 用于内存数据高速传送,源指针寄存器和目的指针寄存器
    5. EBP 高级语言用来应用参数和局部变量,通常被称为栈帧基址寄存器
  2. 6个段寄存器
    1. CS 代码段
    2. DS 数据段
    3. SS 堆栈段
    4. ES 附加段
    5. FS
    6. GS
  3. 1个标识寄存器
    FLAGS(或 PSW) 此处介绍16位的标识寄存器,分为条件标识位和控制标识位。

    条件标识位:
    1  OF(Overflow Flag) 溢出时1,否则0
    2  SZ(Sign Flag)符号标识,运算结果为负时为1,否则为0
    3  ZF(Zero Flag)零标识,结果为0时为1,否则0
    4  AF(Auxiliary carry Flag)辅助进位标识,记录运算时第3位(半字节)产生的进位,有进位为1
    5  PF(Parity Flag)奇偶标识,结果操作数中1的个数为偶数时为1,否则为0
    6  CF(Carry Flag)进位标识,产生进位时 1,否则0
    控制寄存器:
    1  DF(Direction Flag)方向标识,串处理指令中用于控制方向
    2  IF(Interrupt Flag)中断标志
    3  TF(Trap Flag)陷阱标志
  4. 1个指令寄存器
    EIP 保存吓一跳指令的地址

数据传输指令

  1. mov 目的操作数, 源操作数     ;数据传送指令
  2. xchg 目标操作数,源操作数    ;交换两个操作数的数据
  3. push  操作数
    把一个操作数送入堆栈。因为堆栈是由高地址向低地址延申,esp寄存器的值递减。在32位平台上每次减4。
  4. pop  操作数
    把esp指向地址(栈顶)中的值送入寄存器或内存,然后esp地址加4。
  5. lea 目的操作,源操作数                ;装入有效地址,它的操作数就是地址而不是具体数据,这个lea与mov的区别

算术运算指令

  1. add
  2. sub
  3. adc 目的操作数,源操作数
    类似add指令,区别在于相加后要再加上CF中值。 目的操作数 = 目的操作数 + 源操作数 + CF中值
  4. sbb
    目的操作数 = 目的操作数 - 源操作数 - CF中值
  5. inc
    加一
  6. dec
    减一

操作内存时如果无法明确内存长度,要指出长度。dword ptrword ptr byte ptr 分别指 4 2 1 个字节

位运算

  1. and
    影响标识位 OF SF ZF PF CF
  2. or
    影响 OF SF  ZF  PF  CF
  3. not
  4. xor
    影响 OF  SF  ZF  PF  CF
  5. test
    测试指令,测试目标操作数的单个位,与逻辑与类似,影响标识位,但不改变目的操作数内容
    影响 OF  SF  ZF  PF  ZF

流程控制指令

  1. cmp
    隐含执行减法,只影响标识位,不改变操作数
    影响 OF SF ZF AF PF CF
  2. jmp
    无条件跳转
  3. jcc  条件跳转
  4. loop
    循环控制指令,与 ecx 搭配,执行到 loop 语句时,先将 ecx 中的值减1,如果 ecx 大于0,则跳转到 loop 指令后的标号处。
  5. call
    过程调用指令,将下一条指令地址压入堆栈,并将控制转移到目的地址
    相当于执行了 push eipjmp 目的地 两条指令
  6. ret
    过程返回指令,相当于 pop eip 指令

eip 寄存器无法直接操作,只有通过流程控制指令改变eip寄存器

寻址方式

  1. 指令中给出数据
  2. 数据在寄存器中
  3. 数据在内存中
    1. 直接寻址
      mov eax, [00402000h]
    2. 寄存器间接寻址
      mov eax,[eax]
    3. 其他

 

posted @ 2022-08-09 17:40  某某人8265  阅读(81)  评论(0编辑  收藏  举报