macos - 如何在 Mac 或裸机上的 x86-64 程序集中使用 monitor / mwait 指令
问题描述
最初我询问了 umonitor 和 umwait,但事实证明,正如@harold 所建议的那样,您甚至还不能购买具有这些指令的处理器。所以这个问题是关于监视器和 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
我发现的一些资源:
- https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf
- https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-303.html
- https://software.intel.com/en-us/articles/how-to-use-the-monitor-and-mwait-streaming-simd-extensions-3-instructions
- http://blog.andy.glew.ca/2010/11/httpsemipublic.html
解决方案
推荐阅读
- android - FIDO 是否必须托管assetlinks.json 文件?
- excel - 检测 Excel VBA ListBox 中的选择更改
- r - R基于具有添加条件的特定列合并两个数据集
- javascript - 等待客户端 Javascript 加载 Axios GET 请求
- excel - 更正宏以选择每第 n 列而不是行
- python - 如何在没有深度学习的情况下改善肺的分割
- jspdf - jsPDF,插入具有自定义样式的图像
- python - 找到在列表中插入给定字符的所有方法
- javascript - 在 React 中创建表单时 .map() 不会正确填充选择 > 选项,但适用于普通 div
- python - 无法使用 swifter 并行化 pandas 应用