section .data
intro_msg db "Welcome to the Number Guessing Game!", 10, 0
too_high_msg db "Your guess is too high!", 10, 0
too_low_msg db "Your guess is too low!", 10, 0
win_msg db "Congratulations! You guessed correctly!", 10, 0
lose_msg db "You've run out of guesses. You lose!", 10, 0
section .bss
guess resb 4 ; space to store the user's guess
rand_num resb 4 ; space to store the random number
guesses_left resb 4 ; space to store remaining guesses
section .text
global _start
_start:
; Step 1: Display the introductory message
mov rax, 1 ; syscall for write
mov rdi, 1 ; file descriptor (stdout)
mov rsi, intro_msg ; pointer to the message
mov rdx, 40 ; length of the message
syscall
; Step 2: Generate a random number between 1 and 100
mov rax, 318 ; syscall for getrandom
mov rdi, rand_num ; buffer to store random number
mov rsi, 4 ; size of the random number (32 bits)
mov rdx, 0 ; flags
syscall
; Limit the random number to between 1 and 100
mov eax, [rand_num] ; load the random number
and eax, 0x63 ; limit to 0-99 (0x63 mask)
add eax, 1 ; make it 1-100
mov [rand_num], eax ; store the adjusted random number
; Step 3: Initialize guesses_left and start guessing loop
mov dword [guesses_left], 6 ; initialize number of guesses
guess_loop:
; Check if the user is out of guesses
cmp dword [guesses_left], 0
je out_of_guesses ; if no guesses left, go to lose
; Ask the user for a guess (For simplicity, assume guess is loaded into [guess])
; Simulate user input here for simplicity; in real code, this would use syscalls
; mov eax, 50 ; Replace 50 with actual input capture mechanism
; mov [guess], eax
; Step 4 & 5: Check if the guess is too high or too low
mov eax, [guess] ; load the user's guess
cmp eax, [rand_num] ; compare the guess to the random number
jg too_high ; if guess > rand_num, jump to too_high
jl too_low ; if guess < rand_num, jump to too_low
; Step 6: If guess is correct
mov rax, 1 ; syscall for write
mov rdi, 1 ; file descriptor (stdout)
mov rsi, win_msg ; pointer to the winning message
mov rdx, 42 ; length of the message
syscall
jmp end_game
too_high:
; If the guess is too high, display a message
mov rax, 1 ; syscall for write
mov rdi, 1 ; file descriptor (stdout)
mov rsi, too_high_msg ; pointer to the message
mov rdx, 22 ; length of the message
syscall
jmp after_guess
too_low:
; If the guess is too low, display a message
mov rax, 1 ; syscall for write
mov rdi, 1 ; file descriptor (stdout)
mov rsi, too_low_msg ; pointer to the message
mov rdx, 21 ; length of the message
syscall
jmp after_guess
after_guess:
; Step 7: Decrement guesses_left and loop
dec dword [guesses_left] ; decrease remaining guesses
jmp guess_loop ; go back to guess loop
out_of_guesses:
; If no guesses are left, display a losing message
mov rax, 1 ; syscall for write
mov rdi, 1 ; file descriptor (stdout)
mov rsi, lose_msg ; pointer to the losing message
mov rdx, 37 ; length of the message
syscall
end_game:
; Exit the program
mov rax
, 60 ; syscall
for exit xor rdi
, rdi
; exit code
0 syscall
c2VjdGlvbiAuZGF0YQogICAgaW50cm9fbXNnIGRiICJXZWxjb21lIHRvIHRoZSBOdW1iZXIgR3Vlc3NpbmcgR2FtZSEiLCAxMCwgMAogICAgdG9vX2hpZ2hfbXNnIGRiICJZb3VyIGd1ZXNzIGlzIHRvbyBoaWdoISIsIDEwLCAwCiAgICB0b29fbG93X21zZyBkYiAiWW91ciBndWVzcyBpcyB0b28gbG93ISIsIDEwLCAwCiAgICB3aW5fbXNnIGRiICJDb25ncmF0dWxhdGlvbnMhIFlvdSBndWVzc2VkIGNvcnJlY3RseSEiLCAxMCwgMAogICAgbG9zZV9tc2cgZGIgIllvdSd2ZSBydW4gb3V0IG9mIGd1ZXNzZXMuIFlvdSBsb3NlISIsIDEwLCAwCgpzZWN0aW9uIC5ic3MKICAgIGd1ZXNzIHJlc2IgNCAgICAgICAgICAgICAgOyBzcGFjZSB0byBzdG9yZSB0aGUgdXNlcidzIGd1ZXNzCiAgICByYW5kX251bSByZXNiIDQgICAgICAgICAgIDsgc3BhY2UgdG8gc3RvcmUgdGhlIHJhbmRvbSBudW1iZXIKICAgIGd1ZXNzZXNfbGVmdCByZXNiIDQgICAgICAgOyBzcGFjZSB0byBzdG9yZSByZW1haW5pbmcgZ3Vlc3NlcwoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyBTdGVwIDE6IERpc3BsYXkgdGhlIGludHJvZHVjdG9yeSBtZXNzYWdlCiAgICBtb3YgcmF4LCAxICAgICAgICAgICAgICAgICA7IHN5c2NhbGwgZm9yIHdyaXRlCiAgICBtb3YgcmRpLCAxICAgICAgICAgICAgICAgICA7IGZpbGUgZGVzY3JpcHRvciAoc3Rkb3V0KQogICAgbW92IHJzaSwgaW50cm9fbXNnICAgICAgICAgOyBwb2ludGVyIHRvIHRoZSBtZXNzYWdlCiAgICBtb3YgcmR4LCA0MCAgICAgICAgICAgICAgICA7IGxlbmd0aCBvZiB0aGUgbWVzc2FnZQogICAgc3lzY2FsbAoKICAgIDsgU3RlcCAyOiBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAxIGFuZCAxMDAKICAgIG1vdiByYXgsIDMxOCAgICAgICAgICAgICAgIDsgc3lzY2FsbCBmb3IgZ2V0cmFuZG9tCiAgICBtb3YgcmRpLCByYW5kX251bSAgICAgICAgICA7IGJ1ZmZlciB0byBzdG9yZSByYW5kb20gbnVtYmVyCiAgICBtb3YgcnNpLCA0ICAgICAgICAgICAgICAgICA7IHNpemUgb2YgdGhlIHJhbmRvbSBudW1iZXIgKDMyIGJpdHMpCiAgICBtb3YgcmR4LCAwICAgICAgICAgICAgICAgICA7IGZsYWdzCiAgICBzeXNjYWxsCgogICAgOyBMaW1pdCB0aGUgcmFuZG9tIG51bWJlciB0byBiZXR3ZWVuIDEgYW5kIDEwMAogICAgbW92IGVheCwgW3JhbmRfbnVtXSAgICAgICAgOyBsb2FkIHRoZSByYW5kb20gbnVtYmVyCiAgICBhbmQgZWF4LCAweDYzICAgICAgICAgICAgICA7IGxpbWl0IHRvIDAtOTkgKDB4NjMgbWFzaykKICAgIGFkZCBlYXgsIDEgICAgICAgICAgICAgICAgIDsgbWFrZSBpdCAxLTEwMAogICAgbW92IFtyYW5kX251bV0sIGVheCAgICAgICAgOyBzdG9yZSB0aGUgYWRqdXN0ZWQgcmFuZG9tIG51bWJlcgoKICAgIDsgU3RlcCAzOiBJbml0aWFsaXplIGd1ZXNzZXNfbGVmdCBhbmQgc3RhcnQgZ3Vlc3NpbmcgbG9vcAogICAgbW92IGR3b3JkIFtndWVzc2VzX2xlZnRdLCA2IDsgaW5pdGlhbGl6ZSBudW1iZXIgb2YgZ3Vlc3NlcwoKZ3Vlc3NfbG9vcDoKICAgIDsgQ2hlY2sgaWYgdGhlIHVzZXIgaXMgb3V0IG9mIGd1ZXNzZXMKICAgIGNtcCBkd29yZCBbZ3Vlc3Nlc19sZWZ0XSwgMAogICAgamUgb3V0X29mX2d1ZXNzZXMgICAgICAgICAgIDsgaWYgbm8gZ3Vlc3NlcyBsZWZ0LCBnbyB0byBsb3NlCgogICAgOyBBc2sgdGhlIHVzZXIgZm9yIGEgZ3Vlc3MgKEZvciBzaW1wbGljaXR5LCBhc3N1bWUgZ3Vlc3MgaXMgbG9hZGVkIGludG8gW2d1ZXNzXSkKICAgIDsgU2ltdWxhdGUgdXNlciBpbnB1dCBoZXJlIGZvciBzaW1wbGljaXR5OyBpbiByZWFsIGNvZGUsIHRoaXMgd291bGQgdXNlIHN5c2NhbGxzCiAgICA7IG1vdiBlYXgsIDUwICAgICAgICAgICAgICAgOyBSZXBsYWNlIDUwIHdpdGggYWN0dWFsIGlucHV0IGNhcHR1cmUgbWVjaGFuaXNtCiAgICA7IG1vdiBbZ3Vlc3NdLCBlYXgKCiAgICA7IFN0ZXAgNCAmIDU6IENoZWNrIGlmIHRoZSBndWVzcyBpcyB0b28gaGlnaCBvciB0b28gbG93CiAgICBtb3YgZWF4LCBbZ3Vlc3NdICAgICAgICAgICA7IGxvYWQgdGhlIHVzZXIncyBndWVzcwogICAgY21wIGVheCwgW3JhbmRfbnVtXSAgICAgICAgOyBjb21wYXJlIHRoZSBndWVzcyB0byB0aGUgcmFuZG9tIG51bWJlcgogICAgamcgdG9vX2hpZ2ggICAgICAgICAgICAgICAgOyBpZiBndWVzcyA+IHJhbmRfbnVtLCBqdW1wIHRvIHRvb19oaWdoCiAgICBqbCB0b29fbG93ICAgICAgICAgICAgICAgICA7IGlmIGd1ZXNzIDwgcmFuZF9udW0sIGp1bXAgdG8gdG9vX2xvdwoKICAgIDsgU3RlcCA2OiBJZiBndWVzcyBpcyBjb3JyZWN0CiAgICBtb3YgcmF4LCAxICAgICAgICAgICAgICAgICA7IHN5c2NhbGwgZm9yIHdyaXRlCiAgICBtb3YgcmRpLCAxICAgICAgICAgICAgICAgICA7IGZpbGUgZGVzY3JpcHRvciAoc3Rkb3V0KQogICAgbW92IHJzaSwgd2luX21zZyAgICAgICAgICAgOyBwb2ludGVyIHRvIHRoZSB3aW5uaW5nIG1lc3NhZ2UKICAgIG1vdiByZHgsIDQyICAgICAgICAgICAgICAgIDsgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCiAgICBzeXNjYWxsCiAgICBqbXAgZW5kX2dhbWUKCnRvb19oaWdoOgogICAgOyBJZiB0aGUgZ3Vlc3MgaXMgdG9vIGhpZ2gsIGRpc3BsYXkgYSBtZXNzYWdlCiAgICBtb3YgcmF4LCAxICAgICAgICAgICAgICAgICA7IHN5c2NhbGwgZm9yIHdyaXRlCiAgICBtb3YgcmRpLCAxICAgICAgICAgICAgICAgICA7IGZpbGUgZGVzY3JpcHRvciAoc3Rkb3V0KQogICAgbW92IHJzaSwgdG9vX2hpZ2hfbXNnICAgICAgOyBwb2ludGVyIHRvIHRoZSBtZXNzYWdlCiAgICBtb3YgcmR4LCAyMiAgICAgICAgICAgICAgICA7IGxlbmd0aCBvZiB0aGUgbWVzc2FnZQogICAgc3lzY2FsbAogICAgam1wIGFmdGVyX2d1ZXNzCgp0b29fbG93OgogICAgOyBJZiB0aGUgZ3Vlc3MgaXMgdG9vIGxvdywgZGlzcGxheSBhIG1lc3NhZ2UKICAgIG1vdiByYXgsIDEgICAgICAgICAgICAgICAgIDsgc3lzY2FsbCBmb3Igd3JpdGUKICAgIG1vdiByZGksIDEgICAgICAgICAgICAgICAgIDsgZmlsZSBkZXNjcmlwdG9yIChzdGRvdXQpCiAgICBtb3YgcnNpLCB0b29fbG93X21zZyAgICAgICA7IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UKICAgIG1vdiByZHgsIDIxICAgICAgICAgICAgICAgIDsgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCiAgICBzeXNjYWxsCiAgICBqbXAgYWZ0ZXJfZ3Vlc3MKCmFmdGVyX2d1ZXNzOgogICAgOyBTdGVwIDc6IERlY3JlbWVudCBndWVzc2VzX2xlZnQgYW5kIGxvb3AKICAgIGRlYyBkd29yZCBbZ3Vlc3Nlc19sZWZ0XSAgIDsgZGVjcmVhc2UgcmVtYWluaW5nIGd1ZXNzZXMKICAgIGptcCBndWVzc19sb29wICAgICAgICAgICAgIDsgZ28gYmFjayB0byBndWVzcyBsb29wCgpvdXRfb2ZfZ3Vlc3NlczoKICAgIDsgSWYgbm8gZ3Vlc3NlcyBhcmUgbGVmdCwgZGlzcGxheSBhIGxvc2luZyBtZXNzYWdlCiAgICBtb3YgcmF4LCAxICAgICAgICAgICAgICAgICA7IHN5c2NhbGwgZm9yIHdyaXRlCiAgICBtb3YgcmRpLCAxICAgICAgICAgICAgICAgICA7IGZpbGUgZGVzY3JpcHRvciAoc3Rkb3V0KQogICAgbW92IHJzaSwgbG9zZV9tc2cgICAgICAgICAgOyBwb2ludGVyIHRvIHRoZSBsb3NpbmcgbWVzc2FnZQogICAgbW92IHJkeCwgMzcgICAgICAgICAgICAgICAgOyBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKICAgIHN5c2NhbGwKCmVuZF9nYW1lOgogICAgOyBFeGl0IHRoZSBwcm9ncmFtCiAgICBtb3YgcmF4LCA2MCAgICAgICAgICAgICAgICA7IHN5c2NhbGwgZm9yIGV4aXQKICAgIHhvciByZGksIHJkaSAgICAgICAgICAgICAgIDsgZXhpdCBjb2RlIDAKICAgIHN5c2NhbGw=