Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 一次保留的值多于程序集中的寄存器_Assembly_Mips - Fatal编程技术网

Assembly 一次保留的值多于程序集中的寄存器

Assembly 一次保留的值多于程序集中的寄存器,assembly,mips,Assembly,Mips,这更像是一个概念问题。我对汇编的理解是有限的,并且仅限于MIPS,因此如果这不适用于其他汇编体系结构,请原谅我 假设有人需要存储很多值。我想不出有人真的需要那么多寄存器,却无法将它们存储在某个地方,但让我们假设一个假设的情况 在哪里可以存储数据?使用数组 可以使用数组。然后可以从数组中读取。下面是一个例子 使用堆栈 你应该使用堆栈。有一些很棒的东西。正如Cody Gray在评论中提到的 问题是“不能将它们存储在某个地方”,我认为这意味着您不能像编译器在本地变量的寄存器用完时那样将它们溢出到堆栈中

这更像是一个概念问题。我对汇编的理解是有限的,并且仅限于MIPS,因此如果这不适用于其他汇编体系结构,请原谅我

假设有人需要存储很多值。我想不出有人真的需要那么多寄存器,却无法将它们存储在某个地方,但让我们假设一个假设的情况

在哪里可以存储数据?

使用数组 可以使用数组。然后可以从数组中读取。下面是一个例子

使用堆栈 你应该使用堆栈。有一些很棒的东西。正如Cody Gray在评论中提到的

问题是“不能将它们存储在某个地方”,我认为这意味着您不能像编译器在本地变量的寄存器用完时那样将它们溢出到堆栈中

“聪明”的替代方案(仅在存储在堆栈或其他保留内存位置的特殊情况下使用):

  • 将多个值打包到每个寄存器中。e、 如果你知道你的数据是16位的,你可以把四个16位的整数组合成一个64位的通用整数寄存器。您需要一对寄存器来自由操作数据(例如,使用shift和and指令解包,然后在重新打包之前做一些事情)

  • 将其放入浮点或向量寄存器。(如果FP硬件没有故障,将非规范化刷新为零,或者以其他方式咀嚼任意位模式,则只需按原样移动整数数据。实际上不要执行整数->浮点转换。)


嗯,你不能……你的寄存器数量有限,所有其他信息都必须存放在其他地方(ram/rom),你可以根据需要将其交换掉。无论如何,管道中不能同时有太多指令,因此您只需处理处理器的限制。有些处理器有几十到几百个寄存器,你可以切换到其中一个。据我所知,MIPS架构也有一个堆栈。请参阅“ECX/CX寄存器存储可引用的值”。这是什么意思?显然,您的答案是关于x86的,但是当涉及到x86上的堆栈时,
ECX
/
CX
没有什么特别之处。这个寄存器唯一有趣的地方是它经常被用作循环计数器,但这与堆栈无关。您是否考虑使用不同的寄存器,例如堆栈指针(
ESP
/
SP
)?否。它们可以用于数组的“索引”值。看看这个例子,对不起我的措辞。我不完全确定这句话的最佳句子是什么。但是,它确实适用于需要存储许多值的情况。它实际上是编译器编译成汇编的方式。它为数组所需的变量保留了足够的空间。然后有一个基指针和一个指针或索引器。这允许程序在程序集中存储变量。请记住,这是我回答中的英特尔语法。您可以(至少假设我们讨论的是32位代码)使用任何寄存器作为索引。ECX没有什么特别之处。您链接到的示例代码实际上根本没有将其用作索引器。它也没有显示如何使用堆栈。它只是从字节值数组中读取。如果不进行修改,代码将无法用于堆栈;它们在x86上自上而下生长。C编译器实际上会编译使用堆栈的代码,在例程顶部使用
PUSH
SUB
指令来保留空间。我不知道你可以使用任何寄存器作为索引,我在网上发现的是不同的。我对汇编也比较陌生,所以你介意告诉我堆栈是如何工作的吗?嗯,这是一个相当大的话题。当然,网上有很多信息。喜欢我不确定你在网上找到了什么关于注册的信息。我想象中,对于“索引”寄存器,您会看到的大部分是ESI和EDI,某些指令(特别是CISC字符串指令)分别将其用作源索引和目标索引。TagWiki中有很多关于x86汇编的好教程。