Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly $ebp+;8分配堆栈帧时,值发生变化_Assembly_X86_Abi - Fatal编程技术网

Assembly $ebp+;8分配堆栈帧时,值发生变化

Assembly $ebp+;8分配堆栈帧时,值发生变化,assembly,x86,abi,Assembly,X86,Abi,分配堆栈帧的子$0x10,%esp似乎更改了$ebp+8处的值。它从0x…018更改为0x…818 (gdb) disas Dump of assembler code for function place: 0x0804b019 <+0>: push %ebp 0x0804b01a <+1>: mov %esp,%ebp => 0x0804b01c <+3>: sub $0x10,%esp 0x0804b01f &l

分配堆栈帧的
子$0x10,%esp
似乎更改了
$ebp+8
处的值。它从
0x…018
更改为
0x…818

 (gdb) disas
Dump of assembler code for function place:
   0x0804b019 <+0>: push   %ebp
   0x0804b01a <+1>: mov    %esp,%ebp
=> 0x0804b01c <+3>: sub    $0x10,%esp
   0x0804b01f <+6>: mov    0x8(%ebp),%eax
   0x0804b022 <+9>: sub    $0x4,%eax
 (gdb) x $ebp+8
0xbfffed70: 0xb6a0c018
 (gdb) si
 (gdb) disas
   0x0804b019 <+0>: push   %ebp
   0x0804b01a <+1>: mov    %esp,%ebp
   0x0804b01c <+3>: sub    $0x10,%esp
=> 0x0804b01f <+6>: mov    0x8(%ebp),%eax
   0x0804b022 <+9>: sub    $0x4,%eax
   0x0804b025 <+12>:    mov    (%eax),%eax
 (gdb) x $ebp+8
0xbfffed70: 0xb6a0c818
 (gdb) x $esp
0xbfffed58: 0xb6a0c018
编辑2:显示奇怪行为的函数

static void place(void *bp, size_t asize)
{
    size_t csize = GET_SIZE(HDRP(bp));

    remove_free_block(bp);

    if ((csize - asize) >= (2 * DSIZE))
    {
        PUT(HDRP(bp), PACK(asize, 1));
        PUT(FTRP(bp), PACK(asize, 1));
        bp = NEXT_BLKP(bp);
        PUT(HDRP(bp), PACK(csize - asize, 0));
        PUT(FTRP(bp), PACK(csize - asize, 0));
    }
    else
    {
        PUT(HDRP(bp), PACK(csize, 1));
        PUT(FTRP(bp), PACK(csize, 1));
    }
}

请删除c标记,这与c无关(即使程序集源于c源文件)。请添加
display/I$eip
以显示正在执行的指令并重新执行。请声明程序不是多线程的。可能有一个线程运行异常并更改该值。在这里工作正常,它不会更改。两次进入
place()
然后进入segfaults:)挂起?世界跆拳道联盟?很清楚OP在问什么,但不是什么原因。
static void place(void *bp, size_t asize)
{
    size_t csize = GET_SIZE(HDRP(bp));

    remove_free_block(bp);

    if ((csize - asize) >= (2 * DSIZE))
    {
        PUT(HDRP(bp), PACK(asize, 1));
        PUT(FTRP(bp), PACK(asize, 1));
        bp = NEXT_BLKP(bp);
        PUT(HDRP(bp), PACK(csize - asize, 0));
        PUT(FTRP(bp), PACK(csize - asize, 0));
    }
    else
    {
        PUT(HDRP(bp), PACK(csize, 1));
        PUT(FTRP(bp), PACK(csize, 1));
    }
}