几种基本汇编指令详解

转自:http://blog.csdn.net/luoyhang003/article/details/46786591

几种基本汇编指令详解

常见寄存器

寄存器 16位 32位 64位
累加寄存器 AX EAX RAX
基址寄存器 BX EBX RBX
计数寄存器 CX ECX RCX
数据寄存器 DX EDX RDX
堆栈基指针 BP EBP RBP
变址寄存器 SI ESI RSI
堆栈顶指针 SP ESP RSP
指令寄存器 IP EIP RIP

汇编指令

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
    
         
         
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

push:压栈

  • push %eax 

    相当于:

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

pop:出栈

  • pop %eax 

    相当于:

    movl (%esp), %eax
    addl %4, %esp
    //栈顶指针加4
    
         
         
    • 1
    • 2
    • 3
    • 4

call&ret

call

  • call 0x12345 

    相当于:

    pushl %eip
    movl $0x12345, %eip
    //当前地址压栈,存入新地址
    
         
         
    • 1
    • 2
    • 3
    • 4

ret

  • 相当于:

    popl %eip
    //栈 -> eip
    
         
         
    • 1
    • 2
    • 3

enter&leave

enter

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

   
   
  • 1
  • 2
  • 3
  • 4

leave

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

   
   
  • 1
  • 2
  • 3
  • 4

例子:分析一段汇编代码

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

image

image

image

image

image

版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com)
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值