scanf 将变量设置为 0 NASM
scanf set variable to 0 NASM
我正尝试在 linux 上 nasm 中编写一个 "guess the number" 游戏,
我有一个问题,我不明白...
执行 scanf 时,我的变量 mysteriousNumber 设置为 0,我不知道为什么......
有人可以解释我做错了什么吗?
(对不起我的英语水平)
; GuessTheNumber
; mainasm : user have to guess the randomly generated number
;
extern printf
extern rand
extern srand
extern time
extern puts
extern scanf
SECTION .data
string_welcome: db "Welcome to the GuestTheNumber game",0xa,0x0
string_ask: db "Enter a number between 1 and 100",0xa,0x0
string_higher: db "The number is higher ",0xa,0x0
string_lower: db "The number is lower",0xa,0x0
string_win: db "YOU WIN",0xa,0x0
string_format: db "%d",0x0
enteredNumber: dw 999
mysteriousNumber: dw 0
SECTION .text ; code section
global main ; make label available to linker
main: ; standard gcc entry point
push ebp
mov ebp,esp
push string_welcome
call printf
add esp,0x4
push 1 ; numberMin
push 100 ; numberMax
call generateNumber ; generateNumber between nubmerMin to numberMax
add esp, 0x8
mov [mysteriousNumber],eax
mov edx , 0
loop:
push string_ask
call printf ; printf("Enter a number ")
add esp,0x4
push enteredNumber
push string_format
call scanf
add esp,0x8
mov ebx, DWORD [enteredNumber]
mov eax, DWORD [mysteriousNumber]
cmp eax,ebx
jb below
jg higher
jmp win
below:
push string_lower
call printf
add esp,0x4
jmp loop
higher:
push string_higher
call printf
add esp,0x4
jmp loop
win:
push string_win
call printf
end:
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
leave
ret
generateNumber:
push ebp ; prolog
mov ebp,esp
push 0x0
call time ; call time(NULL)
push eax ; set arg1 = time(NULL)
call srand ; call srand(time(NULL))
mov ebx,DWORD [ebp+0x8] ; ebx = numbermax
mov ecx,DWORD [ebp+0xc] ; ecx = numbermin
sub ebx,ecx ; ebx = numbermax - numbermin
inc ebx ; ebx = numbermax -numbermin + 1
call rand
xor edx,edx
div ebx ; edx = rand%ebx
inc edx ; edx =
mov eax,edx ; eax = MysteryNumber
leave
ret
您正在为 scanf 使用“%d”,它会更改一个 int(在本例中为 32 位值)
您的变量只有 16 位("enteredNumber: dw..."),您输入的高 16 位覆盖了第二个变量
使用 "dd" 作为变量
我正尝试在 linux 上 nasm 中编写一个 "guess the number" 游戏, 我有一个问题,我不明白... 执行 scanf 时,我的变量 mysteriousNumber 设置为 0,我不知道为什么...... 有人可以解释我做错了什么吗? (对不起我的英语水平)
; GuessTheNumber
; mainasm : user have to guess the randomly generated number
;
extern printf
extern rand
extern srand
extern time
extern puts
extern scanf
SECTION .data
string_welcome: db "Welcome to the GuestTheNumber game",0xa,0x0
string_ask: db "Enter a number between 1 and 100",0xa,0x0
string_higher: db "The number is higher ",0xa,0x0
string_lower: db "The number is lower",0xa,0x0
string_win: db "YOU WIN",0xa,0x0
string_format: db "%d",0x0
enteredNumber: dw 999
mysteriousNumber: dw 0
SECTION .text ; code section
global main ; make label available to linker
main: ; standard gcc entry point
push ebp
mov ebp,esp
push string_welcome
call printf
add esp,0x4
push 1 ; numberMin
push 100 ; numberMax
call generateNumber ; generateNumber between nubmerMin to numberMax
add esp, 0x8
mov [mysteriousNumber],eax
mov edx , 0
loop:
push string_ask
call printf ; printf("Enter a number ")
add esp,0x4
push enteredNumber
push string_format
call scanf
add esp,0x8
mov ebx, DWORD [enteredNumber]
mov eax, DWORD [mysteriousNumber]
cmp eax,ebx
jb below
jg higher
jmp win
below:
push string_lower
call printf
add esp,0x4
jmp loop
higher:
push string_higher
call printf
add esp,0x4
jmp loop
win:
push string_win
call printf
end:
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
leave
ret
generateNumber:
push ebp ; prolog
mov ebp,esp
push 0x0
call time ; call time(NULL)
push eax ; set arg1 = time(NULL)
call srand ; call srand(time(NULL))
mov ebx,DWORD [ebp+0x8] ; ebx = numbermax
mov ecx,DWORD [ebp+0xc] ; ecx = numbermin
sub ebx,ecx ; ebx = numbermax - numbermin
inc ebx ; ebx = numbermax -numbermin + 1
call rand
xor edx,edx
div ebx ; edx = rand%ebx
inc edx ; edx =
mov eax,edx ; eax = MysteryNumber
leave
ret
您正在为 scanf 使用“%d”,它会更改一个 int(在本例中为 32 位值)
您的变量只有 16 位("enteredNumber: dw..."),您输入的高 16 位覆盖了第二个变量
使用 "dd" 作为变量