我有一个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相同的效果)。

10-08 10:50