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

标签 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 

最佳答案

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

关于linux - nasm x86 初学者使用 C 调用 - printf scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921373/

相关文章:

linux - 使用 dlopen 在 armhf 系统上加载 arm 共享对象

linux -/sys/class/net/<interface>/type值的含义

assembly - 理解 cmp 指令

c - 当文件作为指向数组的指针读入时,如何打印文件名?

c - 为什么 getchar 调用 printf 停止工作?

C: 使用 sprintf( ) 做 IP 地址解析,不正确的值

c - 意外的 getnameinfo() 主机名

linux - 试图捕获 Linux 机器上的所有内存读/写

multithreading - x86_64 CPU 是否使用相同的缓存线通过共享内存在两个进程之间进行通信?

assembly - 为什么BSD系统在执行系统调用时需要sub esp,4?