汇编语句

不安全的 asm 语句支持将汇编代码直接嵌入到 Nim 代码中。 在汇编代码中引用 Nim 的标识符需要包含在特定字符中,该字符可以在语句的编译指示中指定。默认特定字符是 ‘`‘ :

  1. {.push stackTrace:off.}
  2. proc addInt(a, b: int): int =
  3. # a 在 eax 中, b 在 edx 中
  4. asm """
  5. mov eax, `a`
  6. add eax, `b`
  7. jno theEnd
  8. call `raiseOverflow`
  9. theEnd:
  10. """
  11. {.pop.}

如果使用 GNU 汇编器,则会自动插入引号和换行符:

  1. proc addInt(a, b: int): int =
  2. asm """
  3. addl %%ecx, %%eax
  4. jno 1
  5. call `raiseOverflow`
  6. 1:
  7. :"=a"(`result`)
  8. :"a"(`a`), "c"(`b`)
  9. """

替代:

  1. proc addInt(a, b: int): int =
  2. asm """
  3. "addl %%ecx, %%eax\n"
  4. "jno 1\n"
  5. "call `raiseOverflow`\n"
  6. "1: \n"
  7. :"=a"(`result`)
  8. :"a"(`a`), "c"(`b`)
  9. """