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_X86 - Fatal编程技术网

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

Assembly 是否有用于基和索引的约定寄存器?,assembly,x86,Assembly,X86,内存寻址的一般形式是: [base + index*scale + disp] 从技术上讲,任何寄存器都可以是基。任何寄存器都可以是索引(除了esp) 但是对于base和index是否有一个约定寄存器?我假设ebx(基址寄存器)用于base,但是索引如何呢 我假设ebx(基址寄存器)用于基址 不是真的 在16位代码中,并非所有寄存器都可以用作“基”BX是可以使用的少数寄存器之一。因此,该寄存器被称为“基址寄存器” 然而,在32位代码中没有这样的限制 有会议吗 只有当不同的代码段必须以相同的方式

内存寻址的一般形式是:

[base + index*scale + disp]
从技术上讲,任何寄存器都可以是
。任何寄存器都可以是
索引
(除了
esp

但是对于
base
index
是否有一个约定寄存器?我假设
ebx
(基址寄存器)用于
base
,但是
索引如何呢

我假设ebx(基址寄存器)用于基址

不是真的

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

然而,在32位代码中没有这样的限制

有会议吗

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

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

因为这里不是这样,所以不需要约定

我假设ebx(基址寄存器)用于基址

不是真的

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

然而,在32位代码中没有这样的限制

有会议吗

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

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


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

具有如此大的灵活性的一点是,您可以避免使用额外的
mov
指令将指针和索引放入特定寄存器

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

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

具有如此大的灵活性的一点是,您可以避免使用额外的
mov
指令将指针和索引放入特定寄存器

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

如果没有其他因素,则在edi/rdi中保留目标指针 esi/rsi中的源指针是合理的,因为这就是D和s在寄存器名中的含义。它可以帮助您记住正在使用的寄存器,但硬件并不关心(除非您想对块拷贝使用
rep movsd