【发布时间】:2018-10-11 23:44:33
【问题描述】:
我正在努力将一些旧的 8086 汇编代码更新为更现代的系统。在我的逆向工程中,我遇到了这个:
LINADJ: MOV AX,ENRMAX
SUB AX,LINBND ;Is energy high enough to decrease power limit?
JLE ENDCYC ;If not, don't change power limit
问题是这个文件中没有ENDCYC标签可以跳转。当跳转命令没有可跳转到的有效标签时会发生什么?
对不起,我的新手组装技能,但这个标签出现在其他密切相关的文件中,但据我了解,你不能从一个文件跳转到另一个文件。所以我假设这个跳转要么变成空操作,要么抛出某种错误。
【问题讨论】:
-
你当然可以跳转到另一个文件。更新地址是链接器的工作。根据您的汇编程序,您可能必须在调用模块中将目标标签声明为
extern或类似名称,在导出模块中声明为global。如果出现问题,您将从汇编器或链接器中收到错误消息。它永远不会成为空操作(除非你的工具链已经脑死)。 -
我应该寻找什么来判断它是否跳出了这个文件?似乎此代码中的大多数外部引用都被调用或包含在内。
$INCLUDE(:@ARCS:MEMSLV.A86)或CALL AUDIT -
CALL或JLE对标签可见性没有影响。如果它不在当前文件中并且已知代码可以工作,那么它将转到另一个文件。在你的汇编器中寻找global和extern指令或任何等效的指令。 -
我们无法从您提供的信息中得知更多信息。不过,代码可以在处理器之间共享。
-
不,几乎所有可能它都无法与未定义的标签进行组装/链接。实际上,只需将 ENDCYC 重命名为 ENDCYC1234 或其他一些已知不存在的标签,然后看看构建过程会发生什么。
标签: assembly reverse-engineering x86-16