我有一个C
驱动程序文件,它声明了一个extern
函数,以便在我的asm
文件中使用它。我在一台Windows7x64机器上。
我用这个命令组装了asm
文件:
nasm avxmain.asm-f win64-o avxmain.o
然后我像这样编译NASM
文件:
gcc avxdriver.c-c-m64-o avxdriver.o号
把这些联系起来,我跑:
gcc avxdriver.o avxmain.o-o最终版本
以下是我得到的错误:
avxmain.o:G:\桌面\CPSC240:(.text+0x50):重新定位被截断为
适合:RúX86戆64戆32与`.bss'
avxmain.o:G:\桌面\CPSC240:(.text+0xb9):重定位被截断为
适合度:R_X86_64_32,与“数据”相对应
avxmain.o:G:\桌面\CPSC240:(.text+0xc2):重新定位被截断为
适合度:R_X86_64_32,与“数据”相对应
avxmain.o:G:\桌面\CPSC240:(.text+0x14e):重新定位被截断为
适合:RúX86戆64戆32与`.bss'
错误2:LD返回1退出
地位C
文件:
#include <stdio.h>
#include <stdint.h>
extern double avxdemo();
int main()
{
double return_code = -99.9;
printf("%s","This program will test for the presence of AVX (Advanced Vector Extensions) also known as state component number 2.\n");
return_code = avxdemo();
printf("%s %1.12lf\n","The value returned to the driver is ", return_code);
printf("%s","The driver program will next send a zero to the operating system. Enjoy your programming.\n");
return 0;
}
avxdriver.c
文件:http://pastebin.com/CfnjbpXM
我把它贴在这里是因为它很长,因为它是由教授提供的评论。
我试过运行
avxmain.asm
和-fPIC
选项。我还是会犯同样的错误。我完全迷茫和困惑,因为这是我应该为我的班级运行的示例项目。这个题目对我来说是全新的。我花了大半天的时间来寻找这些错误并尝试不同的方法。我只需要被指向正确的方向。
最佳答案
问题是,常规x64指令的编码中不允许直接使用64位地址。有两种方法可以解决这个问题:
使用movabs rax, symbolNameHere
指令将rax
设置为该地址,然后使用[rax]
访问该地址的数据。
使用[rel symbolNameHere]
作为操作数;这将创建对symbolNameHere
的PC相对引用。它被编码为32位有符号偏移量,与执行该指令时rip
的值相差甚远。
方法1允许您对指令中的绝对地址进行编码,而方法2是较小的代码(您始终可以执行lea rax, [rel symbolNameHere]
以获得与方法1相同的效果)。