【发布时间】:2020-05-21 18:02:43
【问题描述】:
我刚开始学习 intel att 汇编,遇到了下一个问题:当我尝试使用访问堆栈时出现段错误。我确实间接访问了内存位置,但是当我尝试使用堆栈这样做时,我得到了段错误。我的系统是:
Linux cat 4.19.36 #1-NixOS SMP Sat Apr 20 07:16:05 UTC 2019 x86_64 GNU/Linux
我使用气体编译器:
as -gfstab -o a.o a.s
ld -o a.out a.o
这是我的小代码示例:
.code64
.globl _start
.text
_start:
movl (%esp) , %eax
xor %eax , %eax
inc %eax
int $0x80
程序已编译并链接,但当我尝试启动它时,我得到了:
as -gfstab -o a.o a.s
ld -o a.out a.o
./a.out
make: *** [makefile:4: new] Segmentation fault
我使用 gdb 来解决这个问题。间接访问堆栈给了我下一个结果:
6 movl (%esp) , %eax
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
_start () at a.s:6
6 movl (%esp) , %eax
我从互联网上拿了这个例子,他们说这是做事的方式。我做错了什么? TNX
【问题讨论】:
-
您创建了一个 64 位程序,但尝试使用 32 位地址。要么制作一个 32 位程序,要么重写代码以使用 64 位地址。
-
谢谢!我只用 rax 和 rsp 重写它,它现在可以工作了! tnx