Assembly 我可以按每个核心编写汇编代码吗?

Assembly 我可以按每个核心编写汇编代码吗?,assembly,x86,intel,masm,Assembly,X86,Intel,Masm,有人愿意演示英特尔汇编代码如何表示不同内核所处理的不同线程吗?我想每个线程/核心没有一个程序集文件 编辑:让我重写一下:如果我想在不同的CPU内核上编写汇编程序,我可以控制X内核上发生的事情以及每个内核之间的通信吗(就像可以控制内核上的寄存器值一样)?这一切都取决于您的体系结构--Windows?Linux?苹果操作系统?一般来说,线程将由您的操作系统管理,就像在更高级的语言中一样。从代码的角度来看,您需要要求操作系统使用与C中相同的API创建线程 基本上,创建线程是您要求主机操作系统执行的操作

有人愿意演示英特尔汇编代码如何表示不同内核所处理的不同线程吗?我想每个线程/核心没有一个程序集文件


编辑:让我重写一下:如果我想在不同的CPU内核上编写汇编程序,我可以控制X内核上发生的事情以及每个内核之间的通信吗(就像可以控制内核上的寄存器值一样)?这一切都取决于您的体系结构--Windows?Linux?苹果操作系统?一般来说,线程将由您的操作系统管理,就像在更高级的语言中一样。从代码的角度来看,您需要要求操作系统使用与C中相同的API创建线程


基本上,创建线程是您要求主机操作系统执行的操作,无论您是在编写C、汇编、C#、Objective-C还是其他任何代码,这都是相同的基本概念。

在汇编级别,线程看起来就像其他任何代码一样。某些指令具有在线程上下文中有用的语义,例如LOCK CMPXCHG,它执行原子比较和交换。但一般来说,线程是通过操作系统调用创建和管理的,您通常看不到“管道”。您只需将其中一个函数传递给线程创建API,它就开始与当前代码并行执行(或交叉执行)。剩下的就看你了


在操作系统中,线程是通过旋转堆栈和其他寄存器来实现的,以响应计时器中断。没有“创建线程”操作码,因为它是MASM,所以我猜您使用的是Windows。您可以调用传递线程启动过程的地址(以及其他内容)

一些相关职位:

更新

你仍然局限于操作系统给你的东西。例如,您可以拨打或。正如Marcelo Cantos和Hans Passant所指出的,线程是由操作系统实现的,而不是由CPU实现的,因此您需要与操作系统对话


我不相信英特尔处理器有一种在它们之间传递消息的机制(除了非常低级和自动的东西,比如缓存一致性)。

所以你想在没有操作系统帮助的情况下启动线程

在最近的英特尔处理器上,您确实可以通过ACPI函数启动第二个内核。该函数向暂停的逻辑处理器发出IPI(处理器间中断),然后在指定为IPI一部分的地址开始执行代码(新线程)

如果你真的想看到血淋淋的细节,举个例子

英特尔®64和IA-32体系结构中提供了更多详细信息和文档
软件开发人员手册第3卷(系统编程指南),第8.6章。由于Intel不断随机更改链接,您最好通过google找到它。

是的,您可以。您需要编写自己的操作系统,以实现绝对控制。这是操作系统功能的一部分,它向您公开的功能量因操作系统而异。

线程是操作系统的概念。它与汇编代码无关。“启动一个线程”没有机器代码指令,它需要一个操作系统调用。我更改了标题,以更准确地反映我所要求的高度相关的内容:有一个裸机代码示例,用于在x86 PC上启动多个内核。当您这样做时,可以让不同的内核运行不同的代码,与在操作系统下启动线程并为每个线程指定函数+数据参数时相同。您可能应该更改有关
CMPXCHG
的措辞,在涉及线程时使用原子操作不同于单指令多操作操作码。在线程情况下,总线需要
LOCK
前缀locking@Necrolis:谢谢你指出这一点。我添加了前缀;这是一个足够的修正吗?当然,你不局限于操作系统所提供的。你可以自己做,或者你认为操作系统一开始是如何启动线程的?@drhirsch:是的,你可以创建协同路由、Erlang风格的轻量级线程等。但它们不是通常意义上由操作系统调度的线程。另外,你不能让你的一个假装线程在不同的处理器上运行,这是OP的问题所在。我不是指协同程序或轻量级线程。您可以完全省略操作系统,编写自己的启动程序,只需在每个处理器上启动一些例程,比如BareMetalOS()。我以为OP想知道怎么做,但他的问题不是很清楚。回答得好,投了赞成票。不过,问题的措辞并没有明确说明OP是在现有操作系统下工作,还是打算创建一个新的操作系统。在前一种情况下,所有这些都不起作用——操作系统不允许从userland程序中使用它。