Ошибка Relocation Truncated to Fit в NASM x86_64

Я использую компьютер с процессором Intel Core 2 и 2 ГБ оперативной памяти. Моя ОС Ubuntu 9.04. Когда я пытаюсь скомпилировать этот код:

;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

Когда я компилирую этот код NASM -f bin UARTLOOP.asm, компилятор может создать файл UARTLOOP.o без каких-либо ошибок. Когда я пытаюсь связать файл .o с ld UARTLOOP.o, он говорит:

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

У вас есть идеи, чтобы решить эту проблему? Спасибо =)

Обновить

Вывод nasm -hf:

использование: nasm [-@ файл ответов] [-o исходящий файл] [-f формат] [-l список файлов] [параметры...] [--] имя файла или nasm -v для информации о версии

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

person Stefano    schedule 27.04.2010    source источник
comment
Я не совсем понимаю сообщение об ошибке, но вы должны попробовать использовать что-то вроде -f elf. Если не работает, покажите нам вывод nasm -hf.   -  person Bastien Léonard    schedule 27.04.2010
comment
Минимальный пример, который генерирует ошибку и что это означает: stackoverflow.com/a/32639540/895245   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 17.09.2015


Ответы (2)


Эта ошибка возникает из-за этого:

               section .data
BAUDRATEDIV    DW 0060H

               section .text    
_start:
               MOV AX,BAUDRATEDIV

Проблема в том, что BAUDRATEDIV — это место в памяти, а не константа времени сборки (EQU), поэтому вы должны были написать

            MOV AX,[BAUDRATEDIV]

Объяснение сообщения об ошибке заключается в том, что вы пытаетесь вписать 32/64-битный адрес в 16-битный операнд.

person Community    schedule 26.02.2012

person    schedule
comment
Это nasm справка по параметрам-предупреждениям. Совершенно не имеет значения и вообще не отвечает на вопрос об ошибках компоновщика при компоновке кода, пытающегося поместить адрес символа в 16-битный регистр. Его можно ассемблировать (так что NASM не будет жаловаться на это), но его нельзя скомпоновать в обычный исполняемый файл. - person Peter Cordes; 14.10.2020