【问题标题】:nasm x86, conditional jumps to a dynamic addressnasm x86,有条件跳转到动态地址
【发布时间】:2020-03-28 19:04:48
【问题描述】:

您好,我遇到了一个问题,好像 nasm 妨碍了我,但我想问一下 nasm 中是否有我不知道的解决方案。我正在使用 x86 intel 编程制作 COM 文件。

在我的程序中,事物的位置不是静态的,所以我使用 bp 来计算事物的正确偏移量。例如,如果我想访问变量缓冲区,我使用lea dx, [bp + buffer]

所以在我的代码中,我想使用条件跳转到代码中的特定标签,但是由于程序的位置发生了变化,我想做这样的事情:jc [bp + EXIT],加载到寄存器中也不起作用。

在此示例中,EXIT 将是程序结束的部分。但是我想跳转到代码中的许多不同的地方,而不仅仅是退出。

所以我要问的是,nasm 中是否有任何东西可以让我有条件地跳转到相对于 bp 动态的内存地址?即使稍后代码位置在内存中发生变化,它们仍然有效吗?如果不是,那么获得这种行为的最佳解决方案是什么?

【问题讨论】:

    标签: assembly com conditional-statements nasm x86-16


    【解决方案1】:

    条件跳转只能编码一个短的或(在 386+ 上)接近的、恒定的跳转目标。为了让你在一定条件下间接跳转,你可以reverse the condition你想跳转。然后可以在围绕另一个跳转指令的跳转中使用此相反条件。如果不满足您预期的间接跳跃条件,第一次跳跃将有效地让您跳过另一次跳跃。 (只有jcxz条件不能直接倒置。)

    这是您以这种方式完成的示例。我用了local label

        jnc .skip
            ; here if Carry Flag is set
        jmp near [bp + EXIT]
    .skip:
    

    如果您愿意,您可以保持对条件的原始感觉,但使用常量跳转目标将执行中继到放置在某处的间接跳转指令。

        jc jmp_bp_exit
            ; other code to continue execution here
    
    
    jmp_bp_exit:
            ; here if Carry Flag is set
        jmp near [bp + EXIT]
    

    【讨论】:

      【解决方案2】:

      经过反复试验,我发现我可以使用 cmovc 代替。

      【讨论】:

      • cmovc 当然只能在 80386+ 上使用,并且不能在 8086/80186/80286 等早期处理器上使用。这对您来说可能不是问题,但仅供参考。
      • @MichaelPetch:CMOV 实际上需要 i686(又名 P6 / Pentium Pro 或更高版本)。但是,是的,像 GCC 和 MSVC 这样的现代编译器通常默认情况下假设它们可以使用像 CMOV 这样的 P6 新指令,因此大多数可执行文件已经需要 P6 特性。
      猜你喜欢
      • 2010-10-20
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多