注册 登录
编程论坛 汇编论坛

关于C++for循环反汇编的问题,请大神指教

anann 发布于 2015-06-23 11:55, 5340 次点击
原博客的网址http://blog.
我想弄明白这个博客里面的意思,但是我在VC里面经过测试没有发现++的先后顺序的差别,但是,我就想去学反汇编,听说反汇编要汇编基础,我现在在学王爽的汇编语言,请问学完后我可以看懂这段代码吗
i++情况

; 9    :  int c;
; 10   :  for(int i=0;i<=50;i++)

 mov DWORD PTR _i$20035[ebp], 0
 jmp SHORT $LN3@wmain
$LN2@wmain:
 mov eax, DWORD PTR _i$20035[ebp]
 add eax, 1
 mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
 cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
 jg SHORT $LN1@wmain

; 11   :   c=c+i;

 cmp BYTE PTR $T25811[ebp], 0
 jne SHORT $LN6@wmain
 push OFFSET $LN7@wmain
 call __RTC_UninitUse
 add esp, 4

 

++i情况

; 9    :  int c;
; 10   :  for(int i=0;i<=50;++i)

 mov DWORD PTR _i$20035[ebp], 0
 jmp SHORT $LN3@wmain
$LN2@wmain:
 mov eax, DWORD PTR _i$20035[ebp]
 add eax, 1
 mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
 cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
 jg SHORT $LN1@wmain

; 11   :   c=c+i;

 cmp BYTE PTR $T25811[ebp], 0
 jne SHORT $LN6@wmain
 push OFFSET $LN7@wmain
 call __RTC_UninitUse
 add esp, 4
$LN6@wmain:
 mov eax, DWORD PTR _c$[ebp]
 add eax, DWORD PTR _i$20035[ebp]
 mov BYTE PTR $T25811[ebp], 1
 mov DWORD PTR _c$[ebp], eax
 jmp SHORT $LN2@wmain
$LN1@wmain:
19 回复
#2
zklhp2015-06-23 14:06
我想弄明白这个博客里面的意思,但是我在VC里面经过测试没有发现++的先后顺序的差别


我没看博客

i++和++i的区别C语言里说的很明白 一个是先取值后递增 一个是先递增后取值

但是,我就想去学反汇编,听说反汇编要汇编基础,我现在在学王爽的汇编语言,请问学完后我可以看懂这段代码吗


下面的汇编代码是编译器生成的罢(?) 看着很乱的。。。

i++情况

; 9    :  int c;
; 10   :  for(int i=0;i<=50;i++)

mov DWORD PTR _i$20035[ebp], 0
jmp SHORT $LN3@wmain
$LN2@wmain:
mov eax, DWORD PTR _i$20035[ebp]
add eax, 1
mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
jg SHORT $LN1@wmain



; 11   :   c=c+i;

cmp BYTE PTR $T25811[ebp], 0
jne SHORT $LN6@wmain
push OFFSET $LN7@wmain
call __RTC_UninitUse
add esp, 4



++i情况

; 9    :  int c;
; 10   :  for(int i=0;i<=50;++i)

mov DWORD PTR _i$20035[ebp], 0
jmp SHORT $LN3@wmain
$LN2@wmain:
mov eax, DWORD PTR _i$20035[ebp]
add eax, 1
mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
jg SHORT $LN1@wmain

; 11   :   c=c+i;

cmp BYTE PTR $T25811[ebp], 0
jne SHORT $LN6@wmain
push OFFSET $LN7@wmain
call __RTC_UninitUse
add esp, 4
$LN6@wmain:
mov eax, DWORD PTR _c$[ebp]
add eax, DWORD PTR _i$20035[ebp]
mov BYTE PTR $T25811[ebp], 1
mov DWORD PTR _c$[ebp], eax
jmp SHORT $LN2@wmain
$LN1@wmain:


不用懂汇编 你比较一下就会发现其实是一样的

因为你这里 ++i或者i++都是在循环里面计数的 两种写法其实没区别的

有比较大区别的时候是C++里面 当运算符重载后 对于一些比较复杂的类型 先递增后取值可能比先取值后递增效率高 我估计你看的那个文章里面写的也是类似的东西 但这个差别实在是太小太小了 深究这点区别实在没意思 对于实际的程序 连0.1%的影响都没有
#3
取名字2015-06-23 16:34
在这2个循环里面看不出区别,如果有赋值操作的话可以看出区别。
看完王爽的汇编语言可以看懂这些。
了解汇编语言对于了解机器底层还是有帮助的。
#4
anann2015-06-23 21:01
回复 2楼 zklhp
但是我就想要弄明白反汇编,看看反汇编出的代码里面是否真的有差异,差异在哪,对不理解的东西,始终有一种想弄明白的心理,不是么

#5
anann2015-06-23 21:01
回复 3楼 边小白
我也觉得有一点退化
#6
anann2015-06-23 21:02
回复 4楼 取名字
看完王爽的汇编语言后,我应该再看些什么书能对这个问题有用呢?
#7
取名字2015-06-23 23:16
反汇编中看到有不懂的指令,百度一下,应该都能找到比较详细的解释。
如果你觉得看书比较系统的话,可以看一下《IBM—PC汇编语言程序》,涉及到API函数的话,可以看一下《Windows环境下32位汇编语言程序设计》。
个人见解。
#8
anann2015-06-25 14:08
回复 8楼 取名字
<<Windows环境下32位汇编语言程序设计>>这本书可能我程度不够,看到实模式,什么模式就晕
那我先看完王爽的<<汇编语言>>,如果还是不会反汇编,就再看一下<<IBM—PC汇编语言程序>>?
#9
hu9jj2015-06-26 06:48
以下是引用边小白在2015-6-26 06:26:15的发言:

我不知道谁是王爽,我就只百度。比如,我已经知道实模式是兼容原16位机的模式,是32位CPU默认启动模式。

知道百度就会知道王爽的。
#10
zklhp2015-06-26 22:03
以下是引用hu9jj在2015-6-26 06:48:46的发言:

 
知道百度就会知道王爽的。
http://baike.baidu.com/subview/695408/9807976.htm

也是个有故事的人 只不过什么故事我也不知道
#11
zklhp2015-06-27 08:01
以下是引用边小白在2015-6-27 05:47:51的发言:

没什么成就嘛。才宁夏大学毕业的,我碰到的高考小孩没一个正眼瞧的上的。

英雄不问出处 你看后面的介绍还是挺牛的嘛
#12
anann2015-06-27 09:31
回复 10楼 边小白
???

[ 本帖最后由 anann 于 2015-6-27 09:39 编辑 ]
#13
anann2015-06-27 09:34
???


[ 本帖最后由 anann 于 2015-6-27 09:39 编辑 ]
#14
anann2015-06-27 09:37
我是第一次使用论坛,为什么我引用和回复会转到其他的帖子啊
实模式是就是CS:IP送入地址加法器,在输入输出控制电路中将地址送入内存.取出内存中的值.然后送入地址缓存器执行,是这样的吗?那保护模式和虚拟86模式又是怎么工作的呢?百度查过,还是不太懂啊,请大神指教
#15
anann2015-06-29 01:40
那我就先看王爽的汇编语言,然后根据情况选IBM PC汇编语言程序设计和Windows环境下32位汇编语言程序设计来看,谢谢大神指导
1