2014-11-03 2 views
0

Я пытаюсь написать простую программу, используя scanf и printf, но она не сохраняет мои значения должным образом.Scanf on nasm assembly program

 extern printf 
     extern scanf 

     SECTION .data 
    str1: db "Enter a number: ",0,10 
    str2: db "your value is %d, squared = %d",0,10 
    fmt1: db "%d",0 
    location: dw 0h 


     SECTION .bss 
    input1: resw 1 

     SECTION .text 
     global main 

    main: 
     push ebp 
     mov ebp, esp 

     push str1 
     call printf 
     add esp, 4 

     push location 
     push fmt1 
     call scanf 
     mov ebx, eax   ;ebx holds input 

     mul eax     ;eax holds input*input 

     push eax 
     push ebx 
     push dword str2 
     call printf 
     add esp, 12 

     mov esp, ebp 
     pop ebp 
     mov eax,0 
     ret 

По какой-то причине, когда я запускаю программу, независимо от того, во что я вхожу, программа печатает 1 для обоих входов.

Я использую NASM, связанный с GCC

ответ

3

Вы делаете неверное предположение здесь:

call scanf 
mov ebx, eax   ;ebx holds input 

scanf фактически возвращает «количество элементов списка аргументов успешно заполненного» (source). Ваше целое число находится в location.
Кстати, вы, вероятно, должны сделать location не менее 4 байтов (т. Е. Использовать dd вместо dw).

+2

Кроме того, призывая к принятию конвенций, необходимо сохранить «ebx». Вместо этого вы можете использовать 'ecx'. Кроме того, после 'call scanf' есть отсутствующий' add esp, 8', но в этом случае это безобидно, потому что вы восстанавливаете указатель стека из 'ebp'. – Jester