Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
C++ 如何在x86程序集中将当前线程的堆栈指针更改为新线程_C++_C_Multithreading_Assembly_X86 - Fatal编程技术网

C++ 如何在x86程序集中将当前线程的堆栈指针更改为新线程

C++ 如何在x86程序集中将当前线程的堆栈指针更改为新线程,c++,c,multithreading,assembly,x86,C++,C,Multithreading,Assembly,X86,我正在尝试创建用户级线程库。我有一个函数叫做 void switch\u thread(tcb*currSp,tcb*newSp)在C中实现。tcb*currSp,tcb*newSp是当前线程和新线程的堆栈指针切换线程功能应在x86程序集中实现。 我的问题是如何在x86程序集中将堆栈指针当前线程更改为新线程 .text .global switch_thread switch_thread: mov 0x4(%esp), %eax #current thre

我正在尝试创建用户级线程库。我有一个函数叫做
void switch\u thread(tcb*currSp,tcb*newSp)
在C中实现。
tcb*currSp
tcb*newSp
是当前线程和新线程的堆栈指针<代码>切换线程功能应在x86程序集中实现。 我的问题是如何在x86程序集中将堆栈指针当前线程更改为新线程

    .text
    .global switch_thread
   switch_thread:
        mov 0x4(%esp), %eax #current thread
        mov 0x8(%esp), %ecx #new thread
            //no idea how to implement rest of it.
中的函数正是这样做的,这是您特别想要的。此功能在GLIBC中实现,可以在internet上的各个位置找到


随意查看程序集,它基本上恢复浮点上下文,然后恢复所有其他寄存器。

修改esp很简单。其他一切都很难。您需要帮助修改esp吗?看起来你已经知道怎么做了。或者你想在其他方面得到帮助吗?给我一个关于实现其余部分的提示。这里不是这样的。具体问题也是如此。@rcgldr:典型的想法是使用“阻塞”库函数作为非阻塞系统调用的包装器。还要注意,“进程内的线程优先级”可以工作,但“系统内的线程优先级”没有内核就不能工作。最后,为了在多个CPU下保持正常的行为,您需要将N个内核线程映射到M个用户线程,这最终是一个巨大的痛苦。既然您说这是一个学校项目:项目规则允许向外界寻求帮助吗?(想必你至少要相信在你的写作中有任何外部帮助。)设法使用longjmp来进行实际的堆栈切换。我重申,堆栈切换是您遇到的最小问题。