无法从Linux中的C访问程序集的正确全局标签数据

时间:2017-10-06 12:19:35

标签: c linux assembly embedded-linux

我有一个汇编代码(hello1.s),其中定义了全局标签 A_Td ,我想访问从/中使用全局标签 A_Td 定义的所有长数据值在C程序中。

.file   "hello1.s"
.globl  A_Td
.text
.align  64
A_Td:
    .long   1353184337,1353184337
    .long   1399144830,1399144830
    .long   3282310938,3282310938
    .long   2522752826,2522752826
    .long   3412831035,3412831035
    .long   4047871263,4047871263
    .long   2874735276,2874735276   
    .long   2466505547,2466505547

由于 A_Td 是在文本部分定义的,所以它放在代码部分中,只有一个副本被加载到内存中。

使用yasm,我生成了hello1.o文件

yasm -p gas -f elf32 hello1.s 

现在,要使用全局标签 A_Td 访问所有长数据,我已经编写了以下C代码(test_glob.c),从这里global label获取线索。

//test_glob.c
extern A_Td ;

int main()
{
    long *p;
    int i;
    p=(long *)(&A_Td);
    for(i=0;i<16;i++)
    {
        printf("p+%d %p %ld\n",i, p+i,*(p+i));
    }
    return 0;
}

使用以下命令我编译了C程序,然后运行C代码。

gcc hello1.o test_glob.c 
./a.out

我得到以下输出

p+0 0x8048400 1353184337
p+1 0x8048404 1353184337
p+2 0x8048408 1399144830
p+3 0x804840c 1399144830  -----> correct till this place
p+4 0x8048410 -1012656358 -----> incorrect value retrieved from this place
p+5 0x8048414 -1012656358
p+6 0x8048418 -1772214470
p+7 0x804841c -1772214470
p+8 0x8048420 -882136261
p+9 0x8048424 -882136261
p+10 0x8048428 -247096033
p+11 0x804842c -247096033
p+12 0x8048430 -1420232020
p+13 0x8048434 -1420232020
p+14 0x8048438 -1828461749
p+15 0x804843c -1828461749

只能从C程序正确访问前4个长值。为什么会这样?

在C程序中需要做些什么来正确访问其余数据?

我正在使用Linux。任何帮助解决此问题或任何链接将是一个很大的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

多少字节&#34;长&#34;有这个系统吗?

在我看来,printf将数字解释为四字节有符号整数,其中值(print '<pre>') && print_r($array) && die; 具有十六进制值3282310938,高于C3A4171A(十进制:2147483647)这是最大的四字节正有符号数,因此是负值7FFFFFFF。 我假设汇编程序只是将这四个字节数解释为无符号。

如果您使用-1012656358代替%lu,printf会将这些数字解释为无符号,并且应该显示您的预期。