• 基础汇编指令(16bit 32bit 64bit)


    (zz from http://blog.luoyuanhang.com/)

    ##常见寄存器

    寄存器16位32位64位
    累加寄存器
    accumulator
    AX EAX RAX
    基址寄存器
    base
    BX EBX RBX
    计数寄存器
    count
    CX ECX RCX
    数据寄存器
    data
    DX EDX RDX
    堆栈基指针
    Base Pointer 
    BP EBP RBP
    变址寄存器
    Source Index
    SI ESI RSI
    堆栈顶指针
    Stack Pointer
    SP ESP RSP
    指令寄存器
    Instruction Pointer
    IP EIP RIP
    AH&AL=AX(accumulator):累加寄存器 
    BH&BL=BX(base):基址寄存器 
    CH&CL=CX(count):计数寄存器 
    DH&DL=DX(data):数据寄存器 
    SP(Stack Pointer):堆栈指针寄存器 
    BP(Base Pointer):基址指针寄存器 
    SI(Source Index):源变址寄存器 
    DI(Destination Index):目的变址寄存器 
    IP(Instruction Pointer):指令指针寄存器 
    CS(Code Segment)代码段寄存器 
    DS(Data Segment):数据段寄存器 
    SS(Stack Segment):堆栈段寄存器 
    ES(Extra Segment):附加段寄存器 

    ##汇编指令

    ##mov

    • movb(8位)、movw(16位)、movl(32位)、movq(64位)

    • 寄存器寻址:

      movl %eax, %edx

      eax -> edx

    • 立即数寻址:

      movl $0x123, %edx

      数字->寄存器

    • 直接寻址:

      movl 0x123, %edx

      直接访问内存地址数据,edx = *(int32_t *)0x123;

    • 间接寻址:

      movl (%ebx), %edx

      %ebx 是个内存地址,(%ebx)指的是该地址中的数据,edx = *(int32_t*)ebx;

    • 变址寻址:

      movl 4(%ebx), %edx

      edx = *(int32_t*)(ebx+4);

    ##push & pull

    ###堆栈数据结构简介

    ####作用:

    • 程序调用框架
    • 传递参数
    • 保存返回地址
    • 提供局部变量
    • ……

    ####结构:

    image

    • 相关寄存器: esp, ebp

    • 相关操作: pop, push

      //建立被调用者函数的堆栈框架
      pushl %ebp
      movl %esp, %ebp
      
      //拆除框架
      movl %ebp, %esp
      popl %ebp
      ret
      

    ###push:压栈

    • push %eax

      相当于:

      subl $4, %esp
      //栈顶指针减4
      movl %eax, (%esp)
      //%eax -> esp 地址
      

    ###pop:出栈

    • pop %eax

      相当于:

      movl (%esp), %eax
      addl %4, %esp
      //栈顶指针加4
      

    ##call&ret

    ###call

    • call 0x12345

      相当于:

      pushl %eip
      movl $0x12345, %eip
      //当前地址压栈,存入新地址
      

    ###ret

    • 相当于:

      popl %eip
      //栈 -> eip
      

    ##enter&leave

    ###enter

    push %ebp
    movl %esp, %ebp
    //将堆栈置空(栈上重堆)
    

    ###leave

    movl %ebp, %esp
    popl %ebp
    //将堆栈置空(撤销堆栈)
    

    ##例子:分析一段汇编代码

    pushl $8    ①
    movl %ebp, %esp        ②
    subl $4, %esp    ③
    movl $8, (%esp)        ④
    

    image

    image

    image

    image

    image

     
     
  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
    POJ
    hdu-4745 Two Rabbits
    蓝桥杯历年试题 小朋友排队
    蓝桥杯历年试题 矩阵翻硬币
  • 原文地址:https://www.cnblogs.com/zafu/p/9578219.html
Copyright © 2020-2023  润新知