学习《深入理解计算机系统》 3.3 关于CPU寄存器和栈

3.3.1 关于寄存器

CPU和寄存器

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU从逻辑上可以划分成3个模块,分别是控制单元、运算单元和存储单元,这三部分由CPU内部总线连接起来。CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列。

(CPU)

(CPU结构)


一个x86-64的中央处理单元(CPU)包含一组16个存储64位值的通用目的寄存器。这些寄存器用来存储整数数据和指针。图中显示了这16个寄存器。它们的名字都以%r开头,不过后面还跟着一些不同的命名规则的名字,这是由于指令集历史演化造成的。最初的8086中有8个16位的寄存器,即图中的%ax到%bp。每个寄存器都有特殊的用途,它们的名字就反映了这些不同的用途。扩展到IA32架构时,这些寄存器也扩展成32 位寄存器,标号从%eax到%ebp。扩展到x86-64后,原来的8个寄存器扩展成64位,标号从%rax到%rbp。除此之外,还增加了8个新的寄存器,它们的标号是按照新的命名规则制定的:从%r8到%r15。

如图3-2中嵌套的方框标明的,指令可以对这16个寄存器的低位字节中存放的不同大小的数据进行操作。字节级操作可以访问最低的字节,16位操作可以访问最低的2个字节,32 位操作可以访问最低的4个字节,面64位操作可以访同整个寄存器。在后面的章节中,我们会展现很多指令,复制和生成1字节、2字节、4字节和8字节值。当这些指令以寄存器作为目标时,对于生成小于8字节结果的指令,寄存器中剩下的字节会怎么样,对此有两条规则:生成1字节和2字节数字的指令会保持剩下的字节不变;生成4字节数字的指令会把高位4个字节置为0.后面这条规则是作为从IA32到x86-64的扩展的一部分面采用的。


就像图32右边的解班说明的那样,在常见的程序里不同的寄存器扮演不同的角色。其中最特别的是栈指针%rsp,用来指明运行时校的结束位置。有些程序会明确地读写这个寄存器。另外15个寄存器的用法更灵话。少量指令会使用某些特定的寄存器。

 3.3.2 操作指示符

大多数指令有一个或多个操作数(operand),指示出执行一个操作中要便用的源数据值,以及放置结果的目的位置。x86-64 支持多种操作数格式(参见图3-3)。源数据值可以以常数形式给出,或是从寄存器或内存中读出。结果可以存放在寄存器或内存中。因此,各种不同的操作数的可能性被分为三种类型。

第一种类型是立即数(immediate),用来表示常数值。在ATT格式的汇编代码中,立即数的书写方式是‘$’后面跟一个用标准C表示法表示的整数,比如,$-577 或$0x1F。不同的指令允许的立即数值范围不同,汇编器会自动选择最紧凑的方式进行数值编码。

第二种类型是寄存器(register),它表示某个寄存器的内容,16 个寄存器的低位1字节、2字节、4字节或8字节中的一个作为操作数,这些字节数分别对应于8位、16位、32 位或64位。


第三类操作数是内存引用,它会根据计算出来的地址(通常称为有效地址)访问某个内
存位置。因为将内存看成一个很大的字节数组,我们用符号Mb[Addr]表示对存储在内存
中从地址Addr开始的b个字节值的引用。为了简便,我们通常省去下标b。

3.3.3 关于栈

计算机栈的概念最早在1946年提出‌。

栈是操作系统在建立某个进程或线程时为该线程建立的存储区域,该区域具有先进后出的特性,并且在编译时可以指定需要的栈的大小‌。栈是由系统自动分配和维护的,存放函数的参数值、局部变量的值等,存取速度比堆要快,仅次于寄存器‌。

使用栈的有利于简化内存管理、支持递归调用、实现撤销操作、优化编译器设计

栈在计算机科学中有广泛的应用,例如:

  • 函数调用‌:在函数调用过程中,局部变量和返回地址等信息被压入栈中,以便在函数返回时使用‌。
  • 递归‌:在递归过程中,每次递归调用都会将相关信息压入栈中,直到达到递归的基案例,然后开始逐层返回‌。

计算机科学中的栈是一种特殊的线性表,其定义如下‌:

栈(Stack)是一种遵循后进先出(LIFO, Last In, First Out)原则的数据结构。它只允许在表的一端(称为栈顶)进行插入(push)和删除(pop)操作。在栈中,最后添加的元素将是第一个被移除的元素‌12。

‌栈的基本操作包括‌:

  • 进栈(Push)‌:将一个元素添加到栈顶。
  • 出栈(Pop)‌:移除栈顶的元素。

 栈的大小通常是固定的‌。在大多数操作系统中,栈的大小是在编译时确定的,并且一旦确定后不会改变。例如,在Windows系统中,栈的大小通常为2M,而在Linux系统中,栈的大小通常为10M。‌

栈的固定大小意味着当函数执行完成后,对应的执行上下文会被销毁,栈会自动释放相关的内存。这种设计使得栈的内存分配由系统自动管理,用户无需关心栈的扩展问题。

需要注意的是,虽然栈的大小在编译时确定,但进程的栈大小可以在运行时进行调整,但这通常涉及到操作系统的权限和资源管理策略。

栈存储在内存的高地址部分‌。在大多数系统中,栈位于内存的高地址部分,并向低地址方向增长。                                                                                                                                                                                                                                                                                                                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值