【发布时间】:2018-12-13 20:50:33
【问题描述】:
当我运行程序时,我遇到了分段错误。该程序包含两个数字之间的简单相加,将值存储在变量中,然后通过系统调用将其打印出来。
这是我调用它的代码:
section .bss
res: resq 1
fout: resq 1
section .data
msg dq 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
filename dq 'hello.txt'
section .text
global _start: ;must be declared for linker (ld)
_start: ;tells linker entry point
mov rcx,5
mov rdx,4
call sum
mov [res],rax
mov rdx,1 ;message length
mov rcx,res ;message to write
mov rbx,1 ;file descriptor (stdout)
mov rax,4 ;system call number (sys_write)
syscall ;call kernel
mov rax,1 ;system call number (sys_exit)
syscall ;call kernel
sum:
mov rax,rcx
add rax,rdx
add rax,'0'
ret
调试信息:
(gdb) n
sum () at Hello.asm:41
41 mov rax,rcx
(gdb) n
42 add rax,rdx
(gdb) n
43 add rax,'0'
(gdb) n
sum () at Hello.asm:44
44 ret
(gdb) n
0x0000000000000001 in ?? ()
(gdb) n
No se pueden encontrar límites en la función actual
(gdb) quit
结果是分段错误。
【问题讨论】:
-
在“我调用它的代码”中
call sum之后会发生什么?调试器表明代码在那里崩溃了。 -
我存储值并进行系统调用以打印结果。
-
请发布该代码。如果您发布整个程序或任何其他形式的minimal reproducible example,那么您最好通过在他们自己的计算机上运行您的代码来了解问题所在。
-
我把代码放了。