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 :
il File utility è :codice:.include "Utility_PES" _main : call input mov %al, %ah call input call output mov %ah, %al call output call exit
La chiamate ad exit sono obbligato a farla perchè se metto il ret nel programma principale va in crash...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
Qualche idea????

Rispondi quotando
