是否有用于基数和索引的约定寄存器?

Posted

技术标签:

【中文标题】是否有用于基数和索引的约定寄存器?【英文标题】:Is there a convention registers to use for base and index? 【发布时间】:2017-07-09 19:52:22 【问题描述】:

内存寻址的一般形式是:

[base + index*scale + disp]

从技术上讲,任何寄存器都可以是base。并且任何寄存器都可以是indexesp 除外)。

但是是否有用于baseindex 的约定寄存器?我想ebx(基址寄存器)用于base,但是index呢?

【问题讨论】:

【参考方案1】:

我认为 ebx(基址寄存器)用于基址

不是真的。

在 16 位代码中,并非所有寄存器都可以用作“基础”。 BX 是少数可以使用的寄存器之一。因此该寄存器被称为“基址寄存器”。

但是在 32 位代码中没有这样的限制。

有约定吗

只有在不同的代码必须以相同的方式编写时才需要约定。

示例:如果一个汇编文件包含一个子函数,而另一个汇编文件包含调用该子函数的代码,则两个文件的程序员必须使用相同的寄存器来传递函数参数。

因为这里不是这种情况,所以不需要约定。

【讨论】:

【参考方案2】:

拥有如此大的灵活性的意义在于,您可以避免使用额外的mov 指令将指针和索引放入特定的寄存器。

只要使用最方便的寄存器中的数据即可。例如在 32 位代码中,使用您正在使用的调用约定允许您在不保存/恢复的情况下使用的寄存器之一。 (通常是 EAX、ECX 和 EDX)。

如果没有其他因素,将目标指针保存在 edi/rdi esi/rsi 中的源指针是明智的,因为这就是寄存器名称中 D 和 S 的含义。它可以帮助您记住您正在使用哪些寄存器,但硬件并不关心(除非您想使用 rep movsd 进行块复制)。

【讨论】:

以上是关于是否有用于基数和索引的约定寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

实模式与保护模式下的分段分页机制

C/C++学习笔记 关于调用约定

Dalvik字节码

写入寄存器 - stm32 中的命名约定

如何在 Visual C++ 中使用 Delphi 的寄存器调用约定调用函数?

如何编程霓虹灯寄存器索引