【发布时间】:2017-11-07 23:51:04
【问题描述】:
我试图理解为什么as 在汇编级别进行系统调用时的行为与nasm 不同。因为我喜欢惩罚,所以我使用的是 Intel 语法。这是我的程序:
.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 prog.o 链接。
但是当我运行它时,我得到:
$ ./prog
Hello world!
Segmentation fault (core dumped)
GDB 在这里并不是特别有用。当我在ret 上stepi 时,它会显示Cannot access memory at address 0x1。令人费解的是,ESP 的值是:
(gdb) info registers esp
info registers esp
esp 0xbffff660 0xbffff660
为什么这个程序会出现段错误?
【问题讨论】:
-
你不能只在你的程序中使用
ret,你需要一个exit系统调用。1是恰好位于堆栈顶部的参数 (argc) 的数量,因此ret尝试将其用作具有明显后果的地址。
标签: linux assembly x86 system-calls gnu