2010-04-27 22 views
1

J'utilise un ordinateur avec un processeur Intel Core 2 et 2 Go de RAM. Le SO est Ubuntu 9.04. Lorsque je tente de compiler ce code:Relocalisation tronquée à Fit erreur dans NASM x86_64

;programma per la simulazione di un terminale su PC, ottenuto utilizzando l'8250 

;in condizione di loopback , cioè Tx=Rx 


section .code64 

section .data 


TXDATA EQU 03F8H ;TRASMETTITORE 

RXDATA EQU 03F8H ;RICEVITORE 

BAUDLSB EQU 03F8H ;DIVISORE DI BAUD RATE IN LSB 

BAUDMSB EQU 03F9H ;DIVISORE DI BAUD RATE IN MSB 

INTENABLE EQU 03F9H ;REGISTRO DI ABILITAZIONE DELL'INTERRUZIONE 

INTIDENTIF EQU 03FAH ;REGISTRO DI IDENTIFICAZIONE DELL'INTERRUZIONE 

LINECTRL EQU 03FBH ;REGISTRO DI CONTROLLO DELLA LINEA 

MODEMCTRL EQU 03FCH ;REGISTRO DI CONTROLLO DEL MODEM 

LINESTATUS EQU 03FDH ;REGISTRO DI STATO DELLA LINEA 

MODEMSTATUS EQU 03FEH ;REGISTRO DI STATO DEL MODEM 








BAUDRATEDIV DW 0060H ;DIVISOR: LOW=60, HIGH=00 ->BAUD =9600 

COUNTERCHAR DB 0 ;CHARACTER COUNTER 







;DW 256 DUP (?) 





section .text 


global _start 



_start: 



;PROGRAMMAZIONE 8250 



    MOV DX,LINECTRL 

    MOV AL,80H ;BIT 7=1 PER INDIRIZZARE IL BAUD RATE 

    OUT DX,AL 



    MOV DX,BAUDLSB 

    MOV AX,BAUDRATEDIV ;DEFINISCO FATTORE DI DIVISIONE 

    OUT DX,AL 

    MOV DX,BAUDMSB 

    MOV AL,AH 

    OUT DX,AL ;MSB 



    MOV DX,LINECTRL 

    MOV AL,00000011B ;8 BIT DATO, 1 STOP, PARITA' NO 

    OUT DX,AL 



    MOV DX,MODEMCTRL 

    MOV AL,00010011B ;BIT 4=0 PER NO LOOPBACK 

    OUT DX,AL 



    MOV DX,INTENABLE 

    XOR AL,AL ;DISABILITO TUTTI GLI INTERRUPTS 

    OUT DX,AL 



CICLO: 

    MOV DX,LINESTATUS 

    IN AL,DX ;LEGGO IL REGISTRO DI STATO DELLA LINEA 

    TEST AL,00011110B ;VERIFICO GLI ERRORI (4 TIPI) 

    JNE ERRORI 

    TEST AL,01H ;VERIFICO Rx PRONTO 

    JNE LEGGOCHAR 

    TEST AL,20H ;VERIFICO Tx VUOTO 

    JE CICLO 



;SE SI ARRIVA A QUESTO PUNTO ALLORA L'8250 è PRONTO PER TRASMETTERE UN NUOVO CARATTERE 

    MOV AH,1 

    INT 80H 

    JE CICLO 



;SE SI ARRIVA A QUESTO PUNTO SIGNIFICA CHE ESISTE UN CARATTERE DA TASTIERA 

    MOV AH,0 

    INT 80H 

;Al CONTIENE IL CARATTERE DELLA TASTIERA 

    MOV DX,3F8H 

    OUT DX,AL 

    JMP CICLO 



LEGGOCHAR: 

    MOV AL,[COUNTERCHAR] 

    INC AL 

    CMP AL,15 

    JE FINE 

    MOV [COUNTERCHAR],AL 

    MOV DX,TXDATA 

    IN AL,DX ;AL CONTIENE IL CARATTERE RICEVUTO 

    AND AL,7FH ;POICHè VI SONO 7 BIT DI DATO 



