Довольно легко создавать потоки в NASM с помощью pthreads, но настройка маски сходства - это другой вопрос. Оказалось, что нет необходимости воспроизводить непрозрачные типы для использования на ассемблере, что было бы очень сложно.
Вместо этого я скомпилировал программу C в объектный файл и связал этот объектный файл с Объектный файл NASM для создания окончательного исполняемого файла. Функция main () в C получила другое имя, потому что ее нельзя скомпилировать в .exe, а на имя этой функции в программе NASM указано «extern». Вот последний C код:
#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
extern void * Test_fn();
int thread_create_in_C() {
int numberOfProcessors = sysconf(_SC_NPROCESSORS_ONLN);
if (numberOfProcessors >= 2){ // e.g. virtual cores
numberOfProcessors = numberOfProcessors / 2; }
printf("Number of processors: %d\n", numberOfProcessors);
pthread_t threads[numberOfProcessors];
pthread_attr_t attr;
cpu_set_t cpus;
pthread_attr_init(&attr);
for (int i = 0; i < numberOfProcessors; i++) {
CPU_ZERO(&cpus);
CPU_SET(i, &cpus);
printf("Core created %d\n", i);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);
pthread_create(&threads[i], &attr, Test_fn, NULL);
}
for (int i = 0; i < numberOfProcessors; i++) {
pthread_join(threads[i], NULL);
printf("Core joined %d\n", i);
}
return numberOfProcessors;
}
В коде NASM у нас есть директива extern thread_create_in_ C с другими внешними элементами, которая ссылается на код C, а в C код, который у нас есть extern void * Test_fn (); для ссылки на функцию NASM, вызываемую каждым потоком.
Мы вызываем программу C в соответствующую точку в программе NASM с:
call thread_create_in_C wrt ..plt
Я советую всем, кому нужно установить маски сходства для потоков на ассемблере, использовать C программа, подобная приведенной выше, вместо того, чтобы пытаться копировать ее в сборке. Но для простого создания потока без масок соответствия библиотека pthreads - это все, что вам нужно.