我正在查看说明及其相应的操作码。诸如“je”和“jz”之类的指令具有相同的操作码:
je,jz - 0x74 (8 bit)
je,jz - 0x0f84 (16/32 bit).
为什么我们有这样的冗余指令?
是否因为它使汇编编码更容易?也就是说,在某些情况下,更容易理解'跳跃,如果相等',而在其他情况下'跳转为零'。但是这些天我们并没有真正编写汇编代码,它有帮助吗?
答案 0 :(得分:7)
我们在学校所有的计算机体系结构书中的旧引用是什么? “x86没有任何问题,只是很多它没有意义。”
回答你的问题:可能因为“跳零”和“跳等于”都是根据前一条指令的结果跳转到目标地址。也就是说,前一指令的结果将零标志(ZF)设置为1.JZ可以用于“数学”而JE可以用于“比较”。因此从程序员的角度来看,有两个助记符是有道理的。也许早期的汇编作者试图模仿另一种流行的汇编语言。
Looking at the Intel x86 manual for Jcc(条件跳转指令集),我们可以看到JZ和JE本质上都意味着“如果相等则跳转接近(ZF = 1)”。然后文档实际上提到这对于某些跳转指令集是常见的。
因为状态标志的特定状态有时可以 以两种方式解释,为某些操作码定义了两个助记符。 例如,JA(如果在上面跳转)指令和JNBE(跳转如果 不低于或等于)指令是操作码的备用助记符 77H。
答案 1 :(得分:5)
它们只是同一指令的不同同义词。该指令只是基于Z标志分支。如果比较相等指令的结果为真,则Z标志置位。它也设置为你测试一个恰好为零的值。
答案 2 :(得分:2)
即使现在使用不多,英特尔汇编语言仍旧。请记住,最初的8086和8088处理器来自1970年代......
曾几何时,当我们仍然在为IBM PC / XT之类的东西编写程序时,有很多意义可以有几个指令,如
CMP AX, BX
JE Somewhere
或
AND AX, BX
JZ somewhere_else
他们碰巧映射到相同的硬件指令并不重要。
答案 3 :(得分:2)
为什么一些说英语的人说卡车和其他人说卡车?我们应该强迫每个人遵守一个标准吗?所有的汉堡都应该是大型的... ...
我们首先仍然在组装程序。足够的人这样做,其他人不需要。你的编译器严重依赖它。没有它,很难开发和调试编译器和处理器。没有编译器和处理器,我们会做什么?
如果设置为零位,则如果相等vs跳转,汇编器解析器接受跳转是微不足道的,它们是相同的函数,相同的指令。理解和使用标志的人(授予z标志很容易但签名和无符号携带不是)喜欢使用标记跳转,如果携带,跳跃,如果为零等等。那些根据这些特定数字的关系思考的人对于那个特定的操作想要看到跳跃如果等于跳跃,如果大于跳跃,如果小于等等。我宁愿摆脱跳跃,如果相等,跳跃,如果小于,等等,只是有标志,跳跃如果c设置跳转如果c清除,跳跃如果n == v跳跃,如果n!= v,等等< / p>
英特尔不是您将看到的第一个或最后一个架构。我假设出于同样的原因,有些人认为状态寄存器中的位是打开还是关闭,而其他人认为就此而言更大。在某种意义上说,只要处理器具有z标志,知道z标志意味着相等就是一个时代的东西,但它与x86系列的年龄及其愚蠢的指令集无关。以这种方式开发人员友好会吸引开发人员加入您的处理器,在工具中实现它是微不足道的。
如果你真的想解决这个问题,为什么同一指令集的intel语法和AT&amp; T语法?如果相等(零位设置)与跳转,如果零位设置为零,如果零位设置指令则编码为跳转,则疯狂超出跳跃。
答案 4 :(得分:1)
虽然不是当今使用最广泛的编程语言,但仍然使用它。 g ++可以编译汇编代码。如果你知道自己在做什么,那么它会给你一个明确的速度优势。
关于你的问题,是的,你是对的。根据具体情况,有助于以某种方式思考导致具有相同操作码的不同指令。