VC6对函数返回过程的优化(上)

LabVIEW调用DLL返回指针的实战指南:从VC6.0到MoveBlock内存操作 本文提供了在LabVIEW中调用C/C++动态链接库并处理返回指针的完整实战指南。针对DLL函数返回指针的常见需求,详细解析了从VC6.0创建DLL到在LabVIEW端使用MoveBlock内存操作函数安全读取数据的全流程,涵盖了单值、数组及结构体的处理方法,并强调了跨平台兼容性与内存释放等关键注意事项。 阅读详情

写了一天的计划,轻松一下脑筋,看看VC++6.0是怎么优化函数的返回值的过程。创建一个叫test的控制台项目。编译然后把反汇编的选项打开。

先作一个加法运算: c = a + b
1:    // test.cpp : Defines the entry point for the console application.
2:    //
3:
4:    #include "stdafx.h"
5:
6:    int test( int a, int b);
7:
8:
9:    int main(int argc, char* argv[])
10:   {
0040D3B0   push        ebp
0040D3B1   mov         ebp,esp
0040D3B3   sub         esp,4Ch
0040D3B6   push        ebx
0040D3B7   push        esi
0040D3B8   push        edi
0040D3B9   lea         edi,[ebp-4Ch]
0040D3BC   mov         ecx,13h
0040D3C1   mov         eax,0CCCCCCCCh
0040D3C6   rep stos    dword ptr [edi]

11:       int a, b, c;
12:
13:       a = 0x11;
0040D3C8   mov         dword ptr [ebp-4],11h
14:       b = 0x30;
0040D3CF   mov         dword ptr [ebp-8],30h
15:
16:       c = test( a, b);
0040D3D6   mov         eax,dword ptr [ebp-8] ; 取变量b的值
0040D3D9   push        eax                   ; 压栈,变量是从右到左压栈
0040D3DA   mov         ecx,dword ptr [ebp-4] ; 取变量b的值
0040D3DD   push        ecx                   ; 压栈
0040D3DE   call        @ILT+0(test) (00401005)
0040D3E3   add         esp,8                 ; 恢复栈
0040D3E6   mov         dword ptr [ebp-0Ch],eax

17:
18:       return 0;
0040D3E9   xor         eax,eax
19:   }
0040D3EB   pop         edi
0040D3EC   pop         esi
0040D3ED   pop         ebx
0040D3EE   add         esp,4Ch
0040D3F1   cmp         ebp,esp
0040D3F3   call        __chkesp (0040d400)
0040D3F8   mov         esp,ebp
0040D3FA   pop         ebp
0040D3FB   ret

20:
21:
22:   int test( int a, int b)
23:   {
00401050   push        ebp
00401051   mov         ebp,esp
00401053   sub         esp,44h           ;
00401056   push        ebx
00401057   push        esi
00401058   push        edi
00401059   lea         edi,[ebp-44h]
0040105C   mov         ecx,11h
00401061   mov         eax,0CCCCCCCCh  
00401066   rep stos    dword ptr [edi]   ;初始化局部变量空间

24:       int c;
25:       c = a + b;
00401068   mov         eax,dword ptr [ebp+8]
0040106B   add         eax,dword ptr [ebp+0Ch]
0040106E   mov         dword ptr [ebp-4],eax

26:       return c;
00401071   mov         eax,dword ptr [ebp-4]
27:   }
00401074   pop         edi
00401075   pop         esi
00401076   pop         ebx
00401077   mov         esp,ebp
00401079   pop         ebp
0040107A   ret

在26行里面,函数的返回值被放到了EAX里面。好奇的人一定要问,如果返回值是一个结构怎么办?下一个,我们让返回值是一个复数结构(长度是两个32bits)。

1:    // test.cpp : Defines the entry point for the console application.
2:    //
3:
4:    #include "stdafx.h"
5:
6:    struct complex{
7:        int i; //real part
8:        int j; //virtual part
9:    };
10:
11:   complex test( int a, int b);
12:
13:
14:   int main(int argc, char* argv[])
15:   {

0040D440   push        ebp
0040D441   mov         ebp,esp
0040D443   sub         esp,58h
0040D446   push        ebx
0040D447   push        esi
0040D448   push        edi
0040D449   lea         edi,[ebp-58h]
0040D44C   mov         ecx,16h
0040D451   mov         eax,0CCCCCCCCh
0040D456   rep stos    dword ptr [edi]

16:       int a, b;
17:       struct complex c;
18:
19:       a = 0x11;
0040D458   mov         dword ptr [ebp-4],11h
20:       b = 0x30;
0040D45F   mov         dword ptr [ebp-8],30h
21:
22:       c = test( a, b);
0040D466   mov         eax,dword ptr [ebp-8]
0040D469   push        eax
0040D46A   mov         ecx,dword ptr [ebp-4]
0040D46D   push        ecx
0040D46E   call        @ILT+10(test) (0040100f)
0040D473   add         esp,8
0040D476   mov         dword ptr [ebp-18h],eax
0040D479   mov         dword ptr [ebp-14h],edx
0040D47C   mov         edx,dword ptr [ebp-18h]
0040D47F   mov         dword ptr [ebp-10h],edx
0040D482   mov         eax,dword ptr [ebp-14h]
0040D485   mov         dword ptr [ebp-0Ch],eax

23:
24:       return 0;
0040D488   xor         eax,eax
25:   }
0040D48A   pop         edi
0040D48B   pop         esi
0040D48C   pop         ebx
0040D48D   add         esp,58h
0040D490   cmp         ebp,esp
0040D492   call        __chkesp (0040d400)
0040D497   mov         esp,ebp
0040D499   pop         ebp
0040D49A   ret

