Если вы говорите о пространстве пользователя, так же, как вы делаете это, например, C. То есть, вы вызываете pthread_create () (или какой-либо другой API-интерфейс «создать новый поток» в вашей ОС) с соответствующими аргументами (включая адрес «основной» функции нового потока) и все готово.
Если вы говорите об уровне «без костей» без операционной системы, чтобы помочь вам, то вы выделите блок памяти (из ранее выделенного распределителя памяти) для стека вашего нового потока, установите периодический таймер отметьте, что запускает (ваш ранее написанный) код планировщика, который сохраняет содержимое регистра и переключается между стеками потоков и т. д.
Что делать с ASM вместо C? Ну, за исключением гораздо большего количества пота и слез, в основном то же самое.