qt cef嵌入web

时间:2023-03-08 15:16:40
qt cef嵌入web

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

qt cef嵌入web#pragma once
qt cef嵌入web
qt cef嵌入web#ifdef DLLTestAPI
qt cef嵌入web
qt cef嵌入web#else
qt cef嵌入web#define DLLTestAPI _declspec(dllimport)
qt cef嵌入web#endif
qt cef嵌入web
qt cef嵌入webint DLLTestAPI __stdcall add(int, int);
qt cef嵌入web
qt cef嵌入webint DLLTestAPI __cdecl subtract(int, int);

.cpp代码文件

qt cef嵌入web#define DLLTestAPI _declspec(dllexport)
qt cef嵌入web
qt cef嵌入web#include "Test.h"
qt cef嵌入web
qt cef嵌入webint __stdcall add(int a, int b)
qt cef嵌入web{
qt cef嵌入web    return a + b;
qt cef嵌入web}
qt cef嵌入web
qt cef嵌入webint __cdecl subtract(int a, int b)
qt cef嵌入web{
qt cef嵌入web    return a - b;
qt cef嵌入web}

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

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

add方法:

qt cef嵌入web100115D0    55              PUSH EBP
qt cef嵌入web100115D1    8BEC            MOV EBP,ESP
qt cef嵌入web100115D3    81EC C0000000   SUB ESP,0C0
qt cef嵌入web100115D9    53              PUSH EBX
qt cef嵌入web100115DA    56              PUSH ESI
qt cef嵌入web100115DB    57              PUSH EDI
qt cef嵌入web100115DC    8DBD 40FFFFFF   LEA EDI,DWORD PTR SS:[EBP-C0]
qt cef嵌入web100115E2    B9 30000000     MOV ECX,30
qt cef嵌入web100115E7    B8 CCCCCCCC     MOV EAX,CCCCCCCC
qt cef嵌入web100115EC    F3:AB           REP STOS DWORD PTR ES:[EDI]
qt cef嵌入web100115EE    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
qt cef嵌入web100115F1    0345 0C         ADD EAX,DWORD PTR SS:[EBP+C]
qt cef嵌入web100115F4    5F              POP EDI
qt cef嵌入web100115F5    5E              POP ESI
qt cef嵌入web100115F6    5B              POP EBX
qt cef嵌入web100115F7    8BE5            MOV ESP,EBP
qt cef嵌入web100115F9    5D              POP EBP
qt cef嵌入web100115FA    C2 0800         RETN 8

subtract方法:

qt cef嵌入web10011610    55              PUSH EBP
qt cef嵌入web10011611    8BEC            MOV EBP,ESP
qt cef嵌入web10011613    81EC C0000000   SUB ESP,0C0
qt cef嵌入web10011619    53              PUSH EBX
qt cef嵌入web1001161A    56              PUSH ESI
qt cef嵌入web1001161B    57              PUSH EDI
qt cef嵌入web1001161C    8DBD 40FFFFFF   LEA EDI,DWORD PTR SS:[EBP-C0]
qt cef嵌入web10011622    B9 30000000     MOV ECX,30
qt cef嵌入web10011627    B8 CCCCCCCC     MOV EAX,CCCCCCCC
qt cef嵌入web1001162C    F3:AB           REP STOS DWORD PTR ES:[EDI]
qt cef嵌入web1001162E    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
qt cef嵌入web10011631    2B45 0C         SUB EAX,DWORD PTR SS:[EBP+C]
qt cef嵌入web10011634    5F              POP EDI
qt cef嵌入web10011635    5E              POP ESI
qt cef嵌入web10011636    5B              POP EBX
qt cef嵌入web10011637    8BE5            MOV ESP,EBP
qt cef嵌入web10011639    5D              POP EBP
qt cef嵌入web1001163A    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