【问题标题】:operand type mismatch for `jg' [closed]'jg'的操作数类型不匹配[关闭]
【发布时间】: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 字节操作码不存在。如果它足够有价值,他们本可以这样做,但如果添加新的条件分支,条件调用之类的东西可能会在列表中更高。

标签: assembly 64-bit x86-64


【解决方案1】:

我发现,您不能有条件地跳转到相对位置。

我的解决方案是

cmp rdi, 4
jg foo

foo:
  jmp [rsi + 0x20]

【讨论】:

  • 更具可读性的是进行相反的测试 jle 以跳过 jmp (并确保分支在范围内)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2023-03-27
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多