Как правильно использовать rand в Win64 NASM Assembly? - PullRequest
0 голосов
/ 07 октября 2018

Я не уверен, как получить случайное число в пределах определенного диапазона в сборке x64.Большинство примеров, которые я видел в SO и в Интернете, были посвящены Linux, так что советы о том, как это сделать в Windows, будут с благодарностью!

default rel

extern printf
extern scanf
extern rand

section .rdata  ;; constants
    prompt: db "What is your guess? (Answer is: %d) ", 0
    congrats: db "You guessed it!", 10, 0

section .data   ;; mutable variables
    guess: dq 0
    target: dq 0    ; assumed constant, but technically not

section .text
    global main
main:
    stack_reserve: equ 40
    sub     rsp, stack_reserve

    ;; let's assign our random target
    ;; rand(num_target) % 100 + 1

    lea     rcx, [prompt]
    call    printf

    add     rsp, stack_reserve
    ret

1 Ответ

0 голосов
/ 09 октября 2018

Я со временем разобрался:

;; calculate the random number
xor     rax, rax
mov     rcx, rax
call    time
mov     rcx, rax
call    srand
call    rand

;; rand = (rand % 100) + 1
xor     rdx, rdx
mov     rcx, 100
div     rcx
inc     rdx
mov     [target], rdx
mov     rcx, scan_fmt
call    printf
...