首页 / 更多教程 / 第3章 程序的机器级表示(3)
第3章 程序的机器级表示(3)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了第3章 程序的机器级表示(3),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2325字,纯文字阅读大概需要4分钟。
内容图文
![第3章 程序的机器级表示(3)](/upload/InfoBanner/zyjiaocheng/605/909f58732af94fa99a0e126ad48b0c13.jpg)
**
第3章 程序的机器级表示(3)
**
对应CSAPP3.7节过程和卡内基梅隆大学计算机CMU 15-213第七讲。
本节思维导图
过程是软件中一种很重要的抽象。它提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。在不同的编程语言中,过程的形式多样:函数、方法、子例程、处理函数等。
过程的机器级支持包括以下一个或多个机制:
1.传递控制
2.传递数据
3.分配和释放内存
一、栈
栈是一种数据结构,可以添加或者删除值,遵循“后进先出”的原则。
栈顶:栈可以实现为一个数组,总是从数组的一端插入和删除元素。
栈顶元素的地址是所有栈中元素地址最低的。
栈指针%rsp保存着栈顶元素。
栈相关的汇编指令:push和pop
指令 | 效果 | 描述 |
---|---|---|
pushq S | R[%rsp]←R[%rsp]-8; M[R[%rsp]]←S | 将四字压入栈 |
popq D | D←M[R[%rsp]];R[%rsp]←R[%rsp]+8 | 将四字弹出栈 |
pushq指令是把数据压入到栈上,popq指令是弹出数据。操作数都只有一个,压入的数据源和弹出的数据目的。
通用的栈帧结构
栈和程序寄存器存放着传递控制和数据、分配内存所需的信息。
栈帧:当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间。该部分被称为栈帧。
大多数过程的栈帧都是定长的,在过程开始就分配好了。有些过程需要变长的帧。
如上图,过程P可以传递最多6个整数值(指针和整数),若Q需要更多的参数,P可以在调用Q之前在自己的栈帧里存储号这些参数。
6个参数分别存放在通用寄存器%rdi、%rsi、%rdx、%rcx、%r8、%r9。
%rip为程序计数器,%rax存放返回值。
二、转移控制
将控制从函数P转移到函数Q只需要简单地把程序计数器(PC)设置为Q的代码的起始位置。
相关指令call
指令 | 描述 |
---|---|
call Label | 过程调用 |
call *Operand | 过程调用 |
ret | 从过程调用中返回 |
call Q会把地址A压入栈中,并将PC设置为Q的起始地址。同跳转一样,调用可以是直接的,也可以是间接的。
A成为返回地址,是紧跟在call指令后面的那条指令的地址。
ret会从栈中弹出地址A,并把PC设置为A。
三、数据传送
x86-64中,大部分过程间的数据传送是通过寄存器实现的。如果一个函数有大于6个整型参数,超出6个的部分就要通过栈来传递。对应上图通用栈帧的结构,参数7位于栈顶。若过程Q也调用了某个有超过6个参数的函数,它也需要在自己的栈帧中为超过6个部分的参数分配空间,即“参数构造区”。
P中的寄存器值会不会被Q过程调用的参数覆盖掉?
栈上的局部存储
对应图中的“局部变量”
寄存器中的局部存储空间
寄存器组是唯一被所有过程共享的资源。
被调用者保存寄存器:%rbx,%rbp和%r12-%r15。这些寄存器的存在解决了被调用者寄存器的值被被调用者覆盖的问题。压入寄存器的值会在栈帧中创建标号为“被保存的寄存器”的一部分。
调用这保存寄存器:除了栈指针%rsp的所有其他寄存器。过程P在某个此类寄存器中有局部数据,然后调用过程Q。
书中典型例子
内容总结
以上是互联网集市为您收集整理的第3章 程序的机器级表示(3)全部内容,希望文章能够帮你解决第3章 程序的机器级表示(3)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。