Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Somma e stampa in ASM AT&T
Forum - Altri Linguaggi - Somma e stampa in ASM AT&T

Avatar
fabi3194 (Ex-Member)
Expert


Messaggi: 206
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 20:30
Martedì, 03/11/2009
Salve a tutti...rieccomi sul sito :asd:
Stavo facendo un piccolo programmino in asm at&t...poichè non vedo l'utilità di postare l'intero source, posto solo il vero e proprio problema. In pratica dovrei copiare z in ecx e incrementare il suo valore di 1, quindi stamparla a video
Codice sorgente - presumibilmente Altri Linguaggi

  1. .data
  2. .text
  3. .global main
  4. z: .long 1
  5.  
  6. main:
  7.         mov $z,%ecx  #sposto z in ecx
  8.         add $1,%ecx  #aggiungo 1 a ecx
  9.         mov $4,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
  10.         mov $1,%ebx  #1, standart output
  11.         mov $1,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
  12.         int $0x80    #Chiamo l'interrupt
  13.  
  14.         mov $1,%eax  #funzione exit(time)
  15.         mov $0,%ebx  #passo il parametro time
  16.         int $0x80    #Chiamo l'interrupt


Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :D

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:01
Martedì, 03/11/2009
Testo quotato

Postato originariamente da fabi3194:

Salve a tutti...rieccomi sul sito :asd:
Stavo facendo un piccolo programmino in asm at&t...poichè non vedo l'utilità di postare l'intero source, posto solo il vero e proprio problema. In pratica dovrei copiare z in ecx e incrementare il suo valore di 1, quindi stamparla a video
Codice sorgente - presumibilmente Altri Linguaggi

  1. .data
  2. .text
  3. .global main
  4. z: .long 1
  5.  
  6. main:
  7.         mov $z,%ecx  #sposto z in ecx
  8.         add $1,%ecx  #aggiungo 1 a ecx
  9.         mov $4,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
  10.         mov $1,%ebx  #1, standart output
  11.         mov $1,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
  12.         int $0x80    #Chiamo l'interrupt
  13.  
  14.         mov $1,%eax  #funzione exit(time)
  15.         mov $0,%ebx  #passo il parametro time
  16.         int $0x80    #Chiamo l'interrupt


Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :D



Ciao, tenterò di spiegare in modo semplice il problema ;)

Dal tuo codice deduco che stai usando Unix (int 0x80), più precisamente Linux (perchè usi la convenzione fast call, non come BSD che usa pushare 4 byte aggiuntivi di stack).

Andando a vedere la documentazione, i parametri sono passati correttamente:
eax = syscall # (in questo caso 4 == sys_write, ok)
ebx = file descriptor (in questo caso 1 == stdout, ok)
ecx = char * str (vuole un puntatore ad una stringa! in questo caso è ERRATO)
edx = strlen(str) (in questo caso sarebbe 2, il carattere "1" più lo zero di terminazione, ok)

il parametro che gli stai passando in ecx è il numero 2. Linux andrà a stampare la stringa che si trova all'indirizzo $ecx, ma in questo caso l'indirizzo 0x000000002 non contiene alcuna stringa, ma molto probabilmente apparterrà ad un'area protetta. Il kernel semplicemente dropperà la richiesta non fornendo alcun output.

Per correggere l'errore devi innanzitutto creare una stringa in bss, e mettere in ecx il suo puntatore. Se proprio vuoi generarla a runtime devi allocarla in heap oppure metterla in stack (fai tu) facendo attenzione alla conversione tra interi ed ascii (il numero 2 non corrisponde al carattere ascii "2").

Detto questo, spero di averti chiarito le idee ;) ciao e buono studio!

PM Quote
Avatar
fabi3194 (Ex-Member)
Expert


Messaggi: 206
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 22:27
Martedì, 03/11/2009
Grazie mille...risposta pronta e molto esaustiva..
io pensavo di usare printf...che ne pensi?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 10:40
Mercoledì, 04/11/2009
printf fa parte della libc, internamente è implementata proprio tramite sys_write... è la stessa cosa, solo che il building degli argomenti lo fa da se.
Dovresti comunque creare la stringa "%d" da passargli come argomento, quindi il problema viene solo spostato, non eliminato!

Comunque allenati, sei sulla strada giusta. Prova a creare un array di caratteri a partire da esp e vai decrementando di 1 ad ogni char il valore di esp (è lo stack pointer). Dopo copia esp su ecx (avrai così il puntatore alla stringa locale che cerchi). Ricordati di convertire da numeri decimali alle corrispondenti rappresentazioni ascii...

PM Quote
Avatar
fabi3194 (Ex-Member)
Expert


Messaggi: 206
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 19:57
Mercoledì, 04/11/2009
Ci proverò...grazie mille...un'altra domanda: sai se c'è una guida? Io seguivo quella di blacklight ma è molto ridotta...cosa mi consigli?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 0:45
Giovedì, 05/11/2009
non saprei... io ho imparato l'assembly dai datasheet... saranno lunghi e complessi da leggere, ma non c'è guida che tenga!

http://www.intel.com/products/processor/manuals/

Scarica i volumi 2A e 2B

Ciao ;)

PM Quote
Avatar
fabi3194 (Ex-Member)
Expert


Messaggi: 206
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 14:11
Giovedì, 05/11/2009
Testo quotato

Postato originariamente da TheKaneB:

non saprei... io ho imparato l'assembly dai datasheet... saranno lunghi e complessi da leggere, ma non c'è guida che tenga!

http://www.intel.com/products/processor/manuals/

Scarica i volumi 2A e 2B

Ciao ;)


Caspita...bel lavoro...più che altro è che sono in inglese. Comunque grazie mille dell'aiuto, finito il java passerò all'assembly, mi affascina parecchio :D

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:26
Giovedì, 05/11/2009
Già, mi spiace di non avere materiale in italiano da passarti, ma è comunque un inglese strettamente tecnico. Imparati pochi vocaboli chiave puoi leggere e capire senza problemi il 90% del manuale.

Ciao!

PM Quote
Avatar
fabi3194 (Ex-Member)
Expert


Messaggi: 206
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 21:52
Venerdì, 06/11/2009
Testo quotato

Postato originariamente da TheKaneB:

Già, mi spiace di non avere materiale in italiano da passarti, ma è comunque un inglese strettamente tecnico. Imparati pochi vocaboli chiave puoi leggere e capire senza problemi il 90% del manuale.

Ciao!


Di certo appena posso inizierò a farlo...grazie 10³ di tutto!

PM Quote