64位x86汇编jg指令内存间接跳转报操作数类型不匹配问题咨询
问题原因
这是x86指令集本身的设计限制,和你使用的汇编器无关:
- 无条件跳转指令
jmp、调用指令call支持间接寻址操作数,你写的jmp [rsi + rdi * 8]是合法的,CPU会从对应内存地址读取8字节的目标地址完成跳转。 - 包括
jg在内的所有条件跳转指令(je/jne/jl/jge等),仅支持相对偏移立即数作为操作数,也就是只能直接写跳转标签,不能接寄存器,也不能接内存地址,所以你的jg [rsi + 0x20]写法不符合指令规范,编译报错。
修复方案
你可以把条件间接跳转拆成分支实现,示例代码如下:
cmp rdi, 4 jle .normal_jump ; 不满足大于4的条件就走正常跳转分支 jmp [rsi + 0x20] ; 满足条件时走间接跳转 .normal_jump: jmp [rsi + rdi * 8]
内容的提问来源于stack exchange,提问作者Yuri Aps
相关产品推荐
相关产品推荐

