Non sono l'esperto che stai cercando, però provo a risponderti comunque.
Il secondo esempio usa 0x10 e il tuo commento dice che si tratta del BIOS interrupt. In realtà, al giorno d'oggi, i primi 32 interrupts sono riservati per le eccezioni (info) quindi non può essere il BIOS interrupt. Il codice non è sbagliato, ma è pensato essere eseguito in real mode. In parole semplici real mode vuol dire "prima del 1982" e protected mode vuol dire "dopo il 1982". Per questioni di retrocompatibilità, quando accendi il tuo computer la tua CPU x86_64 parte come se fosse nata nel 1978 e tu gli devi abilitare (tramite assembly) tutte le menate che gli servono per fargli capire che in realtà siamo nel 2023 e il mondo ormai è cambiato.
Se vuoi più info su come sono gestite le syscall, ti rimando a questo thread dove mi ero messo a cercare anche l'implementazione delle varie funzionalità all'interno del kernel Linux.
Scegli un'architettura e impara la sintassi che ti sembra più comprensibile, tanto sono tutte equivalenti. Da quanto ne so la gente tende a preferire la sintassi Intel (e.g., NASM), ma tieni conto che non sono in tanti a programmare direttamente in assembly. Generalmente è più importante saperlo leggere che saperlo scrivere, e il più delle volte il codice che andrai a leggere è comunque troppo lungo e intricato per essere studiato riga per riga e te la caverai usando un buon debugger e un po' di intuito. Il discorso è un po' diverso se ti addentri in settori particolari; per esempio, se vuoi diventare bravo con gli shellcodes.Poi ogni architettura ha la sua sintassi specifica e vorrei approfondire questo discorso, per esempio le istruzioni sono leggermente diverse tra i compilatori TASM, MASM NASM... Su quale variante di assembly conviene imparare per capire tutte le varianti? qual è la più diffusa?
Non dipende solo dall'architettura, ma anche dal sistema operativo. In Linux il system call interrupt è mappato su 0x80, ma se ti scrivi un sistema operativo tutto tuo puoi scegliere anche un altro numero. In Windows mi pare di aver capito che questa cosa di usare direttamente l'istruzioneA prima vista ho notato che cambiano i codici per eseguire il solito interrupt (forse per l'architettura hw diversa?)
int
sia sconsigliato in quanto è tutta roba non documentata (e, potenzialmente [anche se improbabile], soggetta a cambiamenti). In DOS il system call interrupt è mappato su 0x21, ed ecco spiegato perché il tuoi primo esempio è diverso dal tuo terzo esempio. In ogni caso, è meglio usare l'istruzione syscall
.Il secondo esempio usa 0x10 e il tuo commento dice che si tratta del BIOS interrupt. In realtà, al giorno d'oggi, i primi 32 interrupts sono riservati per le eccezioni (info) quindi non può essere il BIOS interrupt. Il codice non è sbagliato, ma è pensato essere eseguito in real mode. In parole semplici real mode vuol dire "prima del 1982" e protected mode vuol dire "dopo il 1982". Per questioni di retrocompatibilità, quando accendi il tuo computer la tua CPU x86_64 parte come se fosse nata nel 1978 e tu gli devi abilitare (tramite assembly) tutte le menate che gli servono per fargli capire che in realtà siamo nel 2023 e il mondo ormai è cambiato.
Se vuoi più info su come sono gestite le syscall, ti rimando a questo thread dove mi ero messo a cercare anche l'implementazione delle varie funzionalità all'interno del kernel Linux.