【发布时间】:2021-10-17 12:58:49
【问题描述】:
我正在做 x86 汇编,64 位
这是我的file.asm
cmp rdi, 4
jg [rsi + 0x20]
jmp [rsi + rdi * 8]
错误是operand type mismatch for 'jg'
我不明白为什么jmp 可以,但jg 不行。
我正在使用这段代码编译pwn asm -c amd64 -o output < file.asm
【问题讨论】:
-
就是这样。
jmp支持间接目标,jg不支持。请参阅指令集参考以了解可用的寻址模式。 -
从逻辑上讲,没有必要为每种类型的跳转使用每种可能的寻址模式来重载指令集,因为短的条件跳转可以很容易地跟随无条件跳转。请记住,x86 设计可以追溯到 CPU 只有数千个晶体管的时代。
-
@sj95126:同样对于代码密度,您不希望在带有 modrm 字节的间接 jcc 上再花费 16 个操作码。它并不经常需要,即使您将
0F转义字节用于 2 字节操作码,这也意味着 16 个其他 2 字节操作码不存在。如果它足够有价值,他们本可以这样做,但如果添加新的条件分支,条件调用之类的东西可能会在列表中更高。