| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 752 人关注过本帖
标题:想了想 决定还是发在 c 版,毕竟是 c 内联汇编语法为主 题目是 已知的 5 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:10 
想了想 决定还是发在 c 版,毕竟是 c 内联汇编语法为主 题目是 已知的 5 位正整数
求满足 abcde=a^5+b^5+c^5+d^5+e^5  这样的5位数都有谁?
答案是
54748
92727
93084

下面主要是用vs2010+c+内联汇编 编写   有不足之处还请各位大虾指点

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

int mypow(int x,int n)
{
    int t;
    _asm
    {
        mov eax,1;
        mov ecx,n;
     lp:
        imul eax,x;
        sub ecx,1;
        cmp ecx,0;
        jle ex;
        jmp lp;
     ex:
        mov t,eax;
    }
    return t;
}

void split(int s,int* a1,int* a2,int* a3,int* a4,int* a5)
{
    _asm
    {
        mov eax,dword ptr [s];
        cdq;
        mov ecx,10;
        idiv ecx;
        mov dword ptr [s],eax;
        mov eax,dword ptr a5;
        mov dword ptr [eax],edx;
        //
        mov eax,dword ptr [s];
        cdq;
        mov ecx,10;
        idiv ecx;
        mov dword ptr [s],eax;
        mov eax,dword ptr a4;
        mov dword ptr [eax],edx;
        //
        mov eax,dword ptr [s];
        cdq;
        mov ecx,10;
        idiv ecx;
        mov dword ptr [s],eax;
        mov eax,dword ptr a3;
        mov dword ptr [eax],edx;
        //
        mov eax,dword ptr [s];
        cdq;
        mov ecx,10;
        idiv ecx;
        mov dword ptr [s],eax;
        mov eax,dword ptr a2;
        mov dword ptr [eax],edx;
        //
        mov eax,dword ptr [s];
        cdq;
        mov ecx,10;
        idiv ecx;
        mov dword ptr [s],eax;
        mov eax,dword ptr a1;
        mov dword ptr [eax],edx;
    }
}

int main()
{
    int s,a1,a2,a3,a4,a5;
    int t;
    char* fmt="%5d\n";
    _asm
    {
        mov eax,10000;
beg:
        mov dword ptr [t],eax;   // t 用来保存循环变量
        cmp eax,99999;
        jg end;  //大于则跳转至循环结束
        //以上循环头
        mov s,eax;
        lea ecx,dword ptr [a5];
        push ecx;
        lea ecx,dword ptr [a4];
        push ecx;
        lea ecx,dword ptr [a3];
        push ecx;
        lea ecx,dword ptr [a2];
        push ecx;
        lea ecx,dword ptr [a1];
        push ecx;
        mov ecx,dword ptr [s];
        push ecx;
        call split;    //对五位数进行分割
        add esp,24;
        //
        xor esi,esi;
        push 5;
        mov ecx,dword ptr [a5];
        push ecx;
        call mypow;
        add esi,eax;    //调用幂函数并对结果进行累加
        add esp,8;     

        push 5;
        mov ecx,dword ptr [a4];
        push ecx;
        call mypow;
        add esi,eax;    //调用幂函数并对结果进行累加
        add esp,8;

        push 5;
        mov ecx,dword ptr [a3];
        push ecx;
        call mypow;
        add esi,eax;    //调用幂函数并对结果进行累加
        add esp,8;

        push 5;
        mov ecx,dword ptr [a2];
        push ecx;
        call mypow;     //调用幂函数并对结果进行累加
        add esi,eax;
        add esp,8;

        push 5;
        mov ecx,dword ptr [a1];
        push ecx;
        call mypow;
        add esi,eax;     //调用幂函数并对结果进行累加
        add esp,8;
    
        cmp esi,dword ptr [t];
        jnz exit0;  //不相等则跳至下一次循环

        //如果相等则打印输出
        mov ecx,dword ptr [t];
        push ecx;
        mov ecx,dword ptr fmt;
        push ecx;
        call dword ptr printf;
        add esp,8;
        
exit0:
        mov eax,dword ptr [t];  //进行下一次循环
        add eax,1;
        jmp beg;

end:
    }
    return 0;
}
搜索更多相关主题的帖子: 正整数 color 
2014-12-08 11:12
说123454321
Rank: 2
等 级:论坛游民
帖 子:17
专家分:46
注 册:2013-6-22
收藏
得分:15 
汇编语言看不懂
2014-12-08 11:40
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:15 
向楼主学习
2014-12-08 12:04
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:15 
下面的代码在VS和GCC下都能编译通过  但是GCC编译完的运行结果不正确  实在不知道是什么原因  请高手指点一下...
程序代码:
#include <stdio.h>
#include <math.h>

int main(void) {
    int i, j, sum=0, t[5]={0};

    for(i = 54444; i < 99000; sum = 0, i++) {
        for(j = 0; j < 5; j++) {
            t[j] = i % (int)pow(10, (j + 1)) / (int)pow(10, j);
            sum += (int)pow(t[j], 5);
        }

        if(sum == i) {
            printf("%d\n", i);
        }
    }

    return 0;
}


[ 本帖最后由 longwu9t 于 2014-12-8 15:14 编辑 ]

Only the Code Tells the Truth             K.I.S.S
2014-12-08 15:04
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:15 
大神之作,小菜路过

三十年河东,三十年河西,莫欺少年穷!
2014-12-08 15:14
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:15 
为什么不把sum=0放在i=54444后,放在第二个分号后每次执行后都会把sum赋为0吧?

一片落叶掉进了回忆的流年。
2014-12-08 16:24
comewest
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:74
专家分:335
注 册:2014-12-3
收藏
得分:15 
未看,先膜拜一下。
2014-12-08 17:52
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:15 
程序代码:
Dump of assembler code for function main:
   0x0000000000402c40 <+0>:    push   r12
   0x0000000000402c42 <+2>:    push   rbp
   0x0000000000402c43 <+3>:    push   rdi
   0x0000000000402c44 <+4>:    push   rsi
   0x0000000000402c45 <+5>:    push   rbx
   0x0000000000402c46 <+6>:    sub    rsp,0x20
   0x0000000000402c4a <+10>:    xor    ebx,ebx
   0x0000000000402c4c <+12>:    mov    r12d,0x1
   0x0000000000402c52 <+18>:    xor    ebp,ebp
   0x0000000000402c54 <+20>:    xor    esi,esi
   0x0000000000402c56 <+22>:    xor    edi,edi
   0x0000000000402c58 <+24>:    call   0x4016a0 <__main>
   0x0000000000402c5d <+29>:    nop    DWORD PTR [rax]
   0x0000000000402c60 <+32>:    cmp    edi,0xa
   0x0000000000402c63 <+35>:    je     0x402d0c <main+204>
   0x0000000000402c69 <+41>:    cmp    ebp,0xa
   0x0000000000402c6c <+44>:    je     0x402d1b <main+219>
   0x0000000000402c72 <+50>:    cmp    r12d,0xa
   0x0000000000402c76 <+54>:    je     0x402d2c <main+236>
   0x0000000000402c7c <+60>:    imul   eax,ebp,0x3e8
   0x0000000000402c82 <+66>:    mov    r9d,r12d
   0x0000000000402c85 <+69>:    mov    r10d,ebp
   0x0000000000402c88 <+72>:    imul   edx,r12d,0x2710
   0x0000000000402c8f <+79>:    lea    r8d,[rsi+rsi*4]
   0x0000000000402c93 <+83>:    mov    r11d,edi
   0x0000000000402c96 <+86>:    imul   ecx,edi,0x64
   0x0000000000402c99 <+89>:    imul   r9d,r12d
   0x0000000000402c9d <+93>:    add    edx,eax
   0x0000000000402c9f <+95>:    imul   r10d,ebp
   0x0000000000402ca3 <+99>:    mov    eax,ebx
   0x0000000000402ca5 <+101>:    add    ecx,edx
   0x0000000000402ca7 <+103>:    imul   r11d,edi
   0x0000000000402cab <+107>:    lea    edx,[rcx+r8*2]
   0x0000000000402caf <+111>:    imul   r9d,r9d
   0x0000000000402cb3 <+115>:    mov    ecx,esi
   0x0000000000402cb5 <+117>:    imul   ecx,esi
   0x0000000000402cb8 <+120>:    add    edx,ebx
   0x0000000000402cba <+122>:    imul   r10d,r10d
   0x0000000000402cbe <+126>:    imul   eax,ebx
   0x0000000000402cc1 <+129>:    imul   r11d,r11d
   0x0000000000402cc5 <+133>:    imul   ecx,ecx
   0x0000000000402cc8 <+136>:    imul   r9d,r12d
   0x0000000000402ccc <+140>:    imul   r10d,ebp
   0x0000000000402cd0 <+144>:    imul   eax,eax
   0x0000000000402cd3 <+147>:    imul   r11d,edi
   0x0000000000402cd7 <+151>:    imul   ecx,esi
   0x0000000000402cda <+154>:    add    r9d,r10d
   0x0000000000402cdd <+157>:    imul   eax,ebx
   0x0000000000402ce0 <+160>:    add    r9d,r11d
   0x0000000000402ce3 <+163>:    add    ecx,r9d
   0x0000000000402ce6 <+166>:    add    eax,ecx
   0x0000000000402ce8 <+168>:    cmp    edx,eax
   0x0000000000402cea <+170>:    je     0x402d50 <main+272>
   0x0000000000402cec <+172>:    add    ebx,0x1
   0x0000000000402cef <+175>:    cmp    ebx,0xa
   0x0000000000402cf2 <+178>:    je     0x402d40 <main+256>
   0x0000000000402cf4 <+180>:    cmp    esi,0xa
   0x0000000000402cf7 <+183>:    jne    0x402c60 <main+32>
   0x0000000000402cfd <+189>:    add    edi,0x1
   0x0000000000402d00 <+192>:    xor    sil,sil
   0x0000000000402d03 <+195>:    cmp    edi,0xa
   0x0000000000402d06 <+198>:    jne    0x402c69 <main+41>
   0x0000000000402d0c <+204>:    add    ebp,0x1
   0x0000000000402d0f <+207>:    xor    dil,dil
   0x0000000000402d12 <+210>:    cmp    ebp,0xa
   0x0000000000402d15 <+213>:    jne    0x402c72 <main+50>
   0x0000000000402d1b <+219>:    add    r12d,0x1
   0x0000000000402d1f <+223>:    xor    bpl,bpl
   0x0000000000402d22 <+226>:    cmp    r12d,0xa
   0x0000000000402d26 <+230>:    jne    0x402c7c <main+60>
   0x0000000000402d2c <+236>:    xor    eax,eax
   0x0000000000402d2e <+238>:    add    rsp,0x20
   0x0000000000402d32 <+242>:    pop    rbx
   0x0000000000402d33 <+243>:    pop    rsi
   0x0000000000402d34 <+244>:    pop    rdi
   0x0000000000402d35 <+245>:    pop    rbp
   0x0000000000402d36 <+246>:    pop    r12
   0x0000000000402d38 <+248>:    ret   
   0x0000000000402d39 <+249>:    nop    DWORD PTR [rax+0x0]
   0x0000000000402d40 <+256>:    add    esi,0x1
   0x0000000000402d43 <+259>:    xor    bl,bl
   0x0000000000402d45 <+261>:    jmp    0x402cf4 <main+180>
   0x0000000000402d47 <+263>:    nop    WORD PTR [rax+rax*1+0x0]
   0x0000000000402d50 <+272>:    lea    rcx,[rip+0x12a9]        # 0x404000
   0x0000000000402d57 <+279>:    call   0x402ab0 <printf>
   0x0000000000402d5c <+284>:    jmp    0x402cec <main+172>
   0x0000000000402d5e <+286>:    nop
   0x0000000000402d5f <+287>:    nop


