Ошибка усечения перемещения в 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)
2 ответа
Эта ошибка происходит от этого:
section .data
BAUDRATEDIV DW 0060H
section .text
_start:
MOV AX,BAUDRATEDIV
Проблема в том, что BAUDRATEDIV - это область памяти, а не постоянная времени сборки (EQU), поэтому вы должны были написать
MOV AX,[BAUDRATEDIV]
Объяснение сообщения об ошибке заключается в том, что вы пытаетесь вписать адрес 32/64 бит в операнд 16 бит.
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)