NASM x86_64 中的重定位被截断以适应错误 [英] Relocation Truncated to Fit error in NASM x86_64
问题描述
我使用的是配备 Intel Core 2 CPU 和 2GB RAM 的计算机.我的操作系统是 Ubuntu 9.04.当我尝试编译这段代码时:
I'm using a computer with an Intel Core 2 CPU and 2GB of RAM. My OS is Ubuntu 9.04. When I try to compile this code:
;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"链接时它告诉我们:
When I compile this code "NASM -f bin UARTLOOP.asm", the compiler can create the UARTLOOP.o file without any errors. When I try to link the .o file with "ld UARTLOOP.o" it tells:
UARTLOOP.o: In function `_start':
UARTLOOP.asm:(.text+0xd): relocation truncated to fit: R_X86_64_16 against `.data'
你有解决这个问题的想法吗?谢谢 =)
Have u got some ideas to solve this problem? Thx =)
更新
nasm -hf
的输出是:
用法:nasm [-@ 响应文件] [-o 输出文件] [-f 格式] [-l 列表文件][选项...] [--] 文件名或 nasm -v 获取版本信息
usage: nasm [-@ response file] [-o outfile] [-f format] [-l listfile] [options...] [--] filename or nasm -v for version info
-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)
推荐答案
这个错误来自这个:
section .data
BAUDRATEDIV DW 0060H
section .text
_start:
MOV AX,BAUDRATEDIV
问题是 BAUDRATEDIV 是一个内存位置,而不是汇编时间常数 (EQU),所以你应该写
The problem is that BAUDRATEDIV is a memory location, not an assembly-time constant (EQU), so you should have written
MOV AX,[BAUDRATEDIV]
错误消息的解释是您试图将 32/64 位地址放入 16 位操作数中.
The explanation for the error message is that you are trying to fit a 32/64 bits address into a 16 bits operand.
这篇关于NASM x86_64 中的重定位被截断以适应错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!