NASM x86_64 中的重定位截断以适应错误
我使用的计算机配备 Intel Core 2 CPU 和 2GB RAM。我的操作系统是 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'
你有一些想法来解决这个问题吗? Thx =)
更新
nasm -hf
的输出是:
用法:nasm [-@响应文件] [-o 输出文件] [-f 格式] [-l 列表文件] [选项...] [--] 文件名 或 nasm -v 获取版本信息
-t 在 SciTech TASM 兼容模式下进行汇编 -g 以选定的格式生成调试信息。 -E(或 -e)仅预处理(默认将输出写入标准输出) -a 不预处理(仅汇编) -M 生成对 stdout 的 Makefile 依赖项 -MG d:o,假定生成丢失文件 -Z<文件>将错误消息重定向到文件 -s 将错误消息重定向到标准输出 -F format 选择调试格式 -I<路径>将路径名添加到包含文件路径 -O<数字>优化分支偏移(-O0 禁用,默认) -P<文件>预先包含一个文件 -D
[= ] 预定义宏 -U<宏>取消宏定义 -X<格式>指定错误报告格式(gnu 或 vc) -w+foo 启用警告 foo(相当于 -Wfoo) -w-foo 禁用警告 foo (相当于 -Wno-foo)
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
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 =)
Update
The output of nasm -hf
is:
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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个错误来自于:
The Problem is that BAUDRATEDIV is a memory location, not a assembly-timeconstant (EQU), so you should have write
错误消息的解释是您正在尝试适应 32/64 位地址转换为 16 位操作数。
This error comes from this:
The problem is that BAUDRATEDIV is a memory location, not an assembly-time constant (EQU), so you should have written
The explanation for the error message is that you are trying to fit a 32/64 bits address into a 16 bits operand.