反汇编分析__stdcall和__cdecl的异同

C++代码如下:
.h头文件

反汇编分析__stdcall和__cdecl的异同#pragma once
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同#ifdef DLLTestAPI
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同#else
反汇编分析__stdcall和__cdecl的异同#define DLLTestAPI _declspec(dllimport)
反汇编分析__stdcall和__cdecl的异同#endif
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同int DLLTestAPI __stdcall add(int, int);
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同int DLLTestAPI __cdecl subtract(int, int);


.cpp代码文件

反汇编分析__stdcall和__cdecl的异同#define DLLTestAPI _declspec(dllexport)
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同#include "Test.h"
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同int __stdcall add(int a, int b)
反汇编分析__stdcall和__cdecl的异同{
反汇编分析__stdcall和__cdecl的异同    return a + b;
反汇编分析__stdcall和__cdecl的异同}
反汇编分析__stdcall和__cdecl的异同
反汇编分析__stdcall和__cdecl的异同int __cdecl subtract(int a, int b)
反汇编分析__stdcall和__cdecl的异同{
反汇编分析__stdcall和__cdecl的异同    return a - b;
反汇编分析__stdcall和__cdecl的异同}


可以看到 add方法是使用__stdcall修饰的,而subtract方法是使用__cdecl修饰的。

反汇编后得到的汇编代码如下

add方法:

反汇编分析__stdcall和__cdecl的异同100115D0    55              PUSH EBP
反汇编分析__stdcall和__cdecl的异同100115D1    8BEC            MOV EBP,ESP
反汇编分析__stdcall和__cdecl的异同100115D3    81EC C0000000   SUB ESP,0C0
反汇编分析__stdcall和__cdecl的异同100115D9    53              PUSH EBX
反汇编分析__stdcall和__cdecl的异同100115DA    56              PUSH ESI
反汇编分析__stdcall和__cdecl的异同100115DB    57              PUSH EDI
反汇编分析__stdcall和__cdecl的异同100115DC    8DBD 40FFFFFF   LEA EDI,DWORD PTR SS:[EBP-C0]
反汇编分析__stdcall和__cdecl的异同100115E2    B9 30000000     MOV ECX,30
反汇编分析__stdcall和__cdecl的异同100115E7    B8 CCCCCCCC     MOV EAX,CCCCCCCC
反汇编分析__stdcall和__cdecl的异同100115EC    F3:AB           REP STOS DWORD PTR ES:[EDI]
反汇编分析__stdcall和__cdecl的异同100115EE    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
反汇编分析__stdcall和__cdecl的异同100115F1    0345 0C         ADD EAX,DWORD PTR SS:[EBP+C]
反汇编分析__stdcall和__cdecl的异同100115F4    5F              POP EDI
反汇编分析__stdcall和__cdecl的异同100115F5    5E              POP ESI
反汇编分析__stdcall和__cdecl的异同100115F6    5B              POP EBX
反汇编分析__stdcall和__cdecl的异同100115F7    8BE5            MOV ESP,EBP
反汇编分析__stdcall和__cdecl的异同100115F9    5D              POP EBP
反汇编分析__stdcall和__cdecl的异同100115FA    C2 0800         RETN 8

subtract方法:

反汇编分析__stdcall和__cdecl的异同10011610    55              PUSH EBP
反汇编分析__stdcall和__cdecl的异同10011611    8BEC            MOV EBP,ESP
反汇编分析__stdcall和__cdecl的异同10011613    81EC C0000000   SUB ESP,0C0
反汇编分析__stdcall和__cdecl的异同10011619    53              PUSH EBX
反汇编分析__stdcall和__cdecl的异同1001161A    56              PUSH ESI
反汇编分析__stdcall和__cdecl的异同1001161B    57              PUSH EDI
反汇编分析__stdcall和__cdecl的异同1001161C    8DBD 40FFFFFF   LEA EDI,DWORD PTR SS:[EBP-C0]
反汇编分析__stdcall和__cdecl的异同10011622    B9 30000000     MOV ECX,30
反汇编分析__stdcall和__cdecl的异同10011627    B8 CCCCCCCC     MOV EAX,CCCCCCCC
反汇编分析__stdcall和__cdecl的异同1001162C    F3:AB           REP STOS DWORD PTR ES:[EDI]
反汇编分析__stdcall和__cdecl的异同1001162E    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
反汇编分析__stdcall和__cdecl的异同10011631    2B45 0C         SUB EAX,DWORD PTR SS:[EBP+C]
反汇编分析__stdcall和__cdecl的异同10011634    5F              POP EDI
反汇编分析__stdcall和__cdecl的异同10011635    5E              POP ESI
反汇编分析__stdcall和__cdecl的异同10011636    5B              POP EBX
反汇编分析__stdcall和__cdecl的异同10011637    8BE5            MOV ESP,EBP
反汇编分析__stdcall和__cdecl的异同10011639    5D              POP EBP
反汇编分析__stdcall和__cdecl的异同1001163A    C3              RETN

大家已经看到了,他们的唯一区别是:
使用__stdcall修饰的add方法,最后的RETN指令的操作数是8,而使用__cdecl修饰的subtract方法,最后的RETN指令没有操作数。

RETN指令的操作数为什么是8呢,原因也很简单,就是add方法有两个int参数,也就是说压栈的时候压入了两个字节,正好8位,RETN 8的意思应该是让栈顶指针ESP向后移动8位。

 

http://blog.csdn.net/songjinshi/article/details/8442829

原文链接: https://www.cnblogs.com/findumars/p/6251018.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    反汇编分析__stdcall和__cdecl的异同

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/247098

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午2:00
下一篇 2023年2月14日 上午2:01

相关推荐