Salve raga, ho di nuovo problemi con l'assembler e l'input output, non capisco perchè non mi permette di fare piu di una chiamata alle mie funzioni.... Io compilo tutto con as e linco con ld , perchè gcc mi da questo errore :

codice:
/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

Il file che mi da problemi è il seguente :

codice:
 
.include "Utility_PES"


_main : 
	call input
	mov %al, %ah
	call input 
	call output
	mov %ah, %al
	call output
	call exit
il File utility è :

codice:
 

.section .data 


#definizioni costanti

.equ SYS_EXIT,  1
.equ SYS_READ, 3
.equ SYS_WRITE, 4

.equ STDIN,  0
.equ STDOUT, 1
.equ STDERR, 2


.equ SYSTEM_CALL_LINUX,0x80

#definizione varianbili

	msg :	
		.ascii  "0"
	end_msg : 

var_b : .byte 0 

.section  .text 



output : 
				#Salvo lo stato dei registri prima della chiamata 

	push %eax 				# salvo anche questo perchè ci potrebbero essere dei dati nel registri ax ah che possono servire 
	push %ebx
	push %ecx
	push %edx
	mov %al, msg  		# muovo il byte contenuto nel registro al nella posizione di memoria msg

	# formato system call 
	
	xor %eax,%eax 				# pulisco i registro Setto a zero  	

	movl $SYS_WRITE, %eax		 	# system_call da chiamare 
	movl $STDOUT, %ebx			# file di uscita standard 
	movl $msg , %ecx				# Muovo dall'indirizzo msg nel registro ecx
	movl $1, %edx 				# size stringa 
	int $SYSTEM_CALL_LINUX

						#ripristino lo stato dei registri aalo stadio precedente  
	pop %edx
	pop %ecx
	pop %ebx
	pop %eax

	ret 					#RITORNO AL PROGRAMMA PRINCIPALE



#funzione scritta dal professore "crea una nuova linea
newline:
	 PUSH  %AX

         MOV   $0x0D,%AL

         CALL  output

         MOV   $0x0A,%AL

         CALL  output

         POP   %AX

         RET

input : 
	push %ebx
	push %ecx
	push %edx

	mov %ah, var_b
	xor %eax, %eax	
	
	movl $SYS_READ, %eax		 	# system_call da chiamare 
	movl $STDIN, %ebx			# file di entrata standard 
	movl $msg , %ecx			# Muovo dall'indirizzo msg nel registro ecx
	movl $1, %edx 				# size stringa 
	int $SYSTEM_CALL_LINUX
	
	mov msg, %al							#ripristino lo stato dei registri allo stadio precedente 
	mov var_b , %ah	
	pop %edx
	pop %ecx
	pop %ebx

	ret  

exit : 
	movl $SYS_EXIT, %eax
	movl $0, %ebx
	int $SYSTEM_CALL_LINUX


.global _main
La chiamate ad exit sono obbligato a farla perchè se metto il ret nel programma principale va in crash...

Qualche idea????