内存寻址的一般形式是:
[base + index*scale + disp]
从技术上讲,任何寄存器都可以是base
。任何注册都可以是index
(esp
除外)。
但是有一个约定寄存器用于base
和index
吗?我想ebx
(基本寄存器)用于base
,但是index
呢?
答案 0 :(得分:2)
我认为ebx(基址寄存器)用于基础
不是。
在16位代码中,并非所有寄存器都可用作" base"。 BX
是可以使用的为数不多的寄存器之一。因此,该寄存器被称为"基址寄存器"。
然而,在32位代码中没有这样的限制。
是否有约定
只有在必须以相同方式编写不同代码时才需要约定。
示例:如果一个汇编程序文件包含一个子函数而另一个汇编程序文件包含调用该子函数的代码,则两个文件的程序员必须使用相同的寄存器来传递函数参数。
因为这不是这种情况,所以不需要约定。
答案 1 :(得分:1)
具有这种灵活性的关键是你可以避免使用额外的mov
指令将指针和索引放入特定的寄存器中。
只需在最方便的寄存器中使用数据。例如在32位代码中,使用其中一个寄存器,您正在使用的调用约定允许您使用而不保存/恢复。 (通常是EAX,ECX和EDX)。
如果没有其他因素,请将目标指针保留在edi / rdi中
esi / rsi中的源指针是明智的,因为这就是D和S在寄存器名称中的含义。它可以帮助您记住您正在使用的寄存器,但硬件并不关心(除非您想使用rep movsd
进行块复制)。