为什么scanf,getline和我的ASM程序中的所有功能都出错?

时间:2017-04-24 09:32:18

标签: linux assembly x86 nasm glibc

我正在编写一个x86程序集项目,我需要从stdout迭代换行符分隔的字符串。

所以我试过这个:

section .bss
    buffsize equ 255
    buff resb buffsize
    incount resd 1

section .text
    global _start
    extern getline
    extern stdin
    extern printf   
_start:
mov ebp, esp
push buff       ;getline expects a pointer to an array (a double pointer)
                ;so we need a spot to put the address of our buffer so we can push THAT address.
push stdin      ;stdin
push incount
push ebp
call getline

mov byte [buff + 254], 0

push buff
call printf

......但无论我做了什么,这都给了我段错误。所以我尝试了这个:

section .bss
    buffsize equ 255
    buff resb buffsize
    incount resd 1

section .text
    global _start
    extern fgets
    extern stdin
    extern printf

_start:
    push stdin
    push buffsize
    push buff
    call fgets  

    push buff
    call printf

......但这也给了我段错误。所以我尝试了这个:

section .bss
    buffsize equ 255
    buff resb buffsize
    incount resd 1

section .data
    linescan db "%254[^\n]", 0x00
    lineheader db "%i       ", 0x00

section .text
    global _start
    extern scanf
    extern getchar
    extern stdin
    extern printf

_start:
    push buff
    push linescan
    call scanf
    call getchar    ;clean up the dangling newline

    push buff
    call printf

它DIDN' T给我段错误! (所有这些printf-ed buff和你的常规"干净地终止"系统跟随他们顺便说一句)

虽然它没有用。它接受一行输入,然后静默终止......除非它在GDB中运行,在这种情况下它接受更多然后静默终止,即使它肯定进入printf

所以,呃......我做错了什么?我需要接受来自stdin的任意长度输入和规范状态,我需要一次取255个字符。逐行处理输入是问题的一部分,所以我想我一开始就把它一次放在一行,但显然这很难做到。

0 个答案:

没有答案