nasm x86,条件跳转到动态地址
nasm x86, conditional jumps to a dynamic address
你好,我 运行 遇到了一个问题,好像 nasm 妨碍了我,但我想问一下 [=23= 中是否有我不知道的解决方案].我正在使用 x86 英特尔编程制作 COM 文件。
在我的程序中,事物的位置不是静态的,所以我使用 bp 来计算事物的正确偏移量。例如,如果我想访问一个变量缓冲区,我使用 lea dx, [bp + buffer]
所以在我的代码中我想使用条件跳转到代码中的特定标签,但是由于程序的位置改变了我想做这样的事情:jc [bp + EXIT]
,加载到寄存器中不会要么工作。
在此示例中,EXIT 将是程序结束的部分。但是我想跳转到代码中的许多不同地方而不仅仅是退出。
所以我想问的是,nasm 中是否有任何内容允许我有条件地跳转到相对于 bp 动态的内存地址?也就是说,即使代码位置稍后在内存中发生变化,它们也能正常工作吗?如果不是,获得该行为的最佳解决方案是什么?
经过反复试验,我发现我可以改用 cmovc。
条件跳转只能编码短的或(在 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]
你好,我 运行 遇到了一个问题,好像 nasm 妨碍了我,但我想问一下 [=23= 中是否有我不知道的解决方案].我正在使用 x86 英特尔编程制作 COM 文件。
在我的程序中,事物的位置不是静态的,所以我使用 bp 来计算事物的正确偏移量。例如,如果我想访问一个变量缓冲区,我使用 lea dx, [bp + buffer]
所以在我的代码中我想使用条件跳转到代码中的特定标签,但是由于程序的位置改变了我想做这样的事情:jc [bp + EXIT]
,加载到寄存器中不会要么工作。
在此示例中,EXIT 将是程序结束的部分。但是我想跳转到代码中的许多不同地方而不仅仅是退出。
所以我想问的是,nasm 中是否有任何内容允许我有条件地跳转到相对于 bp 动态的内存地址?也就是说,即使代码位置稍后在内存中发生变化,它们也能正常工作吗?如果不是,获得该行为的最佳解决方案是什么?
经过反复试验,我发现我可以改用 cmovc。
条件跳转只能编码短的或(在 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]