Die Unterschiede liegen in den Konventionen welche Programme für welche Dateiendungen verwendet werden. Die Endung .asm wird häufig für Dateien verwendet, die Code in Intel Syntax enthalten, und .s/.S wird für Dateien, die Code in AT&T Syntax enthalten. Das heißt in der Regel, dass NASM/MASM/TASM für .asm-Dateien und GAS aus den Binutils für .s-Dateien verwendet wird. Der Unterschied zwischen .s und .S ist häufig, dass in .S-Dateien die Präprozessorkonstrukte aus C wie z. B. #include, #define, etc. verwendet werden, und dementsprechend vorverarbeitet werden müssen. Das wird zum Beispiel von den default-Regeln in make so unterstützt, welcher dann den C-Compiler aufruft, der das Preprocessing durchführt und dann den Assembler aufruft. Wer eigene Regeln in die Makefile baut, alternative Assembler oder andere Einstellungen verwendet, muss sich natürlich nicht unbedingt an diese Konventionen halten. Am Ende kommt aber bei allen eine Objektdatei heraus, die vom Linker egal, woher sie kommt, gleich verarbeitet wird.