首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Visual C++编译器解释空C`main`函数的奇怪汇编

首先,我们需要了解Visual C++编译器是一个用于编译C++代码的编译器,它可以将C++源代码编译成可执行的程序。在这个问题中,我们将使用Visual C++编译器来解释一个空的main函数的汇编代码。

空的main函数是指一个没有任何代码的main函数,如下所示:

代码语言:c++
复制
int main() {
    return 0;
}

当我们使用Visual C++编译器编译这段代码时,它会生成一些汇编代码。这些汇编代码是一种低级的计算机语言,可以直接执行。

以下是一个可能的汇编代码示例:

代码语言:txt
复制
_main   PROC                        ; COMDAT
        mov     eax, DWORD PTR ___security_cookie
        xor     eax, DWORD PTR _main
        mov     DWORD PTR ___security_cookie, eax
        xor     eax, eax
        ret     0
_main   ENDP

这段汇编代码的主要功能是初始化安全cookie,然后返回0。

现在,我们来看一下这段汇编代码中的一些关键概念:

  1. PROCENDP:这两个指令是汇编语言中的宏,用于定义一个过程(例如函数)的开始和结束。
  2. mov指令:这是一个汇编语言中的指令,用于将一个值从一个地方移动到另一个地方。在这个例子中,我们可以看到两个mov指令,它们分别将___security_cookie的值移动到eax寄存器中,然后将main函数的地址与___security_cookie的值进行异或操作。
  3. xor指令:这是一个汇编语言中的指令,用于将两个值进行异或操作。在这个例子中,我们可以看到两个xor指令,它们分别将eax寄存器中的值与___security_cookie的值进行异或操作,然后将结果存储回___security_cookie中。
  4. ret指令:这是一个汇编语言中的指令,用于从函数返回。在这个例子中,我们可以看到一个ret指令,它将返回值0存储在eax寄存器中,然后返回到调用main函数的地方。

总之,这段汇编代码是Visual C++编译器生成的一个简单的main函数的实现。它包含了一些基本的汇编语言指令,用于初始化安全cookie并返回0。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++奇迹之旅:内联函数和auto关键推导和指针

,编译时C++编译器会在调用内联函数地方展开,没有函数调用建立栈帧开销,内联函数提升程序运行效率。...这是反汇编对比图: 查看内联函数inline方式 查看内联函数方式确实需要根据编译模式不同而采取不同方法: 在 Visual Studio 2019 中,查看内联函数步骤如下: 在 Debug...这样在 Debug 模式下也能看到内联函数被展开汇编代码 在 Release 模式下: 同样可以查看生成汇编代码,如果没有看到对应 call 指令,就说明该函数被内联展开了 另外,Visual...auto使用细则 auto与指针和引用结合起来使用 auto声明指针类型时,auto和auto*没有任何区别,但auto声明引用类型时则必须加& int main() { int x...(关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了) 指针值nullptr(C++11) C++98中指针值 在良好C/C++编程习惯中,声明一个变量时最好给该变量一个合适初始值

16710

c语言编译器在线-c在线编译器(c语言在线编程)

c编译器-c语言编译器是干什么   本人不才,仅就个人意见谈谈:   1。...什么是编译器:   简单说,编译器是一种将高级语言经过其解释,翻译成可以运行二进制代码(有可能是汇编代码,但这种方式处理不一样,还有编译成其他形式的如JAVA是编译成"字节码文件"),再通过它连接程序就调用了系统内部一些库...,实际点说是操作系统动态连接库,也就是你操作系统和硬件(BIOS)打交道而且已经写好函数库(这个解释不是很准确,我现在学习其他语言时候,对类似的说法有API( 应用程序接口)调用系统动态连接库,...: int i;计算机为什么能认识它,这就是它通过了二进制代码和汇编组合完成了这个解释过程,而其功能,在内部需要很多二进制代码和汇编代码。...我是source 。你好,我试着帮你回答下吧: tc2.0或tc3.0在vista下能用,但是用着不方便,另外:c++ 、dev c++ 可用也可。

6.9K50
  • 在CC++直接插入汇编代码方法-内联汇编

    方法总结 案例1 案例2-内联汇编 内联汇编A+B 基础讲解 ---- 方法总结 在c语言直接插入汇编 C/C++中内嵌汇编(Visual Studio 2019) 案例1 #include <stdio.h...C++中使用内联汇编不需要额外编译器和联接器,且可以处理Visual C++中不能处理一些事情,同时可以使用在C/C++变量,所以非常方便。...__asm语法 __asm关键字用来调用内联汇编,可以出现在任何合法CC++声明中。...它不能单独出现,后面必须有汇编指令,可以是一条汇编指令、大括号括起来一组代码,或者至少是大括号括起来代码。术语“__asm块”指的是任何单独一条指令或一组指令,可以不包括在大括号里。...如果想把CC++代码和__asm块放在同一行,则必须把这个__asm块放在括号里。如果没有括号,编译器就不能确定汇编代码结束和CC++代码起始位置。

    1.5K30

    C++C++ 入门

    而对于上述过程中生成符号表这一阶段,C编译器C++编译器所进行操作是不同C语言编译器会直接函数名作为符号表中符号,而不会对函数名进行修饰;而C++编译器则是会对函数名进行修饰,修饰后名称来构成符号表...采用C语言编译器编译后结果: 采用C++编译器编译后结果: 经过对比后我们发现:在linux下,采用gcc (C语言编译器) 编译完成后,函数名字修饰没有发生改变;而采用g++ (C++编译器)...同样,我们也理解了函数返回值不同以及同类型参数顺序不同是不构成重载,因为C++编译器没办法区分;但其实即使是C++编译器函数返回值类型也加入了函数修饰规则,也仅仅是让它在语法层面是构成了重载而已...基于C语言宏函数这些缺陷,C++设计了内联函数: 以 inline 关键字修饰函数叫做内联函数,编译时C++编译器会在调用内联函数地方展开 (函数体替换函数调用),没有函数调用建立栈帧开销...“代码膨胀”,这也在一定程度上解释了为什么当内联函数过长时编译器不进行展开。

    2.5K00

    Windows下C语言环境搭建

    如下: 实际上,Visual Studio 本身就是一个很好集成开发环境,不想使用其他IDE或者对Visual Studio比较熟悉的话,可以直接使用Visual Studio来开发C/C++程序也是没有问题...安装 MinGW 使用 Windows 开发环境,我们绝大多数情况下都会使用 MSVC 来演示我们程序,但 MSVC 实际上是个 C++ 编译器,对于 C 语言语法支持也主要涉及兼容 C++ 部分...我们先大概看下 C 语言编译过程,有个初步印象: main 函数则是程序入口、起点,不管多么庞大 C 语言程序,它一定有一个 main 函数。...接下来 return 0; 就是告诉 main 函数执行完了,而且程序运行没什么问题,这里 0 表示正常退出意思。...WinGW是 GDB ,也可以设置显示汇编指令格式: # 设置为 Intel 指令格式 set disassembly-flavor intel # 设置为 AT&T 指令格式 set disassembly-flavor

    3.2K10

    C++教程系列之-01-C++概述与NOIP案例

    C++教程 2.1 C++官网介绍 2.2 编译器 2.3 控制台程序 2.4 C++程序结构 3. NOIP真题案例 1....1.2 CC++ C语言是一门面向过程编译型语言,它运行速度极快,仅次于汇编语言。...因为计算机只能理解机器语言,而人类希望高级语言写作,高级语言必须在某个时刻被重写(翻译)成机器语言。这是通过称为编译器解释器或汇编特殊程序来完成,这些程序内置于各种编程应用程序中。...名为main函数是所有c++程序中一个特殊函数;它是程序运行时调用函数。所有c++程序执行都从主函数开始,而不管该函数在代码中实际位置。...第六行 和 第九行 { } 第6行开大括号({)表示main函数定义开始,第9行闭大括号(})表示main函数定义结束。这些大括号之间所有内容都是函数体,它定义了调用main时发生事情。

    54110

    不用加号实现两整数相加

    3.内嵌汇编 C/C++函数返回值是通过寄存器eax返回,所以通过内联汇编指令方式可以实现两数相加。...注意GNU C++内联汇编语法使用AT&T/UNIX语法,和Visual C++Intel内联汇编语法不同。...cout<<"-2+11="<<asmAdd(-2,11)<<endl; } 使用g++ test.cpp编译运行结果如下: 99+11=110 99+11=110 -2+11=9 关于上述内联<em>汇编</em>代码<em>的</em>有如下几点<em>解释</em>...: (1)多行<em>汇编</em>指令使用\n\t进行换行,并使用双引号将单行指令括起来; (2)使用双百分号引用寄存器,告诉<em>编译器</em>引用<em>的</em>是寄存器而非操作数; (3)第一个冒号表示引用<em>的</em><em>C++</em><em>的</em>变量,用于输出...,因无需输出变量,所以留空; (4)第二个冒号表示<em>汇编</em>代码需要读取<em>的</em><em>C++</em><em>的</em>变量,”r”表示使用任意寄存器来存放变量a和b<em>的</em>值,多个变量使用逗号分隔。

    91520

    C++】泛型编程 ⑤ ( 函数模板原理 | C++ 编译器原理 | C C++ 编译器编译过程 | 分析 模板函数代码 汇编文件 | 编译 模板函数代码 汇编文件 | 模板函数汇编分析总结 )

    , 在本篇博客中 分析 C++ 编译器 函数模板 实现底层机制 ; 一、C++ 编译器原理 1、gcc 编译器简介 gcc 编译器 英文名称是 " GNU C Compiler " , 支持编译多种语言...编译器 , 汇编器 , 链接器 四个工具 集成到了一起 ; 打开 Visual Studio 中解决方案 所在目录 , 其中就有 编译过程 中产生大量 中间文件 ; 3、gcc 编译器各阶段命令 ①...在C++中,编译器会为每个模板函数生成一个特定符号名称,这是模板函数实例化。...汇编文件 分析总结 ( 重要 ) C++ 编译器函数模板 编译成了 汇编函数 call __Z3addIiET_S0_S0_ ; 如果 向 函数模板 中传入不同函数 , 会生成 多个不同 汇编函数...定义在了一起 , 则 C++ 编译器 编译 汇编文件 时 , 就直接使用 普通函数 替代 为 函数模板 重新生成一个 函数实例 ; C++ 编译器 通过 两次编译 实现上述效果 ; 第一次编译 会对

    40620

    浅析C++this指针

    下面通过查看上面代码VC 2005编译后汇编代码来详细解释一下神奇this指针。...上面的C++代码编译生成汇编代码是下面的形式: CNullPointCall * pNull = NULL; 0041171E mov dword ptr [...看call 3那行C++代码汇编代码就可以看到this指针跟一般函数参数区别:一般函数参数是直接压入栈中(push 0Dh),而this指针却被放到了ecx寄存器中。...: CTest test; test.SetValue(); 上面的C++代码汇编代码为: CTest test; test.SetValue(); 004117DC...通过上面的分析,我们可以从底层了解了C++中this指针实现方法。虽然不同编译器会使用不同处理方法,但是C++编译器必须遵守C++标准,因此对于this指针实现应该都是差不多

    75610

    函数调用时堆栈变化情况

    函数一般要利用参数,而且内部也会用到局部变量,在对表达式进行求值时,编译器还会生成一些无名临时对象,这些对象都是存放在堆栈上。 下面以Visual C++编译器为例进行研究,考察如下程序。...} int main() { int res=mixAdd(4,'A'); printf("%c",res); } 在VS2012环境下,以C/C++默认函数调用约定__cdecl来生成该程序调试版本...mov ebp,esp //建立本函数帧指针 sub esp,xxx //为函数局部变量分配空间 这是所有C/C++函数汇编代码所共同遵循规范。...2. main()函数对应汇编代码注意要点 main()函数汇编代码大致与mixAdd()相似,但也有不同之处,需要注意一下几点。...RTC_CheckEsp (01E1136h) 上面两条汇编用于表示VC编译器提供了运行时刻对程序正确性/安全性一种动态检查,可以在项目属性C++选项中打开来启用Runtime Check。

    76410

    Java 学习笔记(1)——java基础语法

    由于我自己之前学过C/C++,而Java语法与C/C++基本类似,所以这一系列文章我并不想从基础一点点写,我想根据我已有的C/C++经验,补充一些需要注意点,或者java中独特内容,或者将C/C...当然得学计算机里面最难语言,所以我大学从3年级开始学了大半年汇编,又从汇编转到CC++。...这里我想应该是在执行时候,java命令根据类名去找对应.class 文件,将文件中二进制字节码放到虚拟机中执行。然后由虚拟机去类中查找main函数,从main函数中执行。...答案是不行,由于main函数是一个入口函数,一切都从它开始,如果它是一个类函数,那么势必要定义一个类对象然后再调用对象main方法,可是既然main是程序开始,请问如何在调用main之前定义对象呢...这就很奇怪了。 还记得在学习C/C++中提到编译器优化吗。

    48920

    如何半天学会一门汇编

    本文讲述如何用半天时间学会一门汇编诀窍。在学习汇编过程,最好用Visual Studio调试,打开汇编模式,把栈视图和寄存器视图都打开。函数调用使用cdecl,在调试过程中使用汇编单步。...讲C语言就是讲C语言,讲C++也只是讲C++,讲汇编也是只是讲汇编。至于C/C++汇编之间对比和联系呢?没有。...在所有的编程语言中,这三样东西基本上是不可或缺函数 程序执行顺序 数据结构 所以,重要是建立这三样东西在高级编程语言C/C++汇编对应关系。...如果通过栈来传递,标志栈是哪个寄存器? 在C++情况下,成员函数参数传递又是如何? 当前函数哪个寄存器表示? 函数执行完,如何返回调用者?...了解一下编译器会生成哪些汇编 编写没有参数有返回值函数,return 1+1操作,了解返回值是放在哪个寄存器

    83310

    关于函数参数入栈思考(函数调用约定,入栈顺序)

    使用__fastcall方式无法用作跨编译器接口。 __thiscall调用约定 是唯一一个不能明确指明函数修饰,因为thiscall不是关键字。它是C++类成员函数缺省调用约定。...---- 2.cout<<++i<<- -i<< i++;输出结果讨论 在Visual C++函数调用规范中,如果函数任何一个参数表达式包含自增(自减)运算,所有这些运算会在第一个push操作之前全部完成...但是在Visual C++中运行结果是11,11和10。...汇编代码中cmp ebx,esp和call __RTC_CheckEsp (0EF12DFh) 表示VC编译器提供了运行时刻对程序正确性/安全性一种动态检查,可以在项目属性C++选项中打开来启用Runtime...由于在Visual C++中,调用对象成员函数之前会先将对象地址存放在寄存器ecx中,所以在下一次调用cout.operator<<之前,会先将eax值送入ecx中。

    2.6K31

    从基础入门到学穿C++(C++语法基础篇)【超详细】【一站式速通】

    << endl; return 0; } 上述代码表明,编译器会将cout解释为你定义变量,而不是标准库中对象,从而导致编译错误。...修饰函数叫做内联函数,编译时C++编译器会在调用内联函数地方展开,没有函数压栈开销,内联函数提高程序运行效率。...> C/C++ --> 常规 --> 优化 --> 内联函数扩展 注意:设置内联函数只是向编译器发出一个请求,采用不采用还是看编译器本身。...函数重载 C++支持重载,C语言为什么不支持 1、预处理:头文件展开、宏替换、条件编译、去掉注释 list.i test.i 2、编译:检查语法,生成汇编代码 list.s test.s 3、汇编汇编代码转换成二进制机器码...objdump -S executable_file 可以使用上面的命令进行反汇编二进制目标文件命令 ##nullptr(指针) 在C++中,我们在表示指针时候要把C语言中惯用NULL换成nullptr

    71510

    打开C嘎嘎大门:你好,C嘎嘎!(2)

    ,这里小编顺便吐槽一下C++一个小缺点,C++有时候对于一种新概念定义,操作符可能以前在C语言时候学习到操作符,所以每个操作符可能会有双重含义,小编认为可能祖师爷认为符号太多会让人记不住...其实这个函数在传回来值时候,会先创建一个临时对象来接受此函数值,临时对象就是编译器需要一个空间暂存表达式求值结果时临时创建一个未命名对象,在C++规定中,临时对象具有常性,然后通过临时对象传递回主函数...本来小编在这里不太想多解释,但实际上,在底层中,引用也是需要开辟空间,此时我们需要借助汇编代码进行查看,下面小编放上两张图各位就知道小编为什么说引用其实也开辟空间了: 首先我们先不用管汇编代码是什么...,因为C++规定中没有明确规定,inline适用于一些被频繁调用短小函数,对于一些代码量大,递归函数是不会展开 其实编译器也是有自己思想,事项一下,如果一个代码量比较大函数展开了,是不是就增加了编译器负担...NULL组成部分: 从上图我们可以清晰看出,在C语言阶段时NULL代表着(void*)0,而在C++NULL,其实就是0,无论采取了什么定义,在使用指针时,都会遇到一些麻烦,下面小编通过代码进行解释

    7010

    小朋友学C语言(2):安装Dev C++编译器

    源代码一般为高级语言 (High-level language), 如CC++、Java或汇编语言,而目标则是机器语言目标代码(Object code),有时也称作机器代码(Machine code...(二)C语言编译器 Windows上C编译器有Turbo C,VC 6.0,Visual Studio, Dev C++等。 Turbo C界面看起来不那么舒服。...Visual Studio极其庞大,安装文件有几个G,主要用于工业项目的开发。 所以,Win系统下推荐安装Dev C++。 苹果电脑Mac系统下,直接标配Xcode编译器就行。...(四)Dev C++编写第一个程序 1 首先在硬盘里建立一个目录,比如D:\CProjects用来存放即将编写C程序 2 点击左上角File-->New-->Project,打开一个新项目 ?...6 点击“Compile & Run”按纽,或按快捷键“F11”,在弹出界面中,将main.c改为HelloWorld.c,点击“保存”按钮 ? 7 显示运行结果,成功!

    2.8K70

    斩获 3.4k+ Star C++ Insights:编译器视角看源码!

    C++ Insights,特色就是:编译器眼睛看源码。...C++ Insights 是一种基于 Clang 工具,可进行源码到源码转换,其目标是揭示通常情况下编译器在幕后为我们做工作。它能帮我们看到编译器为了让代码正常运行而进行一些神奇操作。...当然,至少对于 Clang 来说,是有 AST(抽象语法树)转储功能,我们可以 Compiler Explorer 等工具查看编译器C++ 源代码片段生成代码。...另外,在教学生 C++ 时,如果跟他们展示 AST 并解释说这就是全部内容,我自己感觉也不太满意。 于是,我开始着手编写一个基于 Clang 工具,可将基于范围 for 循环转换为编译器内部版本。.../scripts/getinclude.py` 自定义 GCC 安装 如果你是自定义版本 GCC 编译器,例如 gcc-11.2.0,且未安装在编译器默认系统路径中,那么在构建后,Clang 将无法找到正确

    31910

    C++动态联编实现原理分析

    C++标准并没有规定如何实现动态联编,但大多数C++编译器都是通过虚指针(vptr)和虚函数表(vtable)来实现动态联编。...在不同编译器中,虚指针在对象中位置时不同。两种典型做法是: (1)在Visual C++中,虚指针位于对象起始位置; (2)在GNU C++中,虚指针位于对象尾部而不是头部。...可通过下面的程序考察在Visual C++中,虚指针在对象中位置。...但是,对于类非静态成员函数,不可以直接获取类成员函数地址,需要利用内联汇编来获取成员函数入口地址或者union类型来逃避C++类型转换检测。...在Visual C++中,在调用类费静态成员函数之前,对象首地址都是送往寄存器ecx

    1.7K30

    C++概述

    基本上,我们电脑桌面上主流应用程序,像QQ,迅雷,影音播放器,浏览器,杀毒软件,单机游戏等等都是C++;在web领域搜索引擎还必须用C++做;在网络世界里,我们所玩过一切网游皆是C++杰作,...打遍天下无敌手 AlphaGo 我们之前看新闻知道GoogleAlphaGo下围棋水平已经是我们人类所达不到了。其背后也是C++和神经网络编写。...1.5 C++常见发展方向 C++ 几个常见发展方向:客户端,游戏,服务端,嵌入式,移动端(移动只要是跨平台移动端C++写通用部分,GUI可以平台特性,也可以C++跨平台框架) 针对界面UI...本身C/C++就是跨平台。 另外,大家感兴趣,远程控制软件,什么木马、外挂等等,可以说95%以上都是C/C++来写。...>demo.exe 2.5 编码规范及注释 C++编码风格 每条语句占一行 每个函数都有一个开始和结束花括号,花括号各占一行 函数语句对相对于花括号进行缩进 与函数名称相关小括号周围没有空白 书写注释是一个良好编程习惯

    88930
    领券