我正在尝试理解跳转地址是如何计算的。到目前为止,通过MIPS指令结构(32位伊萨),我能够理解这一点。通过阅读一些材料后,我得到的解决方案是:连接以下内容:
hujrc8aj1#
**如果没有文档,你就必须从一些示例机器代码或工作汇编程序中逆向工程伊萨设计。所有商业ISA * 都 * 记录了它们的机器代码是如何工作的,教学ISA也是如此,你需要使用机器代码,而不仅仅是asm源代码。
如果有一个1字节的指令,那么就不能假定指令是对齐到4字节边界的,尽管这几乎不可能要求跳转目标仍然是对齐的,但是如果不需要对齐,那么你就不会把立即数左移来创建一个低2位为零的地址。在1字节跳转指令中,我希望6位用作相对偏移量(如MIPS b,例如beq $zero,$zero, target),而不是像MIPS j那样的绝对段,因为6位绝对段通常会遇到无法跳过某个附近边界的问题。(64字节的块非常小,而且在函数中通常会有一个无法j跨越的边界。)我假设还会有一个范围更大的更长跳转指令,以便可以尾调用其他超过-32..+31字节的函数当然,任何设计都是可能的,甚至可以使用立即数作为2的幂来表示跳转的距离,这样你就可以向前或向后跳转2、4、8、16...个字节,或者跳转到一个段中的那个位置,这很难利用,但至少可以设计。我提到最后一种可能性主要是为了说明,如果没有伊萨的文档,你就不能做出任何假设。(如果它在商业上是成功的,你通常可以猜测它的大部分设计是合理的,但有时候,当把设计作为一个整体来考虑时,看起来疯狂的事情本身是有意义的。或者只是祖先设计的遗留问题,比如x86。)
b
beq $zero,$zero, target
j
1条答案
按热度按时间hujrc8aj1#
**如果没有文档,你就必须从一些示例机器代码或工作汇编程序中逆向工程伊萨设计。所有商业ISA * 都 * 记录了它们的机器代码是如何工作的,教学ISA也是如此,你需要使用机器代码,而不仅仅是asm源代码。
根据您的建议,我们可以尝试猜测:
如果有一个1字节的指令,那么就不能假定指令是对齐到4字节边界的,尽管这几乎不可能要求跳转目标仍然是对齐的,但是如果不需要对齐,那么你就不会把立即数左移来创建一个低2位为零的地址。
在1字节跳转指令中,我希望6位用作相对偏移量(如MIPS
b
,例如beq $zero,$zero, target
),而不是像MIPSj
那样的绝对段,因为6位绝对段通常会遇到无法跳过某个附近边界的问题。(64字节的块非常小,而且在函数中通常会有一个无法j
跨越的边界。)我假设还会有一个范围更大的更长跳转指令,以便可以尾调用其他超过-32..+31字节的函数当然,任何设计都是可能的,甚至可以使用立即数作为2的幂来表示跳转的距离,这样你就可以向前或向后跳转2、4、8、16...个字节,或者跳转到一个段中的那个位置,这很难利用,但至少可以设计。
我提到最后一种可能性主要是为了说明,如果没有伊萨的文档,你就不能做出任何假设。(如果它在商业上是成功的,你通常可以猜测它的大部分设计是合理的,但有时候,当把设计作为一个整体来考虑时,看起来疯狂的事情本身是有意义的。或者只是祖先设计的遗留问题,比如x86。)