[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 3 程序的机器级表示

本文主要是介绍[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 3 程序的机器级表示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总结一些第三章的一些关键信息

  • Chapter 3 程序的机器级表示
    • 结构
  • updating...

Chapter 3 程序的机器级表示

  1. 局部变量通常保存在寄存器中,而不是内存中,访问寄存器比内存快的多.
    有些时候,局部数据必须存放在内存中,
    • 寄存器不足够存放所有的本地数据
    • 对一个局部变量使用地址运算符 &, 因此必须能够为它产生一个地址
    • 某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到。
  2. C 语言中所谓的“指针”其实就是地址。
  3. x86-32 中,程序栈存放在内存中的某个区域,栈向下增长。(栈顶在低地址处)
  4. switch 使用跳转表(jump table)来实现的。(一般在开关情况多,比如4个以上时,会用跳转表)
  5. 寄存器是唯一被所有过程共享的资源,过程可以理解成函数调用…根据惯例,%rbx、%rbp%r12~%~15被划分为“被调用者”保存的寄存器。当过程P调用过程Q时,Q必须保存这些寄存器的值,保证他们的值在Q返回到P时,与Q被调用时是一样的
    • Q: 多次调用怎么办? A:P 把之前的值保存在栈上

结构

结构的所有组成部分都存放在内存中一段连续的区域内,而指向结构的指针就是结构第一个字节的地址。编译器维护关于每个结构类型的信息,指示每个字段(filed)
的字节偏移。它以这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。

动态确定和静态编译确定的简要理解:

  • 如果是数组 a[10], 这个就是静态编译确定的,并且保存在栈帧中。而如果是a[n], 然后根据传入的n的数值通过 malloc等方式申请内存,就是动态的,并且保存在堆中, 由指针保存对应内存的地址。
  • 代码段:保存可执行文件中的机器指令
  • 数据段:保存全局变量和静态变量
  • 堆: 动态内存分配保存,比如 malloc
  • 栈: 用于存储局部变量和函数调用的上下文信息。
在计算机科学中,上下文信息(Context)指的是在某个特定时刻,程序执行所需的全部状态信息。对于函数调用而言,上下文信息包括了所有必要的数据,使得函数调用能够正确执行,并在执行完毕后能够恢复到调用前的状态。具体来说,函数调用的上下文信息通常包括:参数传递:函数所需的参数值,这些参数可能通过寄存器或栈来传递。返回地址:当函数执行完毕后,需要返回到调用者的位置,返回地址就是调用者在函数调用后的下一条指令的地址。局部变量:函数内部声明的局部变量的存储空间。寄存器保存:在函数调用前后,需要保存和恢复某些寄存器的值,以保证函数调用不会影响调用者的环境。栈帧指针:在多层函数调用的情况下,每个函数都有自己的栈帧,栈帧指针(如基指针 rbp 或帧指针 ebp 在 x86 架构中)用于指向当前函数的栈帧,以便能够访问局部变量和其他上下文信息。程序状态:包括程序计数器(PC)和其他状态寄存器,如程序状态字(PSW)或标志寄存器(FLAGS),它们记录了程序的执行状态。在函数调用时,调用者会将这些上下文信息保存到栈中,通常是通过一系列的 push 指令来完成。被调用的函数在执行前,会创建自己的栈帧,这通常涉及到将当前的栈指针(如 rsp 或 esp)移动到新的栈帧位置。函数执行完毕后,会通过 pop 指令或 ret 指令来恢复调用者的上下文信息,包括返回地址和寄存器状态,然后继续执行调用者的代码。上下文切换(Context Switching)是操作系统在多任务环境中,从一个任务切换到另一个任务的过程,这个过程也需要保存和恢复任务的上下文信息。

updating…

这篇关于[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 3 程序的机器级表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139379

相关文章

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Mysql 驱动程序的程序小结

《Mysql驱动程序的程序小结》MySQL驱动程序是连接应用程序与MySQL数据库的重要组件,根据不同的编程语言和应用场景,MySQL提供了多种驱动程序,下面就来详细的了解一下驱动程序,感兴趣的可以... 目录一、mysql 驱动程序的概念二、常见的 MySQL 驱动程序1. MySQL Connector

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下