Avvicinarsi all'asm dal C |
|
|
07-01-2000 |
by "syscalo" |
|
|
Published by Quequero |
|
Qualche mio eventuale commento sul tutorial :))) |
||
UIC's form |
|
UIC's form |
Difficoltà |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
In questo brevissimo tutorial vi mostrerò la corrispondenza tra due costrutti fondamentali di tutti i linguaggi di programmazione ad alto livello (in questo caso il C), i cicli for e do/while, e la loro implementazione in assembler (ma visti da un disassemblato).
Introduzione |
Essay |
mov | di, 7 | inizializza a 7 sommaTemp |
lea | ax, [bp+nome] | copia in ax l'offset del nome | |
push | ax | passa l'indirizzo alla funzione | |
call | sub_0_2312 | chiama strlen | |
pop | cx | ||
mov | [bp+lun], ax | copia la lunghezza del nome in [bp+lun] - equivale a lun=valore_ritornato_da_strlen | |
cmp | [bp+lun], 4 | controlla se è 4 | |
jge | magUgu4 | se è maggiore o uguale salta |
magUgu4: | mov | si, 1 | i=1 - il registro si viene utilizzato per i cicli |
jmp | short avanti | salta ad avanti | |
ciclo_for: | mov | al, [bp+si+nome] | copia i chr del nome in al dal secondo - la scritta [bp+si+nome] sta ad indicare la locazione di memoria (la variabile) il cui indirizzo si ottiene sommando i valori di bp, si e nome. (nome come detto sopra l'ho sostituito io, ma in realtà rappresenta un offset numerico. |
cbw | converte il byte in al in dword in ax | ||
add | di, ax | sommaTemp+=nome[i] - ricordo che il registro di rappresenta la variabile sommaTemp | |
inc | si | i++ | |
avanti: | cmp | si, [bp+lun] | i<lun - confronta si (conteggio cicli) con la lunghezza del nome, memorizzata alla locazione il cui indirizzo è dato da bp+lun. |
jl | ciclo_for | se minore salta - esegue le istruzioni precedenti (il corpo del ciclo for) fino a che è verificata la condizione d'uscita. | |
lea | ax, [bp+lun] | num[lun-2]='s' - le seguenti 4 istruzioni servono a copiare il carattere s al posto del terzultimo del nome | |
mov | bx, [bp+lun] | ||
add | bx, ax | ||
mov | byte ptr [bx], 73h | copia 's' nel byte puntato da bx | |
xor | si, si | i=0 - inizializza il registro si a 0 | |
do_while: | mov | al, [bp+si+nome] | copia il chr del nome in al |
cbw | converte da byte in word in ax | ||
xor | di, ax | sommaTemp^=nome[i] - esegue lo xor tra il carattere del nome e sommaTemp, sovrascrivendo il registro di con il risultato dello xor | |
inc | si | i++ - incrementa si di 1 | |
cmp | [bp+si+nome], 73h | nome[i]!='s' - confronta il carattere del nome con il carattere s (codice ascii 73h) | |
jnz | do_while | se è diverso continua il ciclo - esegue il corpo del ciclo do/while | |
push | di | ||
prosegue con l'esecuzione del programma, quindi passerà al controllo finale e alla visualizzazione del messaggio seriale giusto o sbagliato |
Disclaimer |
Home
Anonimato Assembly
ContactMe CrackMe Links
NewBies News Forum Lezioni
Tools Tutorial Search