免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: ck_lai
打印 上一主题 下一主题

[C]新手请教x+=y与x=x+y的问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-02-25 20:28 |只看该作者
原帖由 soso2008 于 2008-2-25 12:01 发表



不敢苟同,
我想并不是直接操作内存单元,而是用CPU内部的累加器进行计算,然后再写回内存,
这两种写法,在C编译器层面产生的结果就应该是一样的,
指令运算更不会有差异,




1有什么理由不允许直接操作内存单元吗??我想不到。

2在不抠语法的情况下,我举双手同意“这两种写法,在C编译器层面产生的结果就应该是一样的,指令运算更不会有差异”,但是我认为都应该优化成直接操作内存。

3刚才在gcc4.1.2上面测了一下,如上一条所说

另外.......直接说eax或者通用寄存器就好了,“CPU内部的累加器”说起来多累啊,又或者你另有所指??

论坛徽章:
0
32 [报告]
发表于 2008-02-26 10:33 |只看该作者
要是抠到指令集的层面上,
不同的体系结构可能有差异,但是我还没有见过直接用SDRAM运算加法的,

比如最简单的,在MCS51单片机中,计算加法时,只能用Acc,
用汇编写加法时,
MOV   Acc, X
ADD   Acc, Y
MOV   X, Acc
当然,这个X, Y都是在CPU内部,可以直接访问的,

指令集中没有
ADD   X, Y
这种指令,

我对单片机最熟悉,所以拿单片机来举例子,
其它的体系结构我没研究过,
对于X86系统,具体在L1/L2 cache,和SDRAM之间如何交互等等,我不清楚,
但绝不是一条指令能完成的,

很多细节,我也不清楚,毕竟是搞软件的,对底层处理的细节没有接触过,
不过可以尝试下‘-S’参数,翻译成汇编代码来看,
不过我看不大懂,

int main( void )
{
    int x, y;

    y = 5;
    x = y;

    return 0;
}


    .file    "test1.c"
gcc2_compiled.:
___gnu_compiled_c:
    .def    ___main;    .scl    2;    .type    32;    .endef
.text
    .align 4
.globl _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl %ebp
    movl %esp,%ebp
    subl $24,%esp
    call ___main
    movl $5,-8(%ebp)
    movl -8(%ebp),%eax
    movl %eax,-4(%ebp)
    xorl %eax,%eax
    jmp L2
    .align 4
L2:
    movl %ebp,%esp
    popl %ebp
    ret


[ 本帖最后由 soso2008 于 2008-2-26 10:39 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2008-02-26 10:48 |只看该作者
因为没有证据,很多人让我糊涂,
所以我只能当作想当然。。。

论坛徽章:
0
34 [报告]
发表于 2008-02-26 13:49 |只看该作者
原帖由 soso2008 于 2008-2-26 10:33 发表
要是抠到指令集的层面上,
不同的体系结构可能有差异,但是我还没有见过直接用SDRAM运算加法的,

比如最简单的,在MCS51单片机中,计算加法时,只能用Acc,
用汇编写加法时,
MOV   Acc, X
ADD   Acc, Y ...


你说确实混乱,举这个例子想说明什么?  其实 dxcnjupt 已经说得很清楚了

论坛徽章:
0
35 [报告]
发表于 2008-02-26 14:47 |只看该作者
原帖由 dxcnjupt 于 2008-2-25 20:28 发表




1有什么理由不允许直接操作内存单元吗??我想不到。

2在不抠语法的情况下,我举双手同意“这两种写法,在C编译器层面产生的结果就应该是一样的,指令运算更不会有差异”,但是我认为都应该优化成直 ...

所有的算术逻辑运算都是在ALU中完成的,绝对不会有指令“直接”对存储器加一,即CPU不需要知道存储的值而是直接对存储说:“把它加一”,因为存储器不能接收指令,也不能进行运算

论坛徽章:
0
36 [报告]
发表于 2008-02-26 14:51 |只看该作者
有些体系结构没有只有存储操作数的指令,有的系统运算绝对不能有存储操作数,但是无论怎么样,运算是在CPU中,不是在存储器中,只是可能被CPU隐藏了,比如x86中的对一个存储字加1

论坛徽章:
0
37 [报告]
发表于 2008-02-26 18:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
38 [报告]
发表于 2008-02-28 09:42 |只看该作者
前者仅是做了一次+=运算,后者先做了+运算,然后又做了赋值,所以前者比后者少了一次运算

论坛徽章:
0
39 [报告]
发表于 2008-02-28 18:45 |只看该作者

回复 #1 ck_lai 的帖子

伙计,你在哪本书中看到的,说出来俺也想看一下

论坛徽章:
0
40 [报告]
发表于 2008-02-28 19:06 |只看该作者
原帖由 dxcnjupt 于 2008-2-24 15:47 发表
抠语法的话:
x = x+y:
mov eax, [x]
mov ebx, [y]
add eax,ebx
mov [x], eax

x += y:
mov eax, [y]
add [x],  eax

支持cat的观点,c语言不要太在意这种细节的东西。算法和架构才是最重要的
如果 ...

x = x +y 与 x +=y 生成的指令没有什么区别吧!
好像没有任何区别呀.

  1. int
  2. main(void)
  3. {
  4.         int x, y;

  5.         x = x + y;
  6.         x += y;

  7.         return (0);
  8. }
复制代码

        .file   "xy.c"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
.LFB2:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movl    -8(%rbp), %edx
        leaq    -4(%rbp), %rax
        addl    %edx, (%rax)
        movl    -8(%rbp), %edx
        leaq    -4(%rbp), %rax
        addl    %edx, (%rax)
        movl    $0, %eax
        leave
        ret
.LFE2:
        .size   main, .-main
        .section        .eh_frame,"a",@progbits
.Lframe1:
        .long   .LECIE1-.LSCIE1
.LSCIE1:
        .long   0x0
        .byte   0x1
        .string ""
        .uleb128 0x1
        .sleb128 -8
        .byte   0x10
        .byte   0xc
        .uleb128 0x7
        .uleb128 0x8
        .byte   0x90
        .uleb128 0x1
        .p2align 3
.LECIE1:
.LSFDE1:
        .long   .LEFDE1-.LASFDE1
.LASFDE1:
        .long   .LASFDE1-.Lframe1
        .quad   .LFB2
        .quad   .LFE2-.LFB2
        .byte   0x4
        .long   .LCFI0-.LFB2
        .byte   0xe
        .uleb128 0x10
        .byte   0x86
        .uleb128 0x2
        .byte   0x4
        .long   .LCFI1-.LCFI0
        .byte   0xd
        .uleb128 0x6
        .p2align 3
.LEFDE1:
        .ident  "GCC: (GNU) 3.4.6 [FreeBSD] 20060305"

  1. 编译指令为gcc -O0 -S xy.c
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP