| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3062 人关注过本帖
标题:为了增加一些人气 我还是发到这里 不使用临时变量 完成 2 个整数的交换
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:12 
为了增加一些人气 我还是发到这里 不使用临时变量 完成 2 个整数的交换
程序代码:
void swap(int*,int*)
{
    _asm
    {
        mov ebx,dword ptr [ebp+0xc];   //令ebx=参数2的地址(传址)
        mov edx,[ebx];                 //令edx=参数2的值(传值)
        push edx;                      //因为不使用临时变量 所以寄存器不够用 
                                       //因为下面要改变这个址和值 所以这3条语句起到一个备份的作用
        mov ecx,dword ptr [ebp+0x8];   //ecx=参数1的地址
        mov eax,[ecx];                 //eax=参数1的值
        mov edx,dword ptr [ebp+0xc];   //edx=参数2的地址
        mov [edx],eax;                 //edx的指向值由eax代替 完成交换第一步
        pop edx;                       //取出edx即参数2的值
        mov ecx,dword ptr [ebp+0x8];   //ecx=参数1的地址
        mov [ecx],edx;                 //ecx的指向值由edx代替 完成交换第二步
    }
}
2014-08-12 14:21
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这是使用了局部变量的代码

程序代码:
00401000 >/$ 55             PUSH EBP
00401001  |. 8BEC           MOV EBP,ESP
00401003  |. 51             PUSH ECX
00401004  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
00401007  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
00401009  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
0040100C  |. 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]
0040100F  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00401012  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
00401014  |. 890A           MOV DWORD PTR DS:[EDX],ECX
00401016  |. 8B55 0C        MOV EDX,DWORD PTR SS:[EBP+C]
00401019  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040101C  |. 8902           MOV DWORD PTR DS:[EDX],EAX
0040101E  |. 8BE5           MOV ESP,EBP
00401020  |. 5D             POP EBP
00401021  \. C3             RETN

原始代码如下:
void swap(int* a,int* b)
{
    int tmp;
    tmp=*a;
    *a=*b;
    *b=tmp;
}

DO IT YOURSELF !
2014-08-12 14:24
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
汇编无视数据类型  果然如此  简单的改改 就变成交换字符串的函数了

程序代码:
void swap(char**,char**)
{
    _asm
    {
        mov ebx,dword ptr [ebp+0xc];   
        mov edx,[ebx];                 
        push edx;                       
        mov ecx,dword ptr [ebp+0x8];   
        mov eax,[ecx];                 
        mov edx,dword ptr [ebp+0xc];  
        mov [edx],eax;                 
        pop edx;                      
        mov ecx,dword ptr [ebp+0x8];   
        mov [ecx],edx;                 
    }
}

DO IT YOURSELF !
2014-08-12 16:21
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:15 
不懂 魔拜ing
2014-08-12 16:53
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:15 
以下是引用wp231957在2014-8-12 14:24:20的发言:

这是使用了局部变量的代码
 
 
00401000 >/$ 55             PUSH EBP
00401001  |. 8BEC           MOV EBP,ESP
00401003  |. 51             PUSH ECX
00401004  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
00401007  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
00401009  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
0040100C  |. 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]
0040100F  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00401012  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
00401014  |. 890A           MOV DWORD PTR DS:[EDX],ECX
00401016  |. 8B55 0C        MOV EDX,DWORD PTR SS:[EBP+C]
00401019  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040101C  |. 8902           MOV DWORD PTR DS:[EDX],EAX
0040101E  |. 8BE5           MOV ESP,EBP
00401020  |. 5D             POP EBP
00401021  \. C3             RETN
 
原始代码如下:
void swap(int* a,int* b)
{
    int tmp;
    tmp=*a;
    *a=*b;
    *b=tmp;
}
开编译优化肯定不是这个样子的
2014-08-12 16:55
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11773
专家分:43421
注 册:2006-5-13
收藏
得分:15 
以下是引用wp231957在2014-8-12 16:21:22的发言:

汇编无视数据类型  果然如此  简单的改改 就变成交换字符串的函数了
 
 
void swap(char**,char**)
{
    _asm
    {
        mov ebx,dword ptr [ebp+0xc];   
        mov edx,[ebx];                  
        push edx;                        
        mov ecx,dword ptr [ebp+0x8];   
        mov eax,[ecx];                  
        mov edx,dword ptr [ebp+0xc];   
        mov [edx],eax;                  
        pop edx;                       
        mov ecx,dword ptr [ebp+0x8];   
        mov [ecx],edx;                  
    }
}
汇编只管指定地址中的二进制数据,至于这个数据有什么含义,则是程序编制者的事件了。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-08-12 17:04
GoldenSpider
Rank: 2
等 级:论坛游民
威 望:3
帖 子:17
专家分:77
注 册:2010-5-15
收藏
得分:15 
程序代码:
int __declspec(naked) swap(int* A, int* B)
{
  _asm
    {
        mov  eax,[esp+4]
        mov  edx,[esp+8]
        push DWORD PTR [eax]
        push DWORD PTR [edx]
        pop  DWORD PTR [eax]
        pop  DWORD PTR [edx]
        ret
    }
}
2014-08-12 20:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用GoldenSpider在2014-8-12 20:45:59的发言:

int __declspec(naked) swap(int* A, int* B)
{
  _asm
    {
        mov  eax,[esp+4]
        mov  edx,[esp+8]
        push DWORD PTR [eax]
        push DWORD PTR [edx]
        pop  DWORD PTR [eax]
        pop  DWORD PTR [edx]
        ret
    }
}


这个好  思路清晰 代码简洁 通过测试

DO IT YOURSELF !
2014-08-13 08:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用zklhp在2014-8-12 16:55:58的发言:

开编译优化肯定不是这个样子的



优化后 代码啥意思都没有了  把函数都优化没了  直接push地址  没啥研究价值了  

决定马上关闭优化

DO IT YOURSELF !
2014-08-13 08:19
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:15 

无知
2014-08-13 09:04
快速回复:为了增加一些人气 我还是发到这里 不使用临时变量 完成 2 个整数的交 ...
数据加载中...
 
   



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

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