Domanda per esperti di ASM...
Mi sto ristudiando da zero il linguaggio assembly, per ora ho visto che esistono due "formati" per scrivere le istruzioni ovvero la sintassi Intel (che dovrebbe essere la più usata) e la sintassi AT&T.
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?
Per il momento sto facendo delle prove su windows tramite dosbox e TASM anche se sto guardando diversi pdf e ognuno scrive i programmi in maniera differente e questo mi manda un po' fuoristrada.
Ad esempio per scrivere un banale hello world a schermo ho trovato queste sintassi diverse:
Questa è quella che sto usando nelle prove con TASM
questi invece sono altri due esempi del solito programma:
A prima vista ho notato che cambiano i codici per eseguire il solito interrupt (forse per l'architettura hw diversa?)
mi sarebbe molto d'aiuto capire le differenze tra questi codici per chiarirmi meglio le idee.
Grazie per l'aiuto!
Mi sto ristudiando da zero il linguaggio assembly, per ora ho visto che esistono due "formati" per scrivere le istruzioni ovvero la sintassi Intel (che dovrebbe essere la più usata) e la sintassi AT&T.
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?
Per il momento sto facendo delle prove su windows tramite dosbox e TASM anche se sto guardando diversi pdf e ognuno scrive i programmi in maniera differente e questo mi manda un po' fuoristrada.
Ad esempio per scrivere un banale hello world a schermo ho trovato queste sintassi diverse:
Questa è quella che sto usando nelle prove con TASM
Codice:
DATA SEGMENT PUBLIC
FRASE DB "Hello World!",10,13,'$' ;FRASE = ETICHETTA
DATA ENDS ; fine segmento dati
CODE SEGMENT ;codice vero e proprio del programma
ASSUME CS:CODE,DS:DATA ;si associa l'etichetta al segmento
INIZIO: ;inizio del programma
;caricamento dei dati
MOV AX,DATA
MOV DS,AX
MOV AH,09H ;richiesta di stampa della frase
MOV DX, OFFSET FRASE ;caricamento offset della frase da stamparare (passo l'indirizzo della frase a DX)
INT 21H ;interrupt per la stampa
;chiusura
MOV AH,4CH ;richiesta di chiusura del programma
INT 21H ;interrupt per chiudere il programma
CODE ENDS ;fine del segmento codice
END INIZIO ; fine del programma
Codice:
hello: DB "Hello World" ; store string
; actual entry point of the program, must be present
start:
MOV AH, 0x13 ; move BIOS interrupt number in AH
MOV CX, 11 ; move length of string in cx
MOV BX, 0 ; mov 0 to bx, so we can move it to es
MOV ES, BX ; move segment start of string to es, 0
MOV BP, OFFSET hello ; move start offset of string in bp
MOV DL, 0 ; start writing from col 0
int 0x10 ; BIOS interrupt
Codice:
segment .text ;code segment
global _start ;must be declared for linker
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
segment .data ;data segment
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
A prima vista ho notato che cambiano i codici per eseguire il solito interrupt (forse per l'architettura hw diversa?)
mi sarebbe molto d'aiuto capire le differenze tra questi codici per chiarirmi meglio le idee.
Grazie per l'aiuto!