$ cat foo.s
.code32
.section .data
output:
.asciz "The Value is %s\n"
values:
.int 10, 15, 20,25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl main
main:
movl $0, %edi
loop:
movl values(, %edi, 4), %eax
pushl %eax
pushl $output
call printf
addl $8, %esp
inc %edi
cmpl $11, %edi
jne loop
movl $0, %ebx
movl $1, %eax
int $0x80
如果我使用$ gcc -m32 -gstabs -ofoo foo.s编译它,该程序将是段错误的,当我在gdb中运行它时输出是:
编程接收信号SIGSEGV,分段故障。 来自/lib/i386-linux-gnu/libc.so.6的vfprintf()中的0xf7e56e29
答案 0 :(得分:1)
你的NUL终止字符串在哪里? %s
格式说明符需要伴随指向NUL终止字符串的指针。
如果你没有提供,printf
无论如何都会将堆栈上的数据视为指针,并在将非指针值视为指针时导致段错误。