28:   struct complex test( int a, int b)
29:   {
00401050   push        ebp
00401051   mov         ebp,esp
00401053   sub         esp,48h
00401056   push        ebx
00401057   push        esi
00401058   push        edi
00401059   lea         edi,[ebp-48h]
0040105C   mov         ecx,12h
00401061   mov         eax,0CCCCCCCCh
00401066   rep stos    dword ptr [edi]

30:       struct complex c;
31:       c.i = a;
00401068   mov         eax,dword ptr [ebp+8]
0040106B   mov         dword ptr [ebp-8],eax

32:       c.j = b;
0040106E   mov         ecx,dword ptr [ebp+0Ch]
00401071   mov         dword ptr [ebp-4],ecx

33:
34:       return c;
00401074   mov         eax,dword ptr [ebp-8]
00401077   mov         edx,dword ptr [ebp-4]

35:   }
0040107A   pop         edi
0040107B   pop         esi
0040107C   pop         ebx
0040107D   mov         esp,ebp
0040107F   pop         ebp
00401080   ret

注意看34行,编译器够聪明,用EAX和EDX来返回复数c的实部和虚部。嘿嘿,我就不相信你x86的CISC处理器的寄存器能多过RISC处理器,返回值是更多个32bits又到哪里去找那么多寄存器呢?电动力学的四个方程都可以把变量表达成(x,y,z,t)这样的向量,我让子函数返回这样一个向量。

VC6.0编程经典实例深入剖析 本文还有配套的精品资源,点击获取 简介:本教程详细解读了Microsoft Visual C++ 6.0(VC6.0)这一经典集成开发环境的使用,通过丰富的实例分析,帮助读者深入理解并掌握C++编程的基础知识和应用技巧。教程内容覆盖从基本语法、数据类型、函数使用、面向对象编程,到内存管理、输入输出流、MFC框架、异常处理和调试技巧等多个方面。通过实际项目案例,如GUI程序或... 阅读详情

相关推荐

VC6_FixFont:优化Visual C++ 6.0字体体验

在本章,我们将深入了解VC6_FixFont工具的核心功能,这是一个旨在改善老版本的Visual Studio 6.0用户界面字体显示的工具。随着技术的发展,许多开发者仍在使用这款经典的开发环境,但受限于旧版字体显示问题,界面美观性和可读性受到较大影响。VC6_FixFont的推出,正是为了解决这些问题。字体渲染是将字体信息转换为用户可以阅读的像素点阵的过程。现代操作系统采用了多种技术来改善字体的显示效果,包括消除锯齿和字体平滑。这些技术可以提升字体边缘的平滑度,使其在屏幕上显示得更加美观。

weixin_36064575的博客 1003

好玩又实用,VC6.0的“配置文件”(Profiling)功能

<br /> <br />今天给大家推荐一个VC6.0当中好玩又实用的功能,配置文件(Profiling)。这个功能是用来对che进行性能优化的,它可以实现对程序的行覆盖率(line coverage)和函数覆盖率(function coverage)的测试,由此来找出程序在运行时的性能瓶颈点。不过在我看来,用这个功能来做一下小规模的白盒测试也是个很不错的主意,虽然VC的工程师们不推荐那样做,呵呵。<br />要启动配置文件(Profiling)功能,首先要保证你所使用的VC6.0是专业版或者企业版,因为只

johntsu的专栏 2904

通过VC6++和OpenGL实现的3D彩色自行车渲染

本章节深入探讨了3D图形渲染的基础概念,包括顶点变换、投影、视图变换、着色与纹理映射。同时,我们分析了3D图形的交互技术,包括鼠标和键盘事件的处理、用户界面设计以及碰撞检测与响应实现。掌握这些知识对于创建高性能、交互性强的OpenGL应用程序至关重要。通过本章内容的学习,读者应能够利用OpenGL库在VC6++环境中创建和实现基础的3D图形交互应用程序。

