linux nasm x64 fscanf

时间:2015-01-26 23:41:03

标签: assembly 64-bit nasm x86-64

我是NASM和大会的新手。我试图从nasm调用fscanf,它失败了..请告诉我,我在哪里弄错了? (我使用的是ubuntu 14.04和Intel处理器)

            extern  fscanf
            extern  fopen

            SECTION .bss
n:          resq    1
fi:         resq    1

            SECTION .data
input1:     db "%d", 0
fi_name:    db "input.txt", 0
mode_read:  db "r", 0

            SECTION .text

            global main
main:
        push    rbp

        mov rdi, fi_name
        mov rsi, mode_read
        call fopen
        mov qword [fi], rax

        ;fscanf(fi, input1, var)
        mov rdi, fi
        mov rsi, input1
        mov rdx, n
        call fscanf     ;<---program dies here

        pop     rbp
        ret

1 个答案:

答案 0 :(得分:2)

在我看来,您几乎是对的。我注意到的唯一问题是您需要在调用 fi 之前将 fscanf 括起来。事实上,我添加了以下几行:

extern printf ; at top
fmt: db "Result: %d", 10, 0 ; in .data

; following the fscanf call
mov rdi, fmt
mov rsi, [n] ; the integer parsed
xor eax, eax ; required by printf
call printf

这会成功扫描并打印 input.txt 中的单个整数。

将您的代码更改为以下内容:

;fscanf(fi, input1, var)
mov rdi, [fi]             ; <- Needs square brackets to derefrence.
mov rsi, input1
mov rdx, n
call fscanf