汇编语言入门教程

一、汇编语言是什么

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

二、前置知识——寄存器

​ 1、寄存器不依靠地址区分,而依靠名称,CPU通过名字去具体的寄存器拿数据。
汇编语言入门教程_第1张图片

​ 2、寄存器的种类

​ 分为通用和专用寄存区

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

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

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

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

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

​ 1、帧的概念

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

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

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

汇编语言入门教程_第2张图片

五、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

汇编语言入门教程_第3张图片

1、push指令

push 3

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

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

注意:esp始终指的是栈顶

2、call指令

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

汇编语言入门教程_第4张图片

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指令用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。

该指令没有运算子

你可能感兴趣的:(日常学习,学习,其他)