我正在为我的作业编写一个程序并且几乎已经完成了它。但它不起作用。 为简单起见,我将仅显示相关部分。但如果还不够,我会发布整个代码。
我的程序的这一部分是:
以下是代码:
.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的地方。
我错过了什么?我不知道这里有什么? 请帮忙
提前致谢。