Oppure

Loading
03/11/09 19:30
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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int 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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #Chiamo l'interrupt

Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :Dx80 #Chiamo l'interrupt mov ,%eax #funzione exit(time) mov 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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #Chiamo l'interrupt

Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :D,%ebx #passo il parametro time int 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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #Chiamo l'interrupt

Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :Dx80 #Chiamo l'interrupt

Il problema è che non va nemmeno in segmentation fault...è un problema di runtime...
spero che almeno voi possiate aiutarmi :D
aaa
03/11/09 20:01
TheKaneB
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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int 
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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #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!x80 #Chiamo l'interrupt mov ,%eax #funzione exit(time) mov
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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #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!,%ebx #passo il parametro time int
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
.data
.text
.global main
z: .long 1

main:
	mov $z,%ecx  #sposto z in ecx
	add ,%ecx  #aggiungo 1 a ecx
	mov ,%eax  #la funzione write(out,str,strlen) a cui passo i parametri
	mov ,%ebx  #1, standart output
	mov ,%edx  #ecx contiene già il valore, quindi passo il parametro strlen
	int {parsed_message}x80    #Chiamo l'interrupt

	mov ,%eax  #funzione exit(time)
	mov {parsed_message},%ebx  #passo il parametro time 
	int {parsed_message}x80    #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!x80 #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!
aaa
03/11/09 21:27
fabi3194
Grazie mille...risposta pronta e molto esaustiva..
io pensavo di usare printf...che ne pensi?
aaa
04/11/09 9:40
TheKaneB
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...
aaa
04/11/09 18:57
fabi3194
Ci proverò...grazie mille...un'altra domanda: sai se c'è una guida? Io seguivo quella di blacklight ma è molto ridotta...cosa mi consigli?
aaa
04/11/09 23:45
TheKaneB
non saprei... io ho imparato l'assembly dai datasheet... saranno lunghi e complessi da leggere, ma non c'è guida che tenga!

intel.com/products/processor/manuals/

Scarica i volumi 2A e 2B

Ciao ;)
aaa
05/11/09 13:11
fabi3194
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!

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
aaa
05/11/09 14:26
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!
aaa