|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Firenze
Messaggi: 2906
|
[Assembly GAS IA32 - Linux]
Ciao,
Vorrei visualizzare a video il contenuto di un vettore di interi (o float, poco cambia) utilizzando la chiamata di sistema Linux 0x80 e le funzioni di libreria C tipo 'printf'. Usando la sintassi AT&T del GAS su SO Linux riesco a visualizzare correttamente nell'uno e nell'altro modo una stringa di testo, (ma mai uno o più elementi del vettore) come ad esempio (con riferimento alla system call 0x80): Codice:
.data msg1: .ascii "Messaggio iniziale\n" vect: .int 1,2,3,4,5,6,7,8,9,0 len1 = . - msg1 .text .globl main main: movl $4, %eax movl $1, %ebx movl $msg1, %ecx movl $len1, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80 Idee? Grazie D
__________________
Alla povertà mancano molte cose, all'avarizia tutte. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Nel tuo caso stai usando la syscall write che ovviamente non fa nessuna conversione da char a int o float e quindi si limita a visualizzarti semplicemente i codici ascii dei byte che compongono il vettore di int/float.
Puoi o implementare una funzione di conversione oppure utilizzare la printf della libc. L'unica funzione simile implementata nel kernel è printk, ma quella scrive sul file di log. P.S. c'è un motivo per cui non usi la libc e chiami direttamente il kernel? |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Firenze
Messaggi: 2906
|
No, a dire il vero non c'è un motivo particolare se non il fatto di voler confrontare le differenze tra le due chiamate e la quantità di codice incluso nell'eseguibile.
Non ho molta dimestichezza con l'ASM, ma per richiamare una funzione dalla libc e passare un parametro, ad esempio un intero, a quale documentazione devo far riferimento? man 3 printfnon mi è di grande aiuto... non riesco a trovar nulla sul passaggio di parametri Sarei molto grato se tu potessi indicarmi un segmento di codice in ASM che implementi detta chiamata Grazie!
__________________
Alla povertà mancano molte cose, all'avarizia tutte. Ultima modifica di DeltaDirac : 25-06-2010 alle 18:37. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
molto semplicemente fai una cosa del genere
Codice:
.section .data formato: .ascii "Valore parametro: %d\n\0" .section .text .globl _start _start: movq $20, %rax pushq %rax pushq $formato call printf add %rsp, $8 pushq $0 call exit mentre per il link userai ld -dynamic-linker /lib/ld-linux-x86-64.so.2 \ -o pippo pippo.o -lc ovviamente nella fase di linking con -lc gli dico di linkare pippo.o con la libc e gli passa pure il percorso del dynamic linker....in questo caso è ld-linux-x86-64.so.2 perchè sono su linux a 64 bit ovviamente pure nel codice ho usato pushq e popq perchè lo stack è allineato a 64 bit comunque si vede chiaramente che printf viene chiamata mettendo nello stack i parametri...il primo parametro è quello che in C si chiama fmt, gli altri sono i valori da passare ( nel mio caso un numero intero ) comunque ti consiglio di usare gcc con l'opzione -S in modo da trasformare i programmi in C in assembly....è molto utile per capire svariate cose infine mi sento di consigliarti l'ottimo ebook di Bartlett, Programming from the Ground Up riguardo la documentazione ovviamente usi il man senza problemi, solo che devi usare call nome-funzione perchè è così che funziona la chiamata in assembly e devi mettere i parametri sullo stack per passarli alla funzione |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2007
Città: Firenze
Messaggi: 2906
|
Grazie mille. Hai centrato la questione al primo colpo
Grazie anche della segnalazione sul testo. Ben vengano anche altri suggerimenti su altri validi testi di riferimento ! Bon, usando GAS IA-32 ho fatto così: Codice:
.section .data testo: .asciz "Valore parametro: %d\n" .section .text .globl _start _start: nop movl $20, %eax pushl %eax pushl $testo call printf addl $8, %esp pushl $0 call exit as -o prova.o prova.s ld -dynamic-linker /lib/ld-linux.so.2 -lc -o prova prova.o Ma la domanda è: se dovessi iterare su n valori, diciamo su un vettore del tipo: Codice:
vector: .int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
__________________
Alla povertà mancano molte cose, all'avarizia tutte. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
quoto cionci
del resto tu in c come faresti? for (i=0;i<n;i++) printf("%d", x[i]); alla fin fine si riduce tutto a fare n chiamate a printf |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:26.




















