Изначально я спрашивал об umonitor и umwait, но, как подсказал @harold, оказалось, что вы даже не можете купить процессор, в котором есть эти инструкции.Так что этот вопрос касается монитора и mwait, потому что мне интересно, как использовать их на baremetal.
Я только что узнал о 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
Мне интересно, как выглядит пример использования для (а) временного интервала, например, задержки в 100 мс, и / или (б) «события» написанияк определенной части памяти, чтобы вызвать обратный вызов, и / или (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
Несколько ресурсов, которые яобнаружили: