首页
社区
课程
招聘
[旧帖] [求助]c++小程序汇编后的问题 0.00雪花
发表于: 2009-6-19 10:10 1414

[旧帖] [求助]c++小程序汇编后的问题 0.00雪花

2009-6-19 10:10
1414
源程序是这样的:
#include <iostream.h>
void main()
{
        if (int i=1)
        {
                cout<<i;
        }

}
在VC下的样子,

5:        if (int i=1)
00401028   mov         dword ptr [i],1
0040102F   cmp         dword ptr [i],0
00401033   je          main+33h (00401043)
6:        {
7:            cout<<i;
00401035   mov         eax,dword ptr [i]
00401038   push        eax
00401039   mov         ecx,offset cout (0042e060)
0040103E   call        ostream::operator<< (00401070)
8:        }

00401028   mov         dword ptr [i],1
就是这句不太明白,他是什么意思,i是个什么数呢,这个1赋给了那里啊?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 398
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你一定是在“Debug”方式下用VC进行反汇编的,要知道,VC为了使反汇编代码更加容易看懂(也就是更具可读性),在用VC IDE中显示反汇编代码时,反汇编代码里会保留原程序中的一些变量名(如你的例子中的i)。
想要看正真的反汇编代码,请在将VC程序编译连接好(例如 1.exe )后,用一个反汇编软件(如OD)再重新打开这个可执行文件(1.exe)即可。
2009-6-19 10:54
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
LZ的程序是把1赋给i,然后判断如果表达式为真的话便输出1。这里表达式永远为真(LZ是故意的还是错把==打成=了?)。

00401028   mov         dword ptr [i],1
这行语句是把1放到以变量i的地址为起始的4字节内存中。[]是取地址处内容,里面的i代表这个变量的地址。

0040102F   cmp         dword ptr [i],0
本语句执行if命令。

00401033   je          main+33h (00401043)
如果上个语句判断表达式为假就跳转。

后面的就是调用cout了。
2009-6-19 13:05
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
嗯,2楼说的不错,我用OD 看看
2009-6-19 19:16
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
才开始学习汇编不懂 楼主 说的什么
2009-6-19 19:32
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
int i =1,这里是个赋值语句,你看到的没有错误。
2009-6-22 12:03
0
雪    币: 68
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我刚才把楼主的程序放到VC 6里编译运行了一下,发现还需要加一个头文件,#include "stdafx.h"。另外if (int i = 1)没有错,如果换成了if (int i == 1) 反而出错了。还有,谢谢wzjok的回答,我早就有这个疑问了,就是VC里的汇编语句和OD反汇编之后的语句有一些出入,像我这样的初学者经常会搞糊涂了。

采用OD反汇编后,部分
00401010 >|> \55            PUSH EBP
00401011  |.  8BEC          MOV EBP,ESP
00401013  |.  83EC 44       SUB ESP,44
00401016  |.  53            PUSH EBX
00401017  |.  56            PUSH ESI
00401018  |.  57            PUSH EDI
00401019  |.  8D7D BC       LEA EDI,DWORD PTR SS:[EBP-44]
0040101C  |.  B9 11000000   MOV ECX,11
00401021  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00401026  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401028  |.  C745 FC 01000>MOV DWORD PTR SS:[EBP-4],1
0040102F  |.  837D FC 00    CMP DWORD PTR SS:[EBP-4],0
00401033  |.  74 0E         JE SHORT cc.00401043
00401035  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00401038  |.  50            PUSH EAX                                 ; /Arg1
00401039  |.  B9 B88B4200   MOV ECX,OFFSET cc.cout                   ; |
0040103E  |.  E8 5DA30000   CALL cc.ostream::operator<<              ; \ostream::operator<<

VC自带的汇编,部分
        push        ebp
        mov        ebp, esp
        sub        esp, 68                                        ; 00000044H
        push        ebx
        push        esi
        push        edi
        lea        edi, DWORD PTR [ebp-68]
        mov        ecx, 17                                        ; 00000011H
        mov        eax, -858993460                                ; ccccccccH
        rep stosd

; 8    :   if (int i=1)

        mov        DWORD PTR _i$1289[ebp], 1  ;好像跟楼主的都还不一样,楼主的是  mov         dword ptr [i],1
        cmp        DWORD PTR _i$1289[ebp], 0  ;是不是因为我和楼主的编译器不一样的缘故?
        je        SHORT $L1290

; 10   :     cout<<i;

        mov        eax, DWORD PTR _i$1289[ebp]
        push        eax
        mov        ecx, OFFSET FLAT:?cout@@3Vostream_withassign@@A
        call        ??6ostream@@QAEAAV0@H@Z                        ; ostream::operator<<
2009-7-17 14:03
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
呵呵,使用反汇编的工具不同吧。
2009-7-17 14:45
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
od反汇编怎么看不懂啊,谁给解释一下?~~~~
2009-7-17 15:42
0
游客
登录 | 注册 方可回帖
返回
//