【发布时间】:2018-05-07 08:53:35
【问题描述】:
假设我们在地址 0x20000004 处有一条跳转指令。现在,据我所知,跳转间隔与 PC 值无关,而是绝对间隔约为 32 位寄存器最大值的 1/16。现在,考虑如何在机器代码中构造跳转指令,这是否意味着最大向后跳转(在这种特殊情况下)是 1 条指令,还是指向地址 0x20000000?或者在相反的情况下:在地址 0x1FFFFFFC 处跳转指令,我想在 2 条指令之前跳转到地址 0x20000004。不可行吗?汇编程序如何设法不在这两种情况之一中放置指令? 编辑:修复了一些错误
【问题讨论】:
-
“这是否意味着最大向后跳转(在这种特殊情况下)是 4 条指令” 什么?你从哪里得到这个想法的? “还是到地址 0x20000000?” 每条指令是 4 个字节,而不是 1 个字节。 “在地址 0x1FFFFFFE 处跳转指令” 不能,因为指令必须是字对齐的。
-
通常是链接器放置部分,这些范围足够大,因此您通常可以毫无问题地将所有代码(至少是您的模块)放入单个代码中。顺便说一句,GNU
ld似乎有问题,如果你强迫这种情况发生,它只会在没有警告的情况下截断跳转。
标签: assembly mips32 machine-code