所以我仍然是NASM x64的初学者。我在写一个石头剪刀布程序,我决定不得到一个随机数,而是得到最后一个毫秒数。我已经知道如何获得以秒为单位的时间:
section .text:
global _start
_start:
mov rax, 201
xor rdx, rdx ; if rdx is empty, the time value will go to rax
syscall
; exit
mov rax, 60
mov rdi, 0
syscall
我已经测试过了,它可以工作。我如何做完全相同的事情,但rax将以毫秒为单位保存值?(我不是说乘以1000,我想要真实的值)
我已经找了很长时间:通过系统调用表,搜索它,看一所大学的课程计划。我甚至问过人工智能。所以我最后只能求你们了。如有任何帮助,我将不胜感激。
有一个gettimeofday
系统调用,它给您提供微秒,或者clock_gettime
给您提供纳秒。调用它们需要做更多的工作,因为它们返回缓冲区而不是寄存器中的时间,但是您可以在堆栈上分配一个临时缓冲区。如果您特别关心毫秒数,则相应除以1000或1000000。
如果你要去做一个系统调用的麻烦,虽然,为什么不做正确,调用getrandom(2)
一些真正随机的字节?
未测试的getrandom
示例:
sub rsp, 16 ; make some stack space, maintain alignment
mov rdi, rsp ; point rdi at our stack buffer
mov esi, 1 ; read one byte
xor edx, edx ; no flags needed
mov eax, 318 ; see https://chromium.googlesource.com/chromiumos/docs/+/HEAD/constants/syscalls.md#x86_64-64_bit
syscall
; check for errors here; left as an exercise
movzx eax, byte [rsp] ; load the byte from stack into eax, zero the high bits
add rsp, 16 ; clean up the stack