在70年代中期编写DEC 8时,程序员使用间接方式来指示程序要跳转到哪里(我认为)。我发现它非常有用,我想知道在8086上使用了什么技术来产生相同的结果,或者指示什么取代了它。
发布于 2015-05-17 08:47:04
如果您引用的是在http://www.cs.swan.ac.uk/~csneal/SystemSpec/MoreExamples.html中解释的“间接”,答案很简单:您没有。
x86指令集是CISC,因此不限于固定的指令宽度--处理器将自己计算出指令的长度,并且您不需要黑客来寻址超过(固定)指令大小的位置。
例如,jmp 100008283h将在我刚刚打开的二进制文件中转换为E9 AD 5E 00 00,而xor eax, eax将转换为31 C0。
从这个意义上说,最接近于间接方向的是短距离跳跃--绝对跳跃占用了相当多的内存(见上面的例子),因此,如果目标在短跳的可达范围内,您基本上会跳到相对于当前位置的偏移量,并指定短跳上的“距离”。
发布于 2015-05-17 14:09:55
PDP8指令有两个寻址模式位,I和Z,和一个7位偏移。JMP指令有这些。
偏移量指定与PC相同的128字页中的内存位置,或“页0”中的内存位置,这取决于Z位。I位的意思是“读取已寻址的内存位置,将其用作操作数的地址”。Z位的意思是“使用零页”,而不是当前页。
若要跳转到同一128 word页面中的位置,请将I位和Z位指定为off。这与x86上最接近于具有8位(短)相对偏移量的“短相对jmp”相对应。
若要将控制转移到另一页上的固定目标位置,必须在当前页(或零页)中包含目标地址的单词。然后,使用i位集指定一个jmp,偏移量引用目标地址的位置。在实际使用中,这与x86上的“长相对jmp”最接近,后者具有32位相对偏移量。对于子例程调用,这对应于具有相同32位相对偏移量的“长相对调用”。
有时,您可能希望将控制传递给动态计算的地址。其中一个是PDP8,您只需做一个带有偏移量的JMP间接操作,该偏移量引用包含计算地址的位置。此操作与x86 JMP指令最接近。
在PDP8上,您使用上述技术从子例程返回。( JMS子例程调用指令将返回地址存储在子例程的第一个字处;没有堆栈)。在x86上,主要使用CALL和RET来实现子例程调用和返回。
https://stackoverflow.com/questions/30284936
复制相似问题