title: nasm x86 beginner using C calls - printf scanf
body: <p>This code gets a name and one number from the user and adds a number (5150) to it. I can't figure out why I'm getting a segmentation fault. I get the fault after the prompt to enter the number.  Here's the code:</p>
  
  <pre><code>SECTION .data
  
      askName:   db "Enter your name: ",0
      askNum:    db "Enter an unsigned number no more than four digits: ",0
      fResultP1:  db "Thank you ",0   
      fResultP2:  db ".",0
      fResultP3:  db "After adding 5150 to your number, the answer is now: ", 0
      formats:    db "%s", 0
      formatd:    db "%d", 0
      formatdlf:  db "%d",10, 0       ; with line feed
  
  SECTION .bss
  
      name:   resb    20
      number: resb   4
      ;answer: resb    5       
  
  SECTION .text
  
      extern printf
      extern scanf
  
              global main                    
  
  main:
      ;;;;;;; set up stack frame
              push EBP        ; base pointer
              mov EBP, ESP    ; put stack pntr in EBP
              pushad          ; pushes all registers on stack
  
      ;;;;;;; ask user name 
              push askName    ; push question 
              call printf     ; print question
              add  ESP, 4     ; clean the stack (pop stack)
  
      ;;;;;;; get name input
              push name
              push formats    ; %s (string)               
              call scanf
              add ESP, 8      ; clean the stack (pop stack)
  
      ;;;;;;; ask user number
              push askNum     ; push question
              call printf     
              add ESP, 4      ; pop stack
  
      ;;;;;;; get number input
              push number
              push formatd    ; %d (decimal)
              call scanf
              add ESP, 8      ; pop stack 2X4= 8
  
      ;;;;;;; print closing sent
              push fResultP1  ; "Thank you "
              call printf
              add ESP, 4      ; pop stack
  
              push dword [name]
              call printf
              add ESP, 4      ; pop
  
              push fResultP2  ; "."
              call printf
              add ESP, 4
  
              push fResultP3  ; "After adding..."
              call printf
              add ESP, 4      ; pop
  
              mov EAX, dword [number]
              add EAX, 5150   
              push EAX        ; push on the added number
              push formatdlf  ; has line feed
              call printf
              add ESP, 8      ; pop
  
      ;;;;;;; destroy stack frame ;;;;;;;;;;;;;;;;;
             popad          
            mov ESP, EBP
             pop EBP
  
             ret 
  </code></pre>