【发布时间】:2012-10-14 16:23:44
【问题描述】:
我正在尝试学习汇编,并发现在尝试从堆栈中推送/弹出数据时,我不断收到段错误。我已经阅读了一些指南并且知道堆栈是如何工作的以及如何使用堆栈;但不知道为什么我总是收到错误。
有人可以帮忙吗?
segment .data
myvar: db "hello world", 0xA0, 0
myvarL: equ $-myvar
segment .text
global _start
_start:
push ebp
mov ebp, esp
push myvarL
push myvar
call _hworld
mov eax, 1
mov ebx, 0
int 0x80
_hworld:
mov eax, 4
mov ebx, 1
mov ecx, [ebp+4]
mov edx, [ebp+8]
pop ebp
int 0x80
ret
我假设 +4 是 32 位,那么 +8 是 64 位。我不太清楚为什么在我读过的一些指南上会这样做。我会假设myvar 是 13 个字节?
这是错误:
$ ./pushpop
Segmentation fault
【问题讨论】:
-
你确定你先调用 _hworld 然后再运行它吗?即你的程序的 exit() 在哪里?
-
4/8 的事情可能是由于堆栈对齐。我认为我说得对,一般来说,堆栈指针与机器字长保持对齐。所以只会在 32 或 64 位块中移动。