注册 登录
编程论坛 汇编论坛

为了增加一些人气 我还是发到这里 不使用临时变量 完成 2 个整数的交换

wp231957 发布于 2014-08-12 14:21, 3062 次点击
程序代码:

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代替 完成交换第二步
    }
}
12 回复
#2
wp2319572014-08-12 14:24
这是使用了局部变量的代码

程序代码:

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;
}
#3
wp2319572014-08-12 16:21
汇编无视数据类型  果然如此  简单的改改 就变成交换字符串的函数了

程序代码:

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;                 
    }
}
#4
tlliqi2014-08-12 16:53
不懂 魔拜ing
#5
zklhp2014-08-12 16:55
以下是引用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;
}
开编译优化肯定不是这个样子的
#6
hu9jj2014-08-12 17:04
以下是引用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;                  
    }
}
汇编只管指定地址中的二进制数据,至于这个数据有什么含义,则是程序编制者的事件了。
#7
GoldenSpider2014-08-12 20:45
程序代码:
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
    }
}
#8
wp2319572014-08-13 08:13
以下是引用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
    }
}


这个好  思路清晰 代码简洁 通过测试
#9
wp2319572014-08-13 08:19
以下是引用zklhp在2014-8-12 16:55:58的发言:

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



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

决定马上关闭优化
#10
Artless2014-08-13 09:04
#11
zklhp2014-08-13 09:24
以下是引用wp231957在2014-8-13 08:19:16的发言:

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

我喜欢快 怎么快怎么来
#12
邓士林2014-08-13 12:15
不懂啊
#13
雯霖2014-08-13 12:23
1