2010-04-27 93 views
1

我正在使用带有Intel Core 2 CPU和2GB内存的计算机。 SO是Ubuntu 9.04。 当我尝试编译此代码:当我编译此代码“NASM -f斌UARTLOOP.asm”在NASM x86_64中重新定位被截断以适应错误

;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 

,编译器可以没有任何错误创建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' 

具有u得到了一些思路来解决这个问题呢? THX =)

更新

nasm -hf的输出是:

用法:NASM [ - @响应文件] [-o OUTFILE] [-f格式] [-l listfile中] [选项...] [ - ]文件名 或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) 
+0

我不完全理解错误信息,但你应该尝试使用'-f elf'之类的东西。 如果不起作用,请向我们展示'nasm -hf'的输出。 – 2010-04-27 10:01:37

+0

生成错误的最小示例及其含义:http://stackoverflow.com/a/32639540/895245 – 2015-09-17 20:46:37

回答

0
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) 
5

此错误来源于此:

  section .data 
BAUDRATEDIV DW 0060H 

      section .text  
_start: 
      MOV AX,BAUDRATEDIV 

的问题是,BAUDRATEDIV是内存位置,而不是汇编时间常数(EQU),所以你应该写

  MOV AX,[BAUDRATEDIV] 

的错误消息的解释是,您正试图将32/64位地址放入16位操作数中。