汇编语言入门教程

一、汇编语言是什么

​ 汇编语言是二进制指令(操作码)的文本形式,与指令是一一对应的关系。比如加法指令00000011写成汇编语言就是ADD

二、前置知识——寄存器

​ 1、寄存器不依靠地址区分,而依靠名称,CPU通过名字去具体的寄存器拿数据。
在这里插入图片描述

​ 2、寄存器的种类

​ 分为通用和专用寄存区

  • EAX
  • EBX
  • ECX
  • EDX
  • EDI
  • ESI
  • EBP 栈的基地址,不发生改变
  • ESP 用来保存当前栈的地址(栈指针的位置,值会随着压栈、弹栈发生变化)

三、前置知识——Heap(堆)

​ 由用户主动请求而划分出来的内存区域,叫做Heap。

  • 由低位地址向高位地址增长
  • 不会自动释放,必须手动释放,或者由垃圾回收机制来回收

四、前置知识——Stack(栈)

​ 1、帧的概念

系统会在栈中为每一个函数建立一个帧(frame),所以调用栈有多少层(递归),就有多少帧;函数运行结束,帧就被回收。

​ 2、出栈(pop)和入栈(push)

​ Stack 是由内存区域的结束地址开始,从高位(地址)向低位(地址)分配。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqzLyl2h-1648713555012)(images/汇编语言入门/bg2018012215-16487116800653.png)]

五、CPU指令

​ 一个CPU指令可以有零个到多个运算子

根据一个例子来学习

_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  

_main:
   push   3
   push   2
   call   _add_a_and_b 
   add    %esp, 8
   ret

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmwfOiMb-1648713555013)(images/汇编语言入门/bg2018012216.png)]

1、push指令

push 3

这个push操作涉及到下面几个步骤

  • 取出ESP寄存器里的地址
  • 减去4个字节(int类型,向下生长)
  • 新地址写入ESP
  • 3被写入这个地址开始的四个字节

注意:esp始终指的是栈顶

2、call指令

​ 调用函数指令,程序会去找对应函数名的标签,建立一个新的栈帧(绿色部分)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Z4lAMT9-1648713555013)(images/汇编语言入门/image-20220331155813906.png)]

3、move指令

将一个值写入某个寄存器

mov    %eax, [%esp+8] 

esp + 8这个地址指向的值放入eax

4、add指令

两个运算子相加,并把结果放进前一个寄存器

add    %eax, %ebx

结果保存在eax寄存器里

5、pop指令

取出Stack最近一个写入的值(即最低位地址的值),放入运算子指定位置

pop    %ebx

注意:pop会将esp寄存器里的地址加4,即回收4个字节

6、ret指令

ret指令用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。

该指令没有运算子

  • 14
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值