Quand tu développes, tu utilises des langages compréhensibles pour les humains (le code machine, cela reste un peu rugueux à manipuler). Ensuite tu utilises un compilateur pour convertir cet écrit compréhensible en code machine, suivant les règles propres au système et au processeur sur lequel cela doit être exécuté.
Le code binaire, c'est tout ce qui n'est pas du texte et, dans le cas présent, il s'agit de code que la machine saura exécuter.
Ici, quand tu développes en assembleur, tu écris un fichier texte dans lequel tu mets des instructions propres au processeur sur lequel ton programme tournera. Tu dois aussi tenir compte du système sur lequel il tournera car entre deux systèmes les méthodes d'appel ne sont pas identiques.
Ensuite tu utilises l'assembleur (le programme, par exemple
nasm ou
casm) pour faire la traduction en code machine. Dans ton cas, tu risques fort de devoir compiler une première fois pour produire un fichier exécutable pour Windows et une seconde pour un fichier exécutable pour macOS.
Si tu vas sur la page de
nasm sur Wikipedia, tu verras par exemple comment écrire un programme
Hello World! avec
nasm pour les différents systèmes.