Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c & gas] ritorno funzione c

    ciao...

    Programmo in assembler e mi serviva una funzione che in assembler non posso ( o meglio non so ) scrivere e l'ho scritta in c per poi richiamarla... fin qui tutto bene!!! Ma il problema si presenta sul ritorno della funzione....

    Io so che questa mette il risultato in eax se è di 32bit o eax:edx se è da 64 , io ottengo il risutlato in eax giustamente ma mi viene modificato anche il registro ecx senza motivo... xkè??? Ho forse sbagliato qualcosa??
    il codice delle funzioni è questo :

    codice getch.c
    codice:
    extern char getch(void) {
    
    	struct termios presente, modificata; 
    	int res, input; 
    
    
    	res = tcgetattr (STDIN_FILENO, &presente); // salvo le impostazioni correnti della scelta , STDIN_FILENO indica il descritore della sheel
    	
    	if(res) { 
    		perror("Errore nella lettura delle impostazioni del terminale");
    		return res; 
    	}
    
    	modificata = presente; // assegno il valore all'altra a struttura per poterci lavorare 
    
    	modificata.c_lflag &= (~ICANON);  // tolgo il controllo canonico 
    
    	res = tcsetattr (STDIN_FILENO,TCSANOW, &modificata); // setto il nuovo valore 	
    
    	if (res) { 
    		perror("Errore nel settaggio dei valori"); 
    		return res; 
    	}
    
    
    	input = (char) getchar(); 
    
    	res = tcsetattr(STDIN_FILENO,TCSANOW, &presente); // rimposto le vecchie impostazioni 
    
    
    	if (res) { 
    
    		perror("Errore nel settaggio dei valori");
    		return res;
    
    	}
    
    	return input; 
    
    
    }
    file assembler :
    codice:
    .global main 
    
    main : 
    	xor %eax, %eax
    	xor %ebx, %ebx
    	xor %ecx, %ecx
    	xor %edx, %edx
    	
    	call getch
    p:
    	ret

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Che vuol dire " mi viene modificato anche il registro ecx senza motivo " ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Se noti io con l'xor azzero il valore del registro e solo eax deve essere modificato....

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh, ma il compilatore utilizzera' ecx per motivi suoi nella funzione C ... se non vuoi modificarlo salvalo nello stack e poi riprendilo all'uscita ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    cosa intendi per lo usa il compilatore?? si il problema lo risolto cosi... Ma il problema sta nel fatto che questo puo succedere anche con altri registri, e io non me ne accorgo!!!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E' normale ... se chiami una funzione scritta in C, il codice assembler relativo non lo generi tu, ma il compilatore.

    E il compilatore puo' usare tutti i registri che vuole ... non c'e' assicurazione che i registri siano "preservati" tra la chiamata della funzione e l'uscita e quindi ci devi pensare tu (almeno per quei registri di cui vuoi conservare il valore ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    ma non sarebbe male se ripulisse i registri che sporca

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da PeppePes88
    ma non sarebbe male se ripulisse i registri che sporca
    No ... la responsabilita' e' del chiamante ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    punti di vista... Io quando scrivo una funzione li pulisco sempre io!!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.