我写的C语言版逆向的结果
2014-12-08 18:09
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
找到GCC编译无错通过而运行结果不正确的原因了 GCC math.h 中(int)pow()精度丢失造成
修改为以下代码后 GCC编译通过 运行能得到正确结果
程序代码:
#include <stdio.h>

int POW(int x, int y) {
    int z = 1;

    for(; y > 0; y--) {
        z *= x;
    }

    return z;
}

int main(void) {
    int i, j, sum = 0, t[5] = {0};

    for(i = 54444; i < 99000; sum = 0, i++) {
        for(j = 0; j < 5; j++) {
            t[j] = i % POW(10, (j + 1)) / POW(10, j);
            sum += POW(t[j], 5);
        }

        if(sum == i) {
            printf("%d\n", i);
        }
    }

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2014-12-08 18:37
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用longwu9t在2014-12-8 18:37:59的发言:

找到GCC编译无错通过而运行结果不正确的原因了 GCC math.h 中(int)pow()精度丢失造成
修改为以下代码后 GCC编译通过 运行能得到正确结果
 
#include  
 
int POW(int x, int y) {
    int z = 1;
 
    for(; y > 0; y--) {
        z *= x;
    }
 
    return z;
}
 
int main(void) {
    int i, j, sum = 0, t[5] = {0};
 
    for(i = 54444; i < 99000; sum = 0, i++) {
        for(j = 0; j < 5; j++) {
            t[j] = i % POW(10, (j + 1)) / POW(10, j);
            sum += POW(t[j], 5);
        }
 
        if(sum == i) {
            printf("%d\n", i);
        }
    }
 
    return 0;
}

你这个代码很偷懒啊。。
2014-12-08 18:50
快速回复:想了想 决定还是发在 c 版,毕竟是 c 内联汇编语法为主 题目是 已知 ...
数据加载中...
 
   



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

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