assembly MIPS的LW指令只对数组有效吗?还是对变量也有效?

2mbi3lxu  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(145)

我想知道lw MIPS指令是否可以在变量上工作。我读过一本书,说编译器会将寄存器与变量相关联。那么,我是否必须将内存中的变量移到寄存器中?

w46czmvw

w46czmvw1#

伪代码和高级语言中的算法具有逻辑变量,而程序中的机器码等效算法具有物理存储。
逻辑变量有名称、类型、作用域、生存期,并且在运行时有一个位置和一个值。在程序/算法中,名称通常是指变量所包含的内容;它的作用域是从任何给定的代码行(或数据行)可以到达的变量;生存期是指变量的持续时间,例如全局变量具有完整的程序生存期,而函数参数只要函数处于活动状态就存在,但在函数返回时就不再存在;某些变量由程序间接引用,并且某些变量可以在运行时保存一个值,该值可以被程序改变并在以后被调用。
机器的物理存储器由CPU寄存器和主存储器组成;两者都允许存储和检索已存储的值。2物理存储本质上是未命名的,没有真实的的类型或作用域,并且具有永久的(整个程序)生存期。
CPU寄存器速度快,但数量有限,而且不能索引,而主存储器是巨大的,并且可以索引或寻址。因此,对于主存储器来说,有一个第一级的地址概念:你可以用一个数字(地址)来标识一个内存位置,并使用这个值(地址),比如说作为一个参数。
CPU寄存器不能寻址或索引,只能在机器代码指令中命名。
编译器或汇编语言编写者的一项工作就是将逻辑变量从我们的算法Map(翻译)到处理器上可用的物理存储器中。虽然有些会比其他的更有效率。对于有重叠生命周期的逻辑变量,它们需要单独的物理存储。物理存储经常被重用,为不同的逻辑变量重新使用-当逻辑变量的生命周期结束时,它们的存储可以为其他生命周期刚刚开始的逻辑变量重新使用。
需要索引的数据结构必须存在于主存储器中;然而,主存储器也可以被编译器或程序员以任何方式使用,所以它也可以被用于简单的逻辑变量。数据结构,如数组,树,链表,本质上需要索引/寻址。数组b/c我们选择许多元素中的一个,而其他的则是因为我们使用指针(引用),所以被指向(引用)的项必须有地址,因此必须存在于主存中。
由于CPU寄存器是宝贵的、快速的资源,它们主要用于那些生命周期短的逻辑变量。这些变量是函数参数和局部变量(local)。
有时一个逻辑变量必须从一个物理存储位置移动到另一个物理存储位置。这是一些在寄存器中传递的参数的情况,如果在程序最终使用该变量之前,由于某种原因,它的相关寄存器将被重写,则该变量将不得不被Map到另一个存储位置,并且它的值将从原始位置复制到另一个位置(通过机器代码程序),在其原始Map的物理存储器被破坏之前。
汇编语言类似于机器代码,但有命名标签和分隔的节。节细分程序的主存储器-将代码与全局数据分隔开-代码和数据都在程序启动前用每个程序的值初始化。
其他未初始化的主存储器也可供程序使用:被配置为栈和堆。虽然栈和堆都涉及物理存储,但每一个都有不同的使用模型,通常由程序和函数应用;该使用模型允许在多个功能之间共享物理存储-该使用模型具有分配、初始化(和使用)和最终解除分配的概念。
按照惯例,堆栈存储器允许在函数进入时分配,在函数退出时解除分配,并且以这种方式,堆栈存储器被一个函数接一个函数重复地重新确定用途和重新使用。
同样按照惯例,堆内存允许显式分配和释放存储空间--存储空间不必对应于函数的激活和停用,因此用于那些比创建它们的函数更长寿的数据结构。

标签用于标识代码中的位置和数据-代码中用于分支和调用的位置;数据中用于存储全局变量位置 数据中的标签用于标识Map到物理存储器的全局变量的存储位置。程序员可以为每种全局变量保留足够的存储空间。标签相当于常量值,它是一个项的物理存储器的起始地址(而不是如在高级语言中变量名称所暗示的那样,将逻辑变量作为整体)。由编译器和汇编程序员来决定以与Map到那里的逻辑变量的意图完全一致的方式访问物理存储器。处理器不读取数据声明,并且由于物理存储器不断地被改变用途,所以机器代码程序的工作是通知处理器如何处理存储器。
标签在构建过程中被删除(汇编)源代码转换成机器代码程序。处理器看不到标签,在程序中,也不区分前后的内容--它们只是汇编程序员的一种方便。代码中的标签本身,它们不影响控制流,并且在数据中它们不阻止或排除经过或先于(通过存储器地址)预期逻辑变量的访问。
那么我是不是必须把内存中的变量移到寄存器中去呢?
作为一个汇编程序员,你可以不使用主存储器而将一个逻辑变量Map到一个CPU寄存器中,但在某些情况下这是不合适的:

  • 如果寄存器在逻辑变量的生存期内无法生存,则会发生这种情况。例如,如果逻辑变量是全局变量,或者如果寄存器被代码(如函数调用)重写,则会发生这种情况。
  • 如果逻辑变量具有需要索引的性质,则可以将其存储在CPU寄存器中,这在CPU寄存器之间是不可能的。

如果你使用主存储器来存储变量(对于全局变量来说是合适的),你将不得不分别使用加载和存储来调用它的值或存储一个新的值。全局数据将在程序启动之前初始化,但其他物理存储(如CPU寄存器,堆栈存储器,堆存储器)需要通过执行程序本身的机器代码来初始化。

相关问题