不在集会中工作

时间:2014-04-20 13:28:58

标签: assembly return

我正在为我的作业编写一个程序并且几乎已经完成了它。但它不起作用。 为简单起见,我将仅显示相关部分。但如果还不够,我会发布整个代码。

我的程序的这一部分是:

  1. 将当前寄存器集保存在堆栈中。
  2. 将当前堆栈指针保存在作为参数提供的地址中。
  3. 恢复作为参数给出的堆栈指针。
  4. 恢复先前保存在新堆栈中的寄存器集
  5. 从堆栈的最后一个返回地址开始执行。
  6. 以下是代码:

        .file   "switchv0.s"
        .text
        .globl  machine_switch
        .type   machine_switch, @function
    machine_switch:
        pushq   %rbx   #save registers
        pushq   %rbp
        pushq   %r12
        pushq   %r13
        pushq   %r14
        pushq   %r15
        movq    %rsp,(%rsi) #rsi contains the address to the structure where the sp should be saved
        movq    %rdi,%rsp   # restore the new stack pointer
        popq    %rbx # restore saved registers
        popq    %rbp
        popq    %r12
        popq    %r13
        popq    %r14
        popq    %r15    
        ret # off we go.
    

    我开始使用GDB进行调试,在这里我发现了一个问题。

    machine_switch () at switchv0.s:20
    20      ret
    (gdb) x $rsp
    0x603008:   0x00400644
    (gdb) s
    Cannot access memory at address 0x8
    

    如你所见,在调用ret之前,sp的值是0x00400644,这是

     0x603008:    0x00400644  <thread1+57>
    

    根据我之前发现的信息 - 在某个函数内部。

    根据我所知道的

     ret = jmp (%rsp)
    

    如果它按照那样工作。然后它应该到这个thread1函数内的某个地方。 但相反,它试图去一些0x8的地方。

    我错过了什么?我不知道这里有什么? 请帮忙

    提前致谢。

0 个答案:

没有答案