一、汇编语言是什么
汇编语言是二进制指令(操作码)的文本形式,与指令是一一对应的关系。比如加法指令00000011
写成汇编语言就是ADD
二、前置知识——寄存器
1、寄存器不依靠地址区分,而依靠名称,CPU通过名字去具体的寄存器拿数据。
2、寄存器的种类
分为通用和专用寄存区
- EAX
- EBX
- ECX
- EDX
- EDI
- ESI
- EBP 栈的基地址,不发生改变
- ESP 用来保存当前栈的地址(栈指针的位置,值会随着压栈、弹栈发生变化)
三、前置知识——Heap(堆)
由用户主动请求而划分出来的内存区域,叫做Heap。
- 由低位地址向高位地址增长
- 不会自动释放,必须手动释放,或者由垃圾回收机制来回收
四、前置知识——Stack(栈)
1、帧的概念
系统会在栈中为每一个函数建立一个帧(frame),所以调用栈有多少层(递归),就有多少帧;函数运行结束,帧就被回收。
2、出栈(pop)和入栈(push)
Stack 是由内存区域的结束地址开始,从高位(地址)向低位(地址)分配。
五、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
1、push指令
push 3
这个push操作涉及到下面几个步骤
- 取出ESP寄存器里的地址
- 减去4个字节(int类型,向下生长)
- 新地址写入ESP
- 3被写入这个地址开始的四个字节
注意:esp
始终指的是栈顶
2、call指令
调用函数指令,程序会去找对应函数名的标签,建立一个新的栈帧(绿色部分)
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
指令用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。
该指令没有运算子
今天的文章汇编语言入门教程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/8524.html