使用C调用的nasm x86初学者 - printf scanf

时间:2013-11-12 05:13:46

标签: linux x86 printf nasm scanf

此代码从用户获取一个名称和一个数字,并为其添加一个数字(5150)。我无法弄清楚为什么我会遇到分段错误。输入号码后,我收到错误。这是代码:

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 

1 个答案:

答案 0 :(得分:0)

push dword [name]更改为push dword name(或push name)。方括号不需要。 name是名称字符串的地址。