2017-02-27 3 views
0

Ich versuche, ein "rate die Nummer" Spiel in Nasm auf Linux, Ich habe ein Problem, dass ich nicht verstehe ... Wenn der Scanf ausgeführt wird, ist meine Variable mysteriousNumber ist auf 0 gesetzt und ich habe keine Ahnung warum ... Jemand könnte mir erklären was mache ich falsch? (Sorry für meine Englisch-Kenntnisse)scanf set variabel auf 0 NASM

; 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 

Antwort

2

Sie "% d" für scanf verwenden, die ein int (32-Bit-Wert in diesem Fall) ändert

Ihre Variablen sind nur 16 Bit (“ enteredNumber: dw ... "), und die oberen 16 Bit Ihrer Eingabe überschreibt die zweite Variable

Verwendung‚dd‘für die Variablen statt

+0

Oh ja, natürlich, vielen Dank! – Neolex