当前位置 博文首页 > 随意的风的专栏:几种基本汇编指令详解

    随意的风的专栏:几种基本汇编指令详解

    作者:[db:作者] 时间:2021-09-06 16:11

    几种基本汇编指令详解

    常见寄存器

    寄存器16位32位64位
    累加寄存器AXEAXRAX
    基址寄存器BXEBXRBX
    计数寄存器CXECXRCX
    数据寄存器DXEDXRDX
    堆栈基指针BPEBPRBP
    变址寄存器SIESIRSI
    堆栈顶指针SPESPRSP
    指令寄存器IPEIPRIP

    汇编指令

    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 %esp, %ebp     ②
        subl $4, %esp  ③
        movl $8, (%esp)        ④
    

    image

    image

    image

    image

    image


    8、mov pc,lr 函数返回

    ARM中LR存储的是PC的值,IR存储的是下一条将要执行的指令,有什么区别?

    先看定义:

    (1)PC是程序计数器,存储将要执行的指令地址

    (2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。

    (3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中(有的书上叫做缓冲寄存器,BR),然后再传送至IR。

    说白了,LR存的是指令地址,IR存的是指令内容。

    cs
    下一篇:没有了