在七十年代中期编程DEC PDP 8时,程序员使用间接方式来指示程序要跳转到哪里(我认为)。我发现它非常有用,并想知道8086上使用了哪些技术来产生相同的结果,或者说明了取代它的原因
答案 0 :(得分:2)
PDP8指令有2个寻址模式位,I和Z,以及7位偏移。 JMP说明有这些。
偏移量指定与PC相同的128字页中的存储位置,或者在“页0”中指定存储位置,具体取决于Z位。 I位表示“读取寻址的存储器位置,将其用作操作数的地址”。 Z位表示“使用页面零”而不是当前页面。
要跳转到同一128字页面中的某个位置,请将I和Z位指定为关闭。这对应于x86上最接近“短相对jmp”,具有8位(短)相对偏移。
要将控件转移到另一页上的固定目标位置,您必须在当前页面(或页面零)中包含一个包含目标地址的单词。然后指定一个设置了I位的jmp,偏移量指的是目标地址的位置。在实际使用中,这在x86上最接近于“长相对jmp”,其具有32位相对偏移。对于子程序调用,这对应于“长相对调用”,它具有相同的32位相对偏移量。
有时您会希望将控制权传递给动态计算的地址。一个是PDP8,你只需要使用包含计算地址的位置的偏移来做间接JMP。此操作最接近x86 JMP [reg]指令。
在PDP8上,您使用上述技术从子程序返回。 (JMS子程序调用指令将返回地址存储在子程序的第一个字中;没有堆栈)。在x86上,一个主要使用CALL和RET来实现子程序调用和返回。
答案 1 :(得分:1)
如果您引用http://www.cs.swan.ac.uk/~csneal/SystemSpec/MoreExamples.html中解释的“间接”,答案很简单:您没有。
x86指令集是CISC,因此不限于固定的指令宽度 - 处理器将自己确定指令的长度,并且您不需要黑客来解决长于(固定)指令大小的位置。 / p>
例如,jmp 100008283h
会在我刚刚打开的二进制文件中转换为E9 AD 5E 00 00
,而xor eax, eax
会转换为31 C0
。
在这种意义上,最接近于间接的东西是短暂的跳跃 - 绝对跳跃需要相当多的记忆(参见上面的例子),所以如果一个目的地在短距离跳跃范围内,你基本上会跳到一个偏移相对于你当前的位置,并指定短距离上的“距离”。