NASM x86_64 中的重定位截断以适应错误

发布于 2024-08-30 14:02:49 字数 3637 浏览 5 评论 0原文

我使用的计算机配备 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜光 2024-09-06 14:02:49

这个错误来自于:

               section .data
BAUDRATEDIV    DW 0060H

               section .text    
_start:
               MOV AX,BAUDRATEDIV

The Problem is that BAUDRATEDIV is a memory location, not a assembly-timeconstant (EQU), so you should have write

            MOV AX,[BAUDRATEDIV]

错误消息的解释是您正在尝试适应 32/64 位地址转换为 16 位操作数。

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.

青巷忧颜 2024-09-06 14:02:49
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)
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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文