assembly 了解不同位伊萨的跳转地址计算

lyr7nygr  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在尝试理解跳转地址是如何计算的。到目前为止,通过MIPS指令结构(32位伊萨),我能够理解这一点。通过阅读一些材料后,我得到的解决方案是:连接以下内容:

  1. PC的高4位
    1.目标地址
    1.小写00
    现在,如果我有一个不同的位伊萨,比如说8位,其中J指令格式为:
    1.操作码- 2位
    1.目标地址- 6位
    目标地址的计算方式是相同还是不同?
    请帮助我理解。
hujrc8aj

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。)

相关问题