【问题标题】:What does "." mean in `jnz .` or `jmp .` statements? [duplicate]"." 是什么意思?在 `jnz .` 或 `jmp .` 语句中是什么意思? [复制]
【发布时间】:2020-06-11 19:36:13
【问题描述】:

我正在阅读一些汇编(att sintax,x86 代码,GAS)代码,我发现这条指令 jnz .jmp .,我知道 jnz 或 jmp 是什么意思,但是当 @ 时我不明白它的去向987654325@ 或 jmp . 被调用,我没有办法调试或跟踪,我相信它会转到下一条指令,但我不确定。

【问题讨论】:

标签: assembly x86 gnu-assembler att


【解决方案1】:

https://sourceware.org/binutils/docs/as/Dot.html#Dot

特殊符号. 表示as 正在组装的当前地址。

在代码上下文中,. 是当前指令的地址。所以jmp . 跳回到自己;这是一个无限循环。如果未设置零标志,jnz . 将跳回自身。由于跳转不影响零标志,因此第一次执行该指令的效果是如果零标志没有设置则永远循环,如果是则继续执行下一条指令。

【讨论】:

  • 真正的问题是,为什么在这个时代会有人这样做?
  • @SevaAlekseyev:我猜是在玩具项目或没有电源管理的微控制器中等待中断。或在引导扇区独立程序结束时。 (不过,最好在循环中使用hlt。)
  • 标签说 x86,HLT 更有意义。
  • @SevaAlekseyev:hlt 适合一种省力的方法,但它仍然只是 C0 睡眠或类似的东西。您需要monitor / mwait 在更深的睡眠中节省更多电量。 (但两者都适合在模拟器中运行。)
【解决方案2】:

JMP 的语法是 - JMP label。在这里,label 指定了代码将从该点跳转到的标签。在问题中. 可以被认为是Label。它是一个特殊符号,表示它正在组装的当前地址。 JMP . 本质上是一个无限循环,因为代码会不断跳回到自身,直到你得到一个中断。

JNZ 语句是一个条件跳转语句,当未设置零标志 (Z = 0) 时,它将作为 JMP 工作。如果设置了零标志,程序将跳过跳转并继续执行下一行代码。

所以如果Z = 0(未设置零标志)并且如果Z = 1,则JNZ .可以被视为移动到下一行,然后继续无限循环直到Z标志被重置或直到你得到一个中断.

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2015-07-15
    • 2018-07-17
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多