C++反汇编实例(1)-输出多行

111

 1 //程序说明:输出多行内容,内容如下
 2 /*
 3    *
 4   ***
 5  *****
 6 *******
 7  *****
 8   ***
 9    *
10 */
11 #include <iostream>
12 using namespace std;
13 int main()
14 {
15     cout << "   *" << endl;
16     cout << "  ***" << endl;
17     cout << " *****" << endl;
18     cout << "*******" << endl;
19     cout << " *****" << endl;
20     cout << "  ***" << endl;
21     cout << "   *" << endl;
22     system("pause");
23     return 0;
24 }

debug版反汇编代码

int main()
{
00F55E70  push        ebp  //进入函数后的第一件事,保存栈底指针ebp,退出函数时还原栈底
00F55E71  mov         ebp,esp  //调整栈底指针到栈顶
00F55E73  sub         esp,0C0h  //为局部变量申请空间
00F55E79  push        ebx
00F55E7A  push        esi
00F55E7B  push        edi  //寄存器压栈,保存现场
00F55E7C  lea         edi,[ebp-0C0h]  //将为局部变量申请的空间(栈中)的首地址(偏移)放入edi中
00F55E82  mov         ecx,30h  //设置rep stos的循环次数
00F55E87  mov         eax,0CCCCCCCCh  //debug下,为调试方便,将局部变量初始化为OCCCCCCCCh。
00F55E8C  rep stos    dword ptr es:[edi]  //用eax的值初始化到es:[edi]指向的地址,以dword(4字节)为单位,循环次数为ecx的值。
    cout << "   *" << endl;
00F55E8E  mov         esi,esp
00F55E90  push        0F513DEh
00F55E95  push        0F5CC70h
00F55E9A  mov         eax,dword ptr ds:[00F6009Ch]
00F55E9F  push        eax
00F55EA0  call        std::operator<<<std::char_traits<char> > (0F512A8h)  //调用cout对象的成员函数operator<<(重载操作符<<)。
00F55EA5  add         esp,8
00F55EA8  mov         ecx,eax
00F55EAA  call        dword ptr ds:[0F60090h]
00F55EB0  cmp         esi,esp
00F55EB2  call        __RTC_CheckEsp (0F5132Fh)  //debug下特有的函数,用来检测栈平衡,所有函数退出时,都使用该函数。
    cout << "  ***" << endl;
...............................
.................................
...............................
system("pause");
00F55FAD  mov         esi,esp
00F55FAF  push        0F5CC94h
00F55FB4  call        dword ptr ds:[0F601D0h]
00F55FBA  add         esp,4
00F55FBD  cmp         esi,esp
00F55FBF  call        __RTC_CheckEsp (0F5132Fh)
    return 0;
00F55FC4  xor         eax,eax
}
00F55FC6  pop         edi
00F55FC7  pop         esi
00F55FC8  pop         ebx  //恢复现场。
00F55FC9  add         esp,0C0h  //C/C++的函数调用约定默认是_cdecl调用方式,由调用放平衡堆栈。
00F55FCF cmp ebp,esp 00F55FD1 call __RTC_CheckEsp (0F5132Fh) 00F55FD6 mov esp,ebp 00F55FD8 pop ebp //还原栈底指针 00F55FD9 ret 

release版反汇编代码

时间: 2024-11-17 16:40:31

C++反汇编实例(1)-输出多行的相关文章

输出多行字符的一个简单JAVA小程序

1 public class JAVA 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("----------------------"); 6 System.out.println("|| 我要学会 ||"); 7 System.out.println("|| JAVA语言 ||"); 8 System.out.println("-------

详解著名的awk Oneliner,第三部分:选择性输出特定行

详解著名的awk Oneliner,第三部分:选择性输出特定行 输出文件的前10行(模拟 head -n 10 ) awk ' NR < 11 ' 如前所述,这里省略了动作,即为打印输出.匹配模式是变量NR需要小于11,NR即为当前的行号.这个写法很简单,但是有一个问题,在NR大于10的时候,awk其实还是对每行进行了判断,如果文件很大,比如说有上万行,浪费的时间是无法忽略的.所以,更好的写法是 awk '1; NR = 10 { exit }' 第一句对当前行进行输出.第二句判断是不是已经到了

使用嵌套while循环输出10行10列的星号

//while-if嵌套 /*char n='*'; int m=1; System.out.println("==输出10行10列的星号=="); while(m<101){ System.out.print(n+" "); if(m%10==0){ System.out.println(); } m++; */ //while-while嵌套循环 int m=1; int n=1; while(m<=10){ while(n<10){ Syst

关于SQL储存过程中输出多行数据

declare @num1 int           --为符合条件的总行数 select @num1=COUNT(1) from cardInfo where openDate between @date1 and @date2 [email protected] 和 @date2 为开始时间到结束时间,可以理解一个条件 while(@num1<>0) --和下面的[email protected]=1形成循环的次数begin print @num1                    

Shell脚本——cat/EOF输出多行

在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中.(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判断生成不同的最终文件等等.一.cat和EOFcat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的:EOF是“end of file”,表示文本结束符.结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果.二.使用看例子是最快的熟悉方法: # cat <<

Python3基础 用三个双引号 print输出多行文本

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 str=""" 2 你好, 3 这是一个多行的文本 4 好多行 5 """ 6 print(str) 2 show ------------------------------------------博文的精髓,在技术部分,更在镇

java 实例 判断输出的括号是否成对出现

输入: {}() ({()}) {}( [] 输出: true true false true 代码: import java.util.Scanner; import java.util.Stack; import java.util.HashMap; class Solution { public static void main(String[] args) { /* Create HashMap to match opening & closing brackets */ HashMap

输出三角行

package dududu; public class DDDddd { public static void main(String[] args) { // TODO 自动生成的方法存根 for(int i=1;i<=5;i++){ for(int j=5-i;j>0;j--){ System.out.print(" "); } for(int k=1;k<=2*i-1;k++){ System.out.print("*"); } Syste

shell编程-实例之输出系统信息

输出系统信息 #!/bin/bash if [ $# -eq 0 ];then echo "---------------------------------------------------------------------------" # OS Type echo " OS Type: $(uname -o)" # OS Release Version and Name echo "OS Release Version and Name: $(c