| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1231 人关注过本帖
标题:【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内联汇 ...
取消只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内联汇编的例子跑linux下试验 linux是64位的啊 竟然通过了。。。
有个事我一直整错了 printf("%d\n", sizeof(int)); 结果是4 那样的话 64位和32位环境下都用一个movq移动8字节就够了 而64位环境下用32位指针也不是不可以 于是这个代码平稳的迁移到了64位环境

程序代码:
#include <stdio.h>
#include <signal.h>
#pragma pack (16)
struct two_int {
        int a, b;
};
struct two_int data = {0, 0};
void signal_handler(int signum)
{
       printf("%d, %d\n", data.a, data.b);
       alarm(1);
}
int main(void)
{
    static struct two_int zeros = {0, 0}, ones = {1, 1};
    signal(SIGALRM, signal_handler);
    data = zeros;
        alarm(1);
    while (1)
    {
        //data = zeros;
        __asm__ (".intel_syntax noprefix");
        __asm__ (
                "lea eax, [%0];"
                "movq xmm0, qword ptr [eax];"
                "lea eax, [%1];"
                "movq qword ptr [eax], xmm0;"
                :                //dst
                :"m" (zeros), "m" (data)    //src
                :"xmm0", "eax"
            );

 
        //printf("%d %d\n", data.a, data.b);
        //data = ones;
        __asm__ (
                "lea eax, [%0];"
                "movq xmm0, qword ptr [eax];"
                "lea eax, [%1];"
                "movq qword ptr [eax], xmm0;"
                :                //dst
                :"m" (ones), "m" (data)        //src
                :"xmm0", "eax"
        );
    }
    //printf("%d %d\n", data.a, data.b);
    return 0;
}


编译参数

gcc opt-sse.c -O3 -masm=intel -msse3 -march=core2 -o a.out

[root@kel ~]# file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xb8dd47da6e7b7769aede492f79a2ee9ca5ef66df, not stripped

结果

[root@kel ~]# ./a.out
1, 1
1, 1
1, 1
0, 0
1, 1
1, 1

但感觉应该是不对的啊 怎么能用eax呢。。。。。。。。。。。。。。。。。。。。。。。。。。。

/****************************************************************我是分割线***************************************************/

程序代码:
#include <stdio.h>
#include <signal.h>
#pragma pack (16)
struct two_int
{
    int a, b;
};
struct two_int data = {0, 0};
void signal_handler(int signum)
{
       printf("%d, %d\n", data.a, data.b);
       alarm(1);
}
int main(void)
{
    static struct two_int zeros = {0, 0}, ones = {1, 1};
    signal(SIGALRM, signal_handler);
    data = zeros;
    alarm(1);
    while (1)
    {
        //data = zeros;
        __asm__ (".intel_syntax noprefix");
        __asm__ (
                "lea rax, qword ptr [%0];"
                "movq xmm0, qword ptr [rax];"
                "lea rax, qword ptr [%1];"
                "movq qword ptr [rax], xmm0;"
                :                //dst
                :"m" (zeros), "m" (data)    //src
                :"xmm0", "rax"
            );
        //printf("%d %d\n", data.a, data.b);
        //data = ones;
        __asm__ (
                "lea rax, qword ptr [%0];"
                "movq xmm0, qword ptr [rax];"
                "lea rax, qword ptr [%1];"
                "movq qword ptr [rax], xmm0;"
                :                //dst
                :"m" (ones), "m" (data)        //src
                :"xmm0", "eax"
        );
    }
    //printf("%d %d\n", data.a, data.b);
    return 0;
}



64位用64位的指针 这下和谐了

如果这个结构再大 到4个int 也就是128bit 也能一次移动 SSE的优势在这里

不过 如果是再大再复杂的情况 恐怕得用原子操作了


[ 本帖最后由 zklhp 于 2012-10-10 18:14 编辑 ]
搜索更多相关主题的帖子: linux 
2012-10-10 12:38
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
很少在64位环境下编程啊 闹了大笑话 不过长了很多见识啊

补充一点 看来gcc的内联汇编也不是特别麻烦 比较麻烦罢了 现在能支持intel格式 写起来障碍不大 而且gcc可移植性好 VC的64位看来是不支持内联汇编了、、、


[ 本帖最后由 zklhp 于 2012-10-10 18:19 编辑 ]
2012-10-10 18:05
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用罗庇鹏ksq在2012-10-10 21:35:24的发言:

难道我装个win764位系统编C不好了吗?
问问大神们,最好是安装什么系统适合于
gcc?

明显 linux、、、

当然 gcc比较厉害的地方就是可移植性好 上到大型机 小到单片机 都能用gcc。。

哦 不对

您的意思是 【最好是安装什么系统适合于gcc?】 我上面回答的是什么系统适合gcc、、、


[ 本帖最后由 zklhp 于 2012-10-10 21:37 编辑 ]
2012-10-10 21:36
快速回复:【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018979 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved