就%ebp进行强制堆叠会导致段错误

时间:2019-05-22 05:27:38

标签: assembly x86

我想使用变量iIndex打印存储在堆栈中的值,这意味着存储在堆栈中的元素数。堆栈中存储的所有值都是整数,而iIndex的值是-4,-8,-12 ...依元素数而定。但是,我在第一个循环的pushl iIndex(%ebp)遇到段错误,我不知道为什么会发生这种情况。 (iIndex以4个字节存储在bss部分中)

if_f:
    cmpl    $0, iIndex
    je  error1
    movl    iIndex, %ecx    
f_loop:
    pushl   iIndex(%ebp)
    pushl   $resultFormat
    call    printf
    addl    $8, %esp
    addl    $4, iIndex
    cmpl    $0, iIndex
    je  f_loopend
    jmp f_loop
f_loopend:          #need to restore iIndex
    movl    %ecx, iIndex
    jmp input

例如,我将值1和2连续存储在堆栈中,并使用GDB显示iIndex为-8。

f_loop () at sand.s:201
201     pushl   iIndex(%ebp)
(gdb) x/d &iIndex
0x5655701d: -8
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
f_loop () at sand.s:201

eax            0x0  0
ecx            0xfffffff8   -8
edx            0x66 102
ebx            0x0  0
esp            0xffffd1c0   0xffffd1c0
ebp            0xffffd1c8   0xffffd1c8
esi            0xf7fb5000   -134524928
edi            0x0  0
eip            0x56555858   0x56555858 <f_loop>
eflags         0x10282  [ SF IF RF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x63 99

感谢您的帮助!

0 个答案:

没有答案