PDA

View Full Version : [Assembly] passare da funzione C a Assembly?


Tab7
13-10-2010, 12:20
Salve,
sto studiando Assembly, in riferimento ai processore ARM e NIOS II e non sto capendo come fare a passare da una C a Assembly, cioè se ho una funziona scritta in C, vorrei sapere come trascriverla in Assembly e viceversa.
Avete qualche guida da consigliarmi?
Grazie.

Teo@Unix
13-10-2010, 12:40
guarda, a mio parere il miglio metodo è partire dalle istruzioni in C che ti interessano e disassemblarle per prendere spunto dal metodo utilizzato dal tuo compilatore, un piccolo esempio su Linux:
root@matteo2:~# cat hello.c
#include <stdio.h>

int main(void) {
printf("Hello world!\n");
}
root@matteo2:~# gcc -static -g hello.c
root@matteo2:~# gdb a.out -q
Reading symbols from /root/a.out...done.
(gdb) disass main
Dump of assembler code for function main:
0x08048250 <+0>: push %ebp
0x08048251 <+1>: mov %esp,%ebp
0x08048253 <+3>: and $0xfffffff0,%esp
0x08048256 <+6>: sub $0x10,%esp
0x08048259 <+9>: movl $0x80a7708,(%esp)
0x08048260 <+16>: call 0x8048d50 <puts>
0x08048265 <+21>: leave
0x08048266 <+22>: ret
End of assembler dump.


e avendo compilato staticamente puoi disassemblare anche puts()...

Tab7
13-10-2010, 18:27
Ciao teo@unix,
il mio problema è proprio questo: disassemblare le funzioni.
Sono agli inizi con assembler, e non ho trovato nessun valido tutorial o guida su cui studiare.
Perciò sono alla ricerca di fonti, guide e quant'altro possa servirmi per capire queste problematiche (disassemblaggio/assemblaggio) di assembly.

Teo@Unix
13-10-2010, 19:53
ok, ma il tuo obiettivo è studiare il linguaggio assembly oppure capire un listato di disassemblato? Certo che il secondo presuppone un minimo di conoscenze del primo.... però le due cose sono diverse.
Ad esempio io spesso vado a vedere come le funzioni lavorano disassemblando, ma non so se riuscirei a scrivere un intero programma in assembly ora come ora.

La pratica di disassemblare i programmi per capire come funzionano è un pò ostica e richiede molto tempo ma non è impossibile.

La programmazione in assembly diventa sepre più rara a favore del C e riguarda solitamente i microcontrollori, mentre l'attività di reversing del codice viene di solito fatta per indagare sulla sicurezza dei programmi ecc...

Tab7
14-10-2010, 14:02
In pratica io sto studiando assembly orientaro ai processori NIOS II e ARM, ma son ancora agli inizi.
Il problema è che, come dicevo, dovrei riuscire a passare da una semplice funzione C al suo equivalente in assembly.
Intendo dire una semplice funzione C, come una funzione che calcola il MAX tra due numeri, o roba simile.

Teo@Unix
14-10-2010, 14:34
a ho capito, ok allora nel caso di ARM le istruzioni generate sono assai diverse da quelle dell'esempio.
Non mi intendo di architettura ARM, però a questo punto puoi iniziare da qui per quanto riguarda le istruzioni assembly:
http://www.shell-storm.org/papers/files/664.pdf

Ma mi viene spontaneo chiedermi/ti solitamente non si usano linguaggi di livello più elevato su ARM? Che io sappia si usa come minimo il C. Come mai mi chiedi dell'assmbly?

Tab7
14-10-2010, 15:22
Perchè principalmente sto studiando Assembly con seti di istruzioni per NIOS II e ARM e in piu dovrei sapere scrivere una funziona C data, nel rispettivo set di istruzioni assembly, sia in NIOS che in ARM.

Teo@Unix
14-10-2010, 15:39
per ARM ci sono anche questi:
http://www.ebook3000.com/ARM-Architecture-Reference-Manual_2343.html