;VISUALIZZAZIONE DEL CARATTERE 

    MOV BX,0 

    MOV AH,14 

    INT 80H 

    POP AX 

    CMP AL,0DH ;CONTROLLO SE RETURN 

    JNE CICLO 



;CAMBIO RIGA DI VISUALIZZAZIONE 

    MOV AL,0AH 

    MOV BX,0 

    MOV AH,14 

    ;INT 10H 
    INT 80H 

    JMP CICLO 



;GESTIONE ERRORI 

ERRORI: 

    MOV DX,3F8H 

    IN AL,DX 

    MOV AL,'?' 

    MOV BX,0 

    MOV AH,14 

    INT 80H 

    JMP CICLO 



FINE: 

    XOR AH,AH 

    MOV AL,03 

    INT 80H 

Quand je compile ce code "MSNA -f bin UARTLOOP.asm", le compilateur peut créer le fichier UARTLOOP.o sans aucune erreur. Lorsque je tente de lier le fichier .o avec « ld UARTLOOP.o » il dit:

UARTLOOP.o: In function `_start': 
UARTLOOP.asm:(.text+0xd): relocation truncated to fit: R_X86_64_16 against `.data' 

Avez-u obtenu quelques idées pour résoudre ce problème? Thx =)

Mise à jour

La sortie de nasm -hf est:

utilisation: nasm [- @ fichier de réponse] [-o outfile] [-f format] [-l listfile] [options ...] [-] nom de fichier ou nasm -v pour info version

-t   assemble in SciTech TASM compatible mode 
-g   generate debug information in selected format. 
-E (or -e) preprocess only (writes output to stdout by default) 
-a   don't preprocess (assemble only) 
-M   generate Makefile dependencies on stdout 
-MG   d:o, missing files assumed generated 

-Z<file> redirect error messages to file 
-s   redirect error messages to stdout 

-F format select a debugging format 

-I<path> adds a pathname to the include file path 
-O<digit> optimize branch offsets (-O0 disables, default) 
-P<file> pre-includes a file 
-D<macro>[=<value>] pre-defines a macro 
-U<macro> undefines a macro 
-X<format> specifies error reporting format (gnu or vc) 
-w+foo  enables warning foo (equiv. -Wfoo) 
-w-foo  disable warning foo (equiv. -Wno-foo) 
+0

Je ne comprends pas exactement le message d'erreur, mais vous devriez essayer d'utiliser quelque chose comme '-f elf'. Si cela ne fonctionne pas, affichez la sortie de 'nasm -hf'. –

+0

Exemple minimal qui génère l'erreur et ce que cela signifie: http://stackoverflow.com/a/32639540/895245 –

Répondre

0
Warnings: 
error     treat warnings as errors (default off) 
macro-params   macro calls with wrong parameter count (default on) 
macro-selfref   cyclic macro references (default off) 
macro-defaults   macros with more default than optional parameters (default on) 
orphan-labels   labels alone on lines without trailing `:' (default on) 
number-overflow   numeric constant does not fit (default on) 
gnu-elf-extensions  using 8- or 16-bit relocation in ELF32, a GNU extension (default off) 
float-overflow   floating point overflow (default on) 
float-denorm   floating point denormal (default off) 
float-underflow   floating point underflow (default off) 
float-toolong   too many digits in floating-point number (default on) 
user     %warning directives (default on) 
5

Cette erreur vient de ceci:

  section .data 
BAUDRATEDIV DW 0060H 

      section .text  
_start: 
      MOV AX,BAUDRATEDIV 

Le problème est que BAUDRATEDIV est un emplacement de mémoire, pas une constante-temps de montage (EQU), de sorte que vous devriez avoir écrit

  MOV AX,[BAUDRATEDIV] 

Le explication pour le message d'erreur est que vous essayez d'adapter une adresse 32/64 bits dans un opérande de 16 bits.