weixin_42515842的博客 1098

VC++ 6.0 ATL COM组件开发,函数返回值

添加方法时,返回值总是为HRESULT 实际调用时,我们可以看到,这个函数其实是没有返回值的。 C++在这里处理返回值需要手工添加代码[out,retval]来指定返回值 HRESULT Calc(int numberA,int numberB,[out,retval]int ReturnValue)    转载于:https://www.cnblogs.com/b...

weixin_30462049的博客 338

将VC2008项目迁移到VC6的实践指南

在软件开发的历程中,随着技术的不断革新和开发需求的演变,项目往往会遇到从旧版本的Visual Studio迁移到新版本的情况。这一章节将为您提供一个概览,了解在不同Visual Studio版本间进行项目转换的意义、可能遇到的挑战以及转换带来的潜在优势。.sln文件是Visual Studio解决方案文件,它是一种文本文件,用于定义Visual Studio项目的结构。这种文件保存了解决方案的布局,包括项目、项目依赖、全局设置等信息。以下是一个.sln文件的基础结构和内容解析:EndProject。

weixin_30356433的博客 691

VC6.0环境下OpenGL绘制直线的实践教程

简介:在Windows平台上,使用Visual C++ 6.0(VC6.0)结合OpenGL库进行2D和3D图形编程是常见的开发实践。本文将介绍如何在VC6.0环境下,通过创建MFC对话框应用程序,配置OpenGL环境,并在其中使用OpenGL函数来绘制基本的直线图形。文章详细阐述了OpenGL的初始化过程,包括创建设备上下文、设置像素格式、初始化渲染上下文。此外,还展示了如何通过代码实现直线绘制,并说明了如何通过对话框控件来控制直线的起点和终点坐标,以及如何响应控件更改事件来更新绘图。

weixin_35973118的博客 1034

VC6/VS2003编译器优化造成的bug

 昨天在优快云上面看到这样一贴,居然爆料VC6/VS2003有一个严重的bug,于是自己也仔细研究一番: 1、原贴地址: http://topic.youkuaiyun.com/u/20091126/10/81713034-7301-4183-93c0-654d75645582.html 2、出错代码:// VC6/VC2003 使用/O2编译(默认的release模式),

Koma的主页 3722

VC6.0:深入详解与实践

MFC(Microsoft Foundation Classes)库是Microsoft为简化Windows应用程序开发而提供的一套C++类库。在MFC中,文档/视图架构是一种典型的模式,它将应用程序的数据(文档)与数据显示(视图)分离。这种架构鼓励开发者采用模块化设计,使得代码更容易维护和扩展。文档/视图架构包含三个主要组件:文档(Document)、视图(View)和框架窗口(Frame Window)。文档是数据存储的中心,视图负责展示文档数据,框架窗口则提供了一个用户交互的环境。

weixin_34640289的博客 955

VC6.0编译器参数设置

VC6.0编译器参数的设置主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/Writin

1947

14.4kW大功率母线变换器设计:LLC+矩阵变压器+GaN实战解析

在数据中心供电架构中,隔离母线变换器将高压直流母线转换为48V低压母线,是大功率供电链路的核心环节。随着功率密度与效率要求不断攀升,传统移相全桥与普通LLC方案已难以满足300A级输出需求。基于LLC/CLLC谐振拓扑,结合矩阵变压器与GaN功率器件,成为新一代高性能母线变换器的主流技术路线。矩阵变压器将大功率磁性元件拆分为多个小单元,配合原边串联副边并联结构,有效降低绕组损耗并提升功率密度;GaN器件则通过高频软开关进一步压减开关损耗。本文以一台14.4kW样机为例,完整梳理从拓扑选型、谐振参数计算、同步

weixin_28273593的博客 341

信号完整性入门:为什么工程师总爱用dB来描述衰减?

本文深入探讨了信号完整性分析中工程师偏爱使用dB(分贝)单位描述衰减的原因。dB通过对数转换,将大动态范围的乘除关系简化为加减运算,极大地方便了多级系统分析和链路预算计算。文章重点解释了-3dB点的核心意义,即功率衰减一半的临界状态,并阐述了其在评估信道带宽、插入损耗与回波损耗等关键参数中的实际应用,是高效工程思维和沟通的重要工具。

weixin_29263201的博客 385

MoveFile和DeleteFile使用方法

MoveFile是文件重命名,或是移动目录 BOOL MoveFile(LPCTSTR lpExistingFileName, // file name LPCTSTR lpNewFileName // new file name); 返回值: 执行成功返回非零值 执行失败返回零值 参数: 1.LPCSTR lpExistingFilename //要改名的文件 2.LPCSTR lpNewFi...

单于的学习历程 3676

【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(二)PLECS 搭建开环 Buck 功率级

本文介绍了如何在PLECS中搭建开环Buck功率级模型,验证数字电源设计的基本思路。重点内容包括: 明确开发顺序:先开环验证功率级,再闭环设计控制器 搭建关键组件:输入电源、PWM模块、MOSFET开关、续流二极管、LC滤波电路及负载 设置初始参数:24V输入、12V输出、200kHz开关频率、22μH电感、100μF电容 测量关键波形:MOSFET Vds验证开关动作、电感电流纹波和输出电压稳态值 提供完整仿真模型和GitHub资源,便于读者复现验证 文章强调通过开环测试先确保功率级正确性,为后续闭环控制

weixin_43234123的博客 1218

VC6对函数返回过程的优化(下)

1:    // test.cpp : Defines the entry point for the console application.2:    //3:4:    #include "stdafx.h"5:6:    struct complex{7:        int i; //x8:        int j; //y9:        int k; //z10:      

why 462

Mac上SSH连接神器SecureCRT:从安装到高效使用的完整指南

本文详细介绍了Mac上专业SSH连接工具SecureCRT的安装与高效使用技巧。从核心优势、会话管理到快捷键方案,全面解析如何提升远程开发与服务器管理效率。特别适合需要处理多服务器环境和复杂终端控制的Mac用户,SecureCRT的企业级加密和跨平台同步功能使其成为SSH连接的神器。

weixin_30642561的博客 493

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

866

VC6.0的BUG_2_return相关

无条件break、continue后的代码也会被删除),在文本处理中,想要删除一行的代码,那么按照此原理,对于下述代码该如何处理呢?**从而陷入死循环**汇编代码不停的。的处理机制出现BUG。所以上述代码就会变成。......

Deutsh的博客 237

CLCD 中国生命周期基础数据库使用攻略

CLCD 是公共建筑碳排放计算的理想选择,其本地化数据可显著提高计算准确性。

hy行者勇哥的博客 2674

C++函数返回值的特殊情况(返回引用、非引用、引用左值)

1、返回非引用       string make_plural(size_t i,const string &word,const string &ending)       {              return (i==1)?word:word+ending;       }       以上函数,当i等于1时,函数返回word形参的副本;当i不等于1时函数返回一个临时

GROWTH 1853

ThingsBoard教程(七):模拟设备遥测

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了六篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 上一篇我们讲解了如何使用设备管理来对设备进行增删改查,和设备配置的一些基本概念,本篇文章就带大

知无涯 4577

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

关于返回结构体的函数

【前言】写作本文,源于最近回复的《汇编中函数返回结构体的方法》一文。在网络上也已经有一些相关文章和相关问题,有的文章已经给出了一部分结果,但总体而言还缺少比较重要的结论。本文以分析 VC6 编译器,32 位架构为主来重复性分析这个话题。     (一)不超过 8 bytes 的小结构体可以通过 EDX:EAX 返回。     本文的范例代码取材于 《汇编中函数返回结构体的方法》一文,并在此基础上进行修改和试验。要研究的第一份代码如下,定义一个不超过 8 bytes 的小结构体,不超过 8 by...

edmond999的专栏 3952

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC6.0 编译优化开关

<br /><br />VC6.0编译器参数的设置主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:<br /><br />/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"

kevin556187的专栏 1190

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

我看VC2005中的返回值优化

一直以来,我都认为C++中,返回大对象或多个对象就是一场恶梦:额外的开销太多,对于原生类型还可以承受,但对大对象来说,就严重地影响效率。所以STL的容器再方便,那也仅限于操作int,double这些类型,换作是操作自定义类型,一不小心就会掉近了陷阱。不过这方面还好,有boost的指针类型对象容器可以利用,是一种比较好的解决方案。另一方面,返回值的处理也不能都像Blitz::Array操作那样,可以

Jarod 的半个程序员 1545

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC6.0工程设置介绍

打开或新建一个包 含至少一个工程的Workspace后,VC6的Project菜单中的“Settings…”命令就变为有效,选择它或者按下热键Alt+F7后,便可 调出工程设置对话框,这里面的选项将影响整个工程的建立和调试过程,因此很重要,虽然在一般情况下,其中的大多数选项都不用改变,但了解一下它们的含义能够消除我们心中存在的神秘感,并加深我们对VC工程的理解。在这个对话框 中,左上方的

冷秋魂的专栏 9189

C++函数中返回的对象是否进行优化运行结果

#include <iostream> using namespace std; struct Foo { Foo() { cout << "Foo ctor" << endl; } Foo(const Foo&) { cout << "Foo copy ctor" << endl; } v...

zhjixi495的专栏 285
上一篇: 新手逆向指南
下一篇: VC6对函数返回过程的优化(下)
whypp
博客等级 码龄21年 58粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值