Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用GNU assember执行系统调用时出现SEGFULT_Linux_Assembly_X86_System Calls_Gnu - Fatal编程技术网

Linux 使用GNU assember执行系统调用时出现SEGFULT

Linux 使用GNU assember执行系统调用时出现SEGFULT,linux,assembly,x86,system-calls,gnu,Linux,Assembly,X86,System Calls,Gnu,我试图理解为什么在程序集级别执行系统调用时,as的行为不同于nasm。因为我是个贪吃惩罚的人,所以我用的是英特尔语法。以下是我的节目: .intel_syntax noprefix .section .rodata .LC0: .string "Hello world!\n" .text .globl _start .type _start, @function _start: mov edx, 13 mov ecx,

我试图理解为什么在程序集级别执行系统调用时,
as
的行为不同于
nasm
。因为我是个贪吃惩罚的人,所以我用的是英特尔语法。以下是我的节目:

    .intel_syntax noprefix
    .section    .rodata
.LC0:
    .string "Hello world!\n"
    .text
    .globl  _start
    .type   _start, @function
_start:
    mov edx, 13
    mov ecx, OFFSET FLAT:.LC0
    mov eax, 4
    int 0x80
    ret
我用
as-o prog.o prog.s
组装并链接
ld-s-o prog.o

但当我运行它时,我得到:

$ ./prog 
Hello world!
Segmentation fault (core dumped)
GDB在这里不是特别有用。当我在
ret
上执行
stepi
时,它表示
无法访问地址0x1处的内存。这是令人费解的,因为
ESP
的值是:

(gdb) info registers esp
info registers esp
esp            0xbffff660       0xbffff660

为什么这个程序会出错?

因为它永远不会正确退出<代码>\u start
没有父堆栈帧,因此从它返回将导致崩溃


您可以从
main
返回标准库的
\u start
实现调用
exit
,但是如果您正在编写自己的
\u start
,您需要自己调用
exit
,因为没有父堆栈帧可返回。

,因为它永远不会正确退出<代码>\u start没有父堆栈帧,因此从它返回将导致崩溃


您可以从
main
返回标准库的
\u start
实现调用
exit
,但是如果您正在编写自己的
\u start
,您需要自己调用
exit
,因为没有父堆栈帧可返回。

您不能从程序中直接调用
ret
,您需要退出系统调用。
1
是恰好位于堆栈顶部的参数(
argc
)的数量,因此
ret
尝试将其用作地址,并产生明显的后果。您不能仅从程序中调用
ret
,您需要一个
exit
系统调用。
1
是恰好位于堆栈顶部的参数(
argc
)的数量,因此
ret
尝试将其用作地址,结果很明显。@DanBarowy大部分是复制的?我在冒险,这可能是问题所在。如果
ret
正在工作,那么
\u start
将不是入口点,
main
将是入口点。由于需要C运行时,链接它的方式也会有所不同。你主要是从书中的哪一页/哪一个例子中复制的?我最后的评论是一条现在看来已被删除的评论;-)@DanBarowy我会更进一步:那本书简直是垃圾,应该扔掉。它看起来像是为DOS程序员编写的,然后在最后一刻匆忙地适应了Linux。(许多Linux细节已经严重过时,因为这本书是在2000年出版的…)还有一个有趣的细节:
edlinas
,“排名第一的Linux x86动手汇编程序开发模拟器”(至少根据封面)实际上是一个QBasic程序,只能在DOS下运行。Yes@MichaelPetch和@Dashwuff,在我发表评论后,我意识到我已经用
\u start
替换了
main
,这导致了我意识到我是这里的白痴的一刻。所以我删除了评论。@DanBarowy大部分是复制的?我在冒险,这可能是问题所在。如果
ret
正在工作,那么
\u start
将不是入口点,
main
将是入口点。由于需要C运行时,链接它的方式也会有所不同。你主要是从书中的哪一页/哪一个例子中复制的?我最后的评论是一条现在看来已被删除的评论;-)@DanBarowy我会更进一步:那本书简直是垃圾,应该扔掉。它看起来像是为DOS程序员编写的,然后在最后一刻匆忙地适应了Linux。(许多Linux细节已经严重过时,因为这本书是在2000年出版的…)还有一个有趣的细节:
edlinas
,“排名第一的Linux x86动手汇编程序开发模拟器”(至少根据封面)实际上是一个QBasic程序,只能在DOS下运行。Yes@MichaelPetch和@Dashwuff,在我发表评论后,我意识到我已经用
\u start
替换了
main
,这导致了我意识到我是这里的白痴的一刻。所以我删除了评论。