Linker NASM x86_64中的重新定位被截断以适应错误
我用的是一台英特尔酷睿2处理器和2GB内存的电脑。我的操作系统是Ubuntu 9.04。 当我尝试编译此代码时:Linker NASM x86_64中的重新定位被截断以适应错误,linker,nasm,relocation,truncated,Linker,Nasm,Relocation,Truncated,我用的是一台英特尔酷睿2处理器和2GB内存的电脑。我的操作系统是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 RX
;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'
你有办法解决这个问题吗?Thx=)
更新
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)
-t在科技TASM兼容模式下组装
-g生成所选格式的调试信息。
-仅限E(或-E)预处理(默认情况下将输出写入标准输出)
-a不进行预处理(仅装配)
-在标准输出上生成Makefile依赖项
-MG d:o,假定已生成缺少的文件
-Z将错误消息重定向到文件
-s将错误消息重定向到标准输出
-F格式选择调试格式
-我将路径名添加到包含文件路径
-O优化分支偏移(-O0禁用,默认)
-P pre包含一个文件
-D[=]预先定义了一个宏
-U取消定义宏
-X指定错误报告格式(gnu或vc)
-w+foo启用警告foo(等效-Wfoo)
-w-foo禁用警告foo(等效-Wno foo)
此错误来自以下原因:
section .data
BAUDRATEDIV DW 0060H
section .text
_start:
MOV AX,BAUDRATEDIV
问题在于,波特率div是一个内存位置,而不是一个汇编时间常数(eq),因此您应该编写
MOV AX,[BAUDRATEDIV]
对错误消息的解释是,您试图将32/64位地址装入16位操作数。此错误来自以下原因:
section .data
BAUDRATEDIV DW 0060H
section .text
_start:
MOV AX,BAUDRATEDIV
问题在于,波特率div是一个内存位置,而不是一个汇编时间常数(eq),因此您应该编写
MOV AX,[BAUDRATEDIV]
对错误消息的解释是,您试图将32/64位地址装入16位操作数。我不完全理解错误消息,但您应该尝试使用类似于-f elf
的方法。如果不起作用,请向我们展示nasm-hf
的输出。生成错误的最小示例及其含义:我不完全理解错误消息,但您应该尝试使用类似-f elf
的东西。如果不起作用,请向我们展示nasm-hf
的输出。生成错误的最小示例及其含义:这是nasm
的警告选项帮助。完全无关,在链接试图将符号地址放入16位寄存器的代码时,根本无法回答有关链接器错误的问题。这是合法的组装(因此NASM不会对此抱怨),但不能链接到正常的可执行文件。这就是NASM的警告选项帮助。完全无关,在链接试图将符号地址放入16位寄存器的代码时,根本无法回答有关链接器错误的问题。这是合法的组装(因此NASM不会对此抱怨),但不能链接到正常的可执行文件中