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)
This error comes from this:
section .data
BAUDRATEDIV DW 0060H
section .text
_start:
MOV AX,BAUDRATEDIV
The problem is that BAUDRATEDIV is a memory location, not an assembly-time constant (EQU), so you should have written
MOV AX,[BAUDRATEDIV]
The explanation for the error message is that you are trying to fit a 32/64 bits address into a 16 bits operand.