我正在编写一个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个字符。逐行处理输入是问题的一部分,所以我想我一开始就把它一次放在一行,但显然这很难做到。