【问题标题】:nasm x86 beginner using C calls - printf scanfnasm x86 初学者使用 C 调用 - printf scanf
【发布时间】:2013-11-12 05:13:46
【问题描述】:

这段代码从用户那里得到一个名字和一个数字,并在其中添加一个数字 (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 

【问题讨论】:

  • 打印名称时push dword [name]不应该是push name吗?

标签: linux x86 printf nasm scanf


【解决方案1】:

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

【讨论】:

  • 我在 OP 的代码中没有看到任何 mov EAX, dword [name] 指令。
  • 感谢您的帮助 louxiu a Micheal。也必须改变这个 --number: resd 1
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2019-07-06
  • 2013-05-14
  • 2012-02-10
  • 1970-01-01
  • 2015-06-09
  • 2015-07-30
相关资源
最近更新 更多