我可以不用使用EBX来编写汇编吗?

问题描述

我不太了解EBX寄存器的用途。通过搜索EBX的目的,我得到了不同的答案,但是最普遍的共识是EBX没有像EAX,ECX或EDX这样的特殊用途。为什么我需要使用EBX?我已经从简单的教程中删除了EBX,该程序仍然有效。那么使用EBX的原因是什么?如果没有它,我为什么要关心它?

解决方法

拥有一个额外的寄存器意味着您可以在寄存器中保留更多内容,而不必存储/重新加载它。这就是x86-64添加R8..R15的原因,即使它们几乎没有任何特殊用途。

您正在几乎完全向后看。所有通用寄存器都有一些隐式用途,但这不是为什么存在。 x86的设计本来可以没有“字符串”指令,没有EDI或ESI寄存器,也可以没有很多东西,但是那样写高效代码将变得更加困难。

(“为什么x86寄存器存在的更基本答案是8086的原始设计,该设计旨在使从8080开始的asm源移植足够简单,可以机械地完成。https://retrocomputing.stackexchange.com/questions/5121/why-are-first-four-x86-gprs-named-in-such-unintuitive-order-这就是x86机器中的原因代码,注册号为EAX,ECX,EDX,然后是EBX)


但是,是的,EBX确实有一些隐式用途。在现代代码中,尤其是针对cpuid的4个输出之一以及cmpxchg8b / cmpxchg16b 。在历史的x86中,它是xlatb的基址寄存器,在16位寻址模式下,是少数可以在寻址模式下使用的寄存器之一。

请参见Why are rbp and rsp called general purpose registers?,其中包括对所有8个“旧式”寄存器和R11的隐式使用。

在i386 Linux系统调用约定中,EAX保留了呼叫号码,EBX保留了第一个arg,然后是ECX,EDX等。但是,如果EBX不存在,则调用约定显然会设计为不同的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...