| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1231 人关注过本帖
标题:【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内联汇 ...
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
【看似不科学的现象得到了较为科学的解释】我在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
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:5 
难道是向下兼容?

My life is brilliant
2012-10-10 13:09
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:5 
原来如此,亚历山大,科学的

[ 本帖最后由 madfrogme 于 2012-10-10 16:05 编辑 ]

The quieter you become, the more you can hear
2012-10-10 15:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
我学习来了

授人以渔,不授人以鱼。
2012-10-10 15:20
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:5 
说明LINUX包容性比较强?

梅尚程荀
马谭杨奚







                                                       
2012-10-10 17:31
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
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 
难道我装个win764位系统编C不好了吗?
问问大神们,最好是安装什么系统适合于
gcc?

从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2012-10-10 21:35
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
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 

从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2012-10-10 22:34
快速回复:【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内 ...
数据加载中...
 
   



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

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