#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%的影响都没有 |
原博客的网址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: