首页 > 解决方案 > 如何在 Mac 或裸机上的 x86-64 程序集中使用 monitor / mwait 指令

问题描述

最初我询问了 umonitor 和 umwait,但事实证明,正如@harold 所建议的那样,您甚至还不能购买具有这些指令的处理器。所以这个问题是关于监视器和 mwait 的,因为我对如何在裸机上使用它们很感兴趣。


我刚刚了解了monitor / mwait

我原以为一旦mwait调用任何指令就不会评估,所以我不明白如何写入内存的其他部分。除非这可能是一些具有某种共享内存的多线程东西,我认为我并不完全理解。

想知道是否可以编写一个快速的 hello world 程序来演示如何使用这些说明。我的尝试是这样的。

global _main

section .text

_main:
  call print1
  ; watch when address 1000
  ; (randomly chosen)
  ; is written to.
  mov eax, 1000
  monitor eax
  ; wait for 100 ms, not sure
  ; or some interrupt
  mov eax, 100
  mwait eax
  call print2
  call exit

print2:
  mov rdx, msg2.len
  mov rsi, msg2
  mov rdi, 1
  mov rax, 0x2000004
  syscall
  ret

print1:
  mov rdx, msg1.len
  mov rsi, msg1
  mov rdi, 1
  mov rax, 0x2000004
  syscall
  ret

exit:
  mov rdi, 0 ; exit status
  mov rax, 0x2000001 ;: exit
  syscall

section .data
msg1: db "start", 0xa, 0
.len: equ $ - msg1
msg2: db "end", 0xa, 0
.len: equ $ - msg2

我想知道的是(a)像 100ms 延迟这样的时间跨度和/或(b)写入内存的特定部分以触发回调的“事件”和/或(c ) 外部事件,如键盘中断或 ctrl+c 中断(如果有这样的事情)。或者也许时间的事情已经完成了tpause

尝试以下tpause我得到error: invalid combination of opcode and operands

mov eax, 1000
mov edx, 1000
mov rdi, 0
tpause rdi, edx, eax

我发现的一些资源:

标签: macoseventsassemblyx86-64

解决方案


推荐阅读