| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2193 人关注过本帖
标题:看到一道有意思的题:累加求和,不能用乘除、if,for,while,case,等及条件语 ...
只看楼主 加入收藏
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
那个用汇编的显然用了条件判断跳转指令(cmp,jle),肯定不合题意。

能编个毛线衣吗?
2015-10-30 08:11
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
回复 29楼 wmf2014
忘了更好啊

总有那身价贱的人给作业贴回复完整的代码
2015-10-30 08:12
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
回复 28楼 wfoo
汇编的条件跳转在我看来是有 if 的
我说的 if 更多的是指概念上的


莫问前尘有愧,但求今生无悔
2015-10-30 08:17
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
汇编里的movsb、movsw指令同样隐含条件判断,并且只能转移内存块,不知道怎么用到这个题目上。

能编个毛线衣吗?
2015-10-30 08:19
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:2 
关键是汇编里都不要跳转,整个代码一条跳转都不要,除了call指令。我一直是说只有条件没有跳转,if是有条件有跳转。如果连cmp不能用,那还可以用减法和位与。
2015-10-30 08:29
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:2 
回复 35楼 wfoo
虽然我们对 if 的观点不太一样,不过在讨论中我还是认识到位数确定的话是可以不用 if 限定的,学习了


莫问前尘有愧,但求今生无悔
2015-10-30 08:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:2 
看看这里面有没有隐式条件语句了
程序代码:
#include<stdio.h>

int main()
{
    char* fmt="%d\n";
    _asm
    {
        mov eax,100;
        add eax,1;
        xor edx,edx;
        push eax;
        shl eax,6;
        add edx,eax;
        pop eax;
        push eax;
        shl eax,5;
        add edx,eax;
        pop eax;
        shl eax,2;
        add edx,eax;
        shr edx,1;
        push edx;
        mov eax,dword ptr fmt;
        push eax;
        call dword ptr printf;
        add esp,8;
    }
    return 0;
}

DO IT YOURSELF !
2015-10-30 09:16
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
回复 34楼 wmf2014
不是movsb,movsw,是CMOVxx指令。
xx是条件,意思为满足条件则执行MOV指令,不满足不执行。
eax = a < b这种 用汇编就是 cmp a, b; setb eax

如果要把CMOVxx SETxx 都认为是if的话,那么我是不是也可以把 加法认为是IF呢,它最终还是用门电路,门电路也是可以用if else来理解的。

这种指令比if这样的分支指令效率高,不需要分支预测。

[此贴子已经被作者于2015-10-30 09:31编辑过]

2015-10-30 09:23
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
回复 37楼 wp231957

没有通用性啊,另调用call printf显示内存不能read

能编个毛线衣吗?
2015-10-30 09:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 39楼 wmf2014
翻译过来 大致如此   至于你说的内存错误  估计是add esp 这里有问题  但是我vs2010测试没问题

程序代码:
#include<stdio.h>

int main()
{
    char* fmt="sum=%d\n";
    int i=1;
    int j=100;
    int k=i+j;
    int m=k;
    int sum=0;
    sum+=k<<6;
    k=m;
    sum+=k<<5;
    k=m;
    sum+=k<<2;
    sum>>=1;
    printf(fmt,sum);
    return 0;
}

DO IT YOURSELF !
2015-10-30 09:40
快速回复:看到一道有意思的题:累加求和,不能用乘除、if,for,while,case,等及条 ...
数据加载中...
 
   



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

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