能力值:
( LV4,RANK:50 )
|
-
-
2 楼
你一定是在“Debug”方式下用VC进行反汇编的,要知道,VC为了使反汇编代码更加容易看懂(也就是更具可读性),在用VC IDE中显示反汇编代码时,反汇编代码里会保留原程序中的一些变量名(如你的例子中的i)。
想要看正真的反汇编代码,请在将VC程序编译连接好(例如 1.exe )后,用一个反汇编软件(如OD)再重新打开这个可执行文件(1.exe)即可。
|
能力值:
( 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了。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
嗯,2楼说的不错,我用OD 看看
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
才开始学习汇编不懂 楼主 说的什么
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
int i =1,这里是个赋值语句,你看到的没有错误。
|
能力值:
( 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<<
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
呵呵,使用反汇编的工具不同吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
od反汇编怎么看不懂啊,谁给解释一下?~~~~
|
|
|