Assembly 手工编码汇编-实用寄存器分配?

Assembly 手工编码汇编-实用寄存器分配?,assembly,register-allocation,risc,Assembly,Register Allocation,Risc,我从未在汇编中编写过任何长程序。但从我的肤浅经验来看,这并不像人们想象的那么难 我唯一不能完全理解的是:如何实际执行寄存器分配?虽然x86没有太多空间,但x64和RISC设计(AVR、ARM)提供了大量寄存器 汇编程序员如何选择哪些变量应该保留在寄存器中,何时将它们从/转移到内存,最后,他们如何跟踪每个变量 汇编程序员如何选择哪些变量应该保留在寄存器中 由于寄存器(几乎总是)比内存访问快,经常使用(读或写)的变量通常应该进入寄存器。循环的索引变量就是一个例子 反例是一个变量,您将使用它的地址。这

我从未在汇编中编写过任何长程序。但从我的肤浅经验来看,这并不像人们想象的那么难

我唯一不能完全理解的是:如何实际执行寄存器分配?虽然x86没有太多空间,但x64和RISC设计(AVR、ARM)提供了大量寄存器

汇编程序员如何选择哪些变量应该保留在寄存器中,何时将它们从/转移到内存,最后,他们如何跟踪每个变量

汇编程序员如何选择哪些变量应该保留在寄存器中

由于寄存器(几乎总是)比内存访问快,经常使用(读或写)的变量通常应该进入寄存器。循环的索引变量就是一个例子

反例是一个变量,您将使用它的地址。这应该进入内存,因为您(通常)无法获取指向寄存器的指针

何时将它们从内存中/转移到内存中

除非绝对必要,否则不要这样做

最后,他们如何跟踪每个变量


几乎没有。撇开玩笑不谈,频繁的注释、一致的命名和寄存器分配约定、某种宏处理器(汇编程序拥有一个或C预处理器)的使用以及严格的编码通常会让事情变得简单一些。

有几个寄存器,这并不难。有了大量的寄存器,就需要做更多的工作。这就是人们使用编译器的原因:)并不是说在汇编中编写长程序很难,而是很难编写比编译器生成的程序更快的长程序。说得好。我们中的一些人至少会进行无情的汇编代码重构,以组织寄存器的内容,从而最小化负载和存储,这可能会有所帮助。有一个可以作为底线的惯例是有帮助的。。。e、 例如,使用Rn作为指向您正在更新的结构的指针,使用Rn+1作为您正在爬过的结构的指针,等等。编写足够的代码,您就可以养成自己的习惯了。@IraBaxter完全正确,完全正确。