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????