`
yiyeqinghuasoon
  • 浏览: 680990 次
文章分类
社区版块
存档分类
最新评论

菜鸟学反汇编3—cout

 
阅读更多

c++代码:

c++代码:

c++代码:

#include<iostream>

#include<iostream>

#include<iostream>

using namespace std;

using namespace std;

using namespace std;

int main()

int main()

int main()

{

{

{

cout<<"输出";

cout<<"输出"<<endl;

cout<<"输出"<<"Good"<<endl;

return 0;

return 0;

return 0;

}

}

}

push offset sub_401030

push offset sub_401040

push offset aGood ; "Good"

push offset aF ; "?

push offset aF ; "?

push offset aF ; "?

push offset unk_41A468 ; int

push offset unk_41A468 ; int

push offset unk_41A468 ; int

call sub_401020

call sub_402230

call sub_402240

add esp, 8

add esp, 8

add esp, 8

push eax ; int

call sub_402240

add esp, 8

mov ecx, eax

mov ecx, eax

call sub_401050

call sub_401060

以下着重研究最后一段代码

push offset sub_401040

可以看出这个与<<endl;有关。

push offset aGood ; "Good"

push第二个输出内容,但是它没有和下面的参数一起被处理 ,而是在先输出输出之后的另一个call里才使用到了它。可见处理cout是先将所有参数都push了,然后再一个一个处理。

push offset aF ; "?

这三行是一个整体,即可以辨别sub_402240这个函数需要两个参数,而我一直对第一个参数不理解是什么作用。这个整体运行完就会出现输出而没有”Good”

push offset unk_41A468 ; int

call sub_402240

add esp, 8

这行是清理掉上个函数所用到的两个参数。同时使”Good”成为栈顶

push eax ; int

这个和push offset unk_41A468 ;应该差不多,但是这个eax是怎么来的呢?我一直追踪下去,没有什么斩获,是我能力太低了的原因。但是可以猜测它的作用的。

call sub_402240

add esp, 8

清理掉上个函数所用到的两个参数。使offset sub_401040成为栈顶

mov ecx, eax

这步的用意是什么?可能是后一个call使用到了ecx这个参数。

call sub_401060

前面的一切疑惑要深入这个函数才能知晓,比如最先push的那个参数怎么没有使用和销毁呢?

现在来看看sub_401060里面的代码

sub_401060 proc near

var_4= dword ptr -4

这是解释代码,即可理解为var_4esp-4处的空间

arg_0= dword ptr 8

这是解释代码,即可理解为arg_0esp+8处的空间

push ebp

mov ebp, esp

push ecx

mov [ebp+var_4], ecx

这两句其实就是mov eax,ecx。至于为什么这么做就不清楚了?结合上面的代码mov ecx,eax。发现这就是一个循环, 只可以猜测这样的处理是因为之后call 的函数之中也有用到ecx(可能里面还是一个这个循环)。

mov eax, [ebp+var_4]

push eax

call [ebp+arg_0]

add esp, 4

这两句很奇怪啊,既然之后要给esp赋值,为什么之前还要有一次对它进行+操作?之前有两个push,则这步使esp编程这个子程没有被调用之前的值。即清理掉了前两个参数。

mov esp, ebp

pop ebp

retn 4

这句返回esp+4地址。即跳过了call操作push入的地址而跳到主体push offset sub_401040.压入的 sub_401040.

反思:

还有很多细节没有弄清楚

下步:

增加cin

分享到:
评论

相关推荐

    通过反汇编理解 C++语言实质探讨

    ### 通过反汇编理解 C++语言实质探讨 #### 面向对象程序设计的特点及其挑战 面向对象的程序设计(Object-Oriented Programming, OOP)作为一种编程范式,其核心理念在于模拟现实生活中的对象行为。这种方法相较于...

    深入C++虚表(虚函数 虚表 反汇编)

    ### 深入C++虚表(虚函数 虚表 反汇编) #### 一、引言 多态性是C++语言的核心特性之一,它允许子类重写父类的行为,使得不同类型的对象能够响应相同的接口,进而提高了程序的可扩展性和灵活性。在C++中,实现多态性...

    反汇编角度分析VC++面向对象机制

    ### 反汇编角度分析VC++面向对象机制 #### 一、构造函数的特性与表现形式 ##### 1.1 构造函数的返回值问题 通常我们认为构造函数是没有返回值的,但是在实际的实现中,它确实会返回一个值——当前对象的`this`...

    cout不打印,不显示,不输出 怎么办?

    在编程过程中,尤其是在C++语言环境下,我们经常使用`std::cout`来实现标准输出,例如打印变量的值或者向控制台输出文本。然而,有时可能会遇到`cout`不打印、不显示或不输出的情况,这通常是由于多种原因引起的。让...

    C++中Cout的详细实现介绍

    ### C++中Cout的详细实现介绍 #### 一、C++中的标准输出流:`cout` 在C++中,`cout`是一个非常重要的概念,它代表标准输出流,主要用于将信息输出到标准输出设备(通常是用户的终端或屏幕)。与C语言中的`printf`...

    cin与cout的用法

    ### cin与cout的用法详解 #### 一、标准输入函数cin `cin`作为C++中的标准输入流,主要用于从标准输入设备(通常是键盘)读取数据。它的工作原理基于流的操作,与传统的C语言中的`scanf`有所不同。下面我们将详细...

    ncout高阶格式化操作

    std::cout (3) ; // 输出 9.400e+0 return 0; } ``` 在这个例子中,我们首先使用`setprecision(2)`和`fixed`控制浮点数以固定小数点的形式显示,并保留两位小数。然后,我们改变`setprecision(3)`并使用`...

    printf和cout的比较.pdf

    在深入探讨printf和cout的差别之前,我们有必要先了解它们各自在C++中的基本用法。C++标准库中的iostream提供了cout流用于输出,而printf作为C语言时期的遗留产物,在C++中仍可使用,因为它定义在C库头文件stdio.h中...

    cin与cout用法

    本文件是对cin和cout一些用法的总结,框图结构,需要用mindjet打开,(同时推介一下mindjet这款工具,很适合代码爱好者总结)。对cin、cout用法迷惑的请进

    cout输出格式控制

    在C++编程中,对cout这类输出流进行格式控制是一种常见的操作,主要目的是为了使输出结果更加符合预期的格式,比如控制宽度、对齐方式、填充字符、精度等。这种格式控制功能主要依靠操纵运算子来实现,而这些操纵运...

    C/C++输出彩色文字printf和cout显示的文字是彩色的有颜色的

    标题和描述中提到的就是如何利用`printf`和`cout`实现这一功能。下面将详细介绍如何在C/C++中实现彩色文字的输出。 首先,`printf`和`cout`分别是C和C++中的标准输出函数,用于向控制台打印信息。在默认情况下,...

    cout格式控制

    cout (2) &lt;&lt; 3.14159; // 输出为"3.14" return 0; } ``` #### 四、示例:混合格式输出 假设我们需要输出一个浮点数和一个字符串,并且希望它们能够按照指定的宽度对齐。我们可以使用`setw`来设置输出宽度,并...

    好cout.zip

    标题中的"好cout.zip"可能是指一个包含了与C++编程语言相关的示例代码或教程的压缩文件,因为"Cout"是C++标准库中的一个关键组件,用于在控制台上输出文本。然而,从描述和标签来看,实际内容似乎与ASP(Active ...

    C++cout介绍及使用说明

    C++中的`cout`是面向对象编程中的一个核心概念,属于I/O流库的一部分,主要用于控制台输出。`cout`全称为"console output",它是一个预定义的对象,与`ostream`类关联,允许程序员方便地将各种类型的数据打印到屏幕...

    基于对话框例子程序,MFC调用控制台,利用cout、printf输出信息

    这个标题所指的示例程序是关于如何在MFC对话框应用程序中调用控制台并使用`cout`和`printf`函数输出信息的。这种做法通常用于调试或在应用程序中集成简单的命令行功能。 首先,让我们深入理解MFC对话框应用程序。在...

    新版EditLog,重定向cout内容到CEdit窗口

    重定向cout内容到CEdit窗口,新版本EditLog支持VC++2010; 旧版信息 /*\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ \ editlog.h, Fast asynchronous text logging using a ...

    C++输入输入 cin cout

    在C++编程语言中,`cin`和`cout`是两个非常基础且重要的概念,它们分别用于标准输入(从键盘或其他输入设备获取数据)和标准输出(向屏幕或其他输出设备显示数据)。`cin`和`cout`是C++标准库中的流对象,属于`...

    入门引导 cout(上篇).pdf

    在信息奥赛竞赛中,掌握基本的编程技能是非常重要的,尤其是对于初学者而言...在信息学奥赛中,这将帮助你解决各种问题,提高编程能力。继续学习和实践,你会发现C++的`cout`以及其他输出功能在竞赛编程中的无穷潜力。

    入门引导 cout(下篇).pdf

    本文将深入探讨在信息学奥赛中如何利用`cout`进行格式化的输出,特别是关于设置输出进制、控制小数精度、设定输出宽度以及填充字符等方面的知识。 1. **指定进制** 在C++中,我们可以改变输出数字的进制,比如从十...

    MFC里用控制台输出(Printf,cout等函数)

    把此头文件放到VC编译器的安装盘的include目录, 1.在编程界面#include , 2.在程序初始化里引用函数:couts(); 就可以了;

Global site tag (gtag.js) - Google Analytics