你好,我遇到了一个问题,似乎nasm挡住了我的去路,但我想问一下,在nasm中是否有我不知道的解决方案。我在x86英特尔编程,制作COM文件。
在我的程序中,事物的位置不是静态的,所以我使用bp来计算事物的正确偏移量。例如,如果我想访问可变缓冲区,我使用lea dx, [bp + buffer]
因此,在我的代码中,我想使用条件跳转到代码中的特定标签,但由于程序的位置发生了变化,我想做这样的事情:jc [bp + EXIT]
,加载到寄存器中也不起作用。
在本例中,EXIT将是程序结束的部分。但我想跳到代码中的许多不同位置,而不仅仅是退出。
所以我想问的是,在nasm中有什么东西可以让我条件跳转到相对于bp动态的内存地址吗?也就是说,即使以后代码在内存中的位置发生变化,它们也能工作?如果没有,那么获得这种行为的最佳解决方案是什么?
条件跳转只能编码一个短的或(在386+上(附近的常量跳转目的地。为了允许您在特定条件下间接跳转,您可以反转要跳转的条件。然后,可以在围绕另一个跳转指令的跳转中使用这种相反的条件。如果不满足你想要的间接跳跃条件,第一次跳跃将有效地让你跳过另一次跳跃。(只有jcxz
条件不能直接反转。(
这是你这样做的例子。我用了当地的标签。
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]
经过一番尝试和错误之后,我发现我可以使用cmovc。