如何在Mac或裸机上的x86-64程序集中使用Monitor / Mwait指令

时间:2019-03-22 09:28:18

标签: macos events assembly x86-64

最初,我询问了有关umonitor和umwait的问题,但事实证明,如@harold所言,您甚至无法购买具有这些说明的处理器。所以这个问题是关于监视和等待的,因为我很感兴趣如何在裸机上使用它们。


我刚刚了解了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

我发现的一些资源:

0 个答案:

没有答案