2011-08-06 61 views
3

我正在查看指令及其相应的操作码。指令,如“乙脑”和“JZ”具有相同的操作码:为什么多个指令具有相同的操作码并且工作?

je,jz - 0x74 (8 bit) 
je,jz - 0x0f84 (16/32 bit). 

为什么我们有这样多余的指令?

这是因为它使汇编代码更容易吗?也就是说,在某些情况下,更容易理解“如果相等,跳转”,在其他情况下,更容易理解“跳转零”。但是这些日子我们并没有真正的组装代码,它有帮助吗?

回答

1

虽然不是当今使用最广泛的编程语言,但它仍被使用。 g ++可以编译汇编代码。如果你知道你在做什么,那么它给你一个确定的速度优势。

关于你的问题,你是对的。根据不同的情况,有助于以某种方式思考导致具有相同操作码的不同指令。

+0

为什么downvote?看起来像对我来说合法的答案。 –

+0

谢谢鲁迪。我也可以看到不好的一面。 –

+1

我不是倒票选者,但我的猜测是倒票是因为答案并没有真正解决实际问题 - 这只是对OP末尾没有人提问的最后部分的评论再写一个asm?无论哪种方式,在没有给出理由的情况下进行倒票都是糟糕的形式,但这一切都很常见。 –

5

它们只是同一条指令的不同同义词。该指令只是基于Z标志分支。如果比较相等指令的结果为真,则Z标志置位。它也被设置为你测试一个恰好为零的值。

7

从我们在学校里所有的计算机体系结构书中得到的旧引用是什么? “x86没有什么问题,只是它很多都没有意义。”

回答你的问题:可能是因为“跳到零”和“如果相等跳”都跳转到基于前一个指令结果的目标地址。也就是说,前一条指令的结果将零标志(ZF)设置为1. JZ可能用于“数学”,而JE可能用于“比较”。所以从程序员的角度来看,必须有两个助记符才有意义。也许早期的汇编作家试图模仿另一种流行的汇编语言。我们可以看到,JZ和JE实质上意味着“如果相等(ZF = 1)时跳转近似”。然后文档实际上提到这对于某些跳转指令集很常见。

由于状态标志的特定状态有时可以用两种方式解释,所以为一些操作码定义了两个助记符。 例如,JA(如果跳过上面的指令)和JNBE(跳转,如果 不低于或等于)指令是操作码 77H的备用助记符。

+0

所以从本质上讲,它只从程序员的角度来看是有用的,否则它是一样的。 –

2

即使现在使用不多,英特尔汇编语言也很旧。请记住,最初的8086个8088处理器是从1970年的...

曾几何时,当我们在组装仍然写的东西像IBM PC/XT它使一个很大的意义,有一个像

几个指令
CMP AX, BX 
JE Somewhere 

AND AX, BX 
JZ somewhere_else 

,他们正好映射到相同的硬件指令并不重要。

2

为什么一些英语人士说卡车和其他人说卡车?我们是否应该强迫每个人遵守一个标准?所有的汉堡都是大苹果......

首先我们还是在组装程序。足够的人这样做,别人不必。你的编译器非常依赖它。如果没有它,很难开发和调试编译器和处理器。没有编译器和处理器,我们会做什么?

让汇编语言分析程序接受跳转(如果等于vs跳转,如果设置了零位)是微不足道的,它们是相同的函数,相同的指令。理解和使用这些标志的人(授予z标志很容易,但是有符号和无符号进位不是)喜欢使用标志跳转如果进位,跳转,如果是零等等。根据这些具体数字的关系对于那个特定的操作,如果跳跃比平均跳跃大,则跳跃小于等等。如果平等,我宁愿摆脱跳跃,如果跳跃小于等等,只是有标志,跳转如果c跳转如果c清除,跳转如果n == v跳转如果n!= v等。

英特尔不是第一个或最后一个架构,你会看到这一点。我假设出于同样的原因,一些人认为状态寄存器中的位是打开或关闭的,而其他人认为这比这更大。只要处理器拥有z标志,知道z标志意味着平等就已经存在了,但它与x86系列的时代以及它的愚蠢指令集没有任何关系。以这种方式让开发人员友好,吸引开发人员加入你的处理器,在这些工具中实现是微不足道的。

如果你真的想得到解决这个问题的原因,那么为什么在同一个指令集中有intel语法和AT语法?如果相等(零位设置),则跳跃超出跳跃;如果零位设置为零,则跳跃如果零位设置指令,编码跳转至跳转。

相关问题