每天資訊【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

菜單

【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

今天我們來逆向分析C語言中++和—運算子字首和字尾的區別!

提到這裡,相信有不少小夥伴也早有過疑問,如字首++表示”先加再用”,字尾++表示”先用再加”,今天經過我們的逆向分析,相信大家就會更加理解這其中的意義!

我們這裡以++為例,分別進行逆向分析實驗,觀察彙編程式碼,先看一個簡單的程式:

【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

在++語句之前,我們下斷點,然後點選view-Debug Windows-Disassembly 開啟反彙編視窗,可以看到a = i++;這句話對應的彙編語句,如下:

【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

重點就是這五條彙編語句,請大家對照;後面的註釋逐條分析!

———————————

;先把變數i儲存到eax中

0040D71F      mov       eax,dword ptr [ebp-8]

;後把eax也就是i的值放到a裡

0040D722      mov       dword ptr [ebp-4],eax

;把i的值取出來,放到ecx裡

0040D725      mov       ecx,dword ptr [ebp-8]

;ecx進行+1,也就是++這個動作!

0040D728      add       ecx,1

;把ecx放回去,放到i裡。完成!

0040D72B      mov       dword ptr [ebp-8],ecx

———————————

怎麼樣,大家看明白了嗎?

下面,我們把程式碼改一下,將字尾++改為字首++,再進行分析,程式碼如下:

【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

還是在下斷點,看反彙編語句,開啟如下:

【C語言是世界上最好的語言】逆向之自增(++)運算子字首和字尾的區別!

看一下,還是五條,我們複製出來,逐行分析:

——————————

;將i的值儲存到eax裡:

0040D71F      mov       eax,dword ptr [ebp-8]

;把eax裡的值加1:

0040D722      add       eax,1

;把eax的值放回i裡:

0040D725      mov       dword ptr [ebp-8],eax

;把i裡的值放到ecx裡:

0040D728      mov       ecx,dword ptr [ebp-8]

;把ecx裡的值放到a裡,完成!

0040D72B      mov       dword ptr [ebp-4],ecx

——————————

怎麼樣,大家看懂了嗎?我們可以看出這裡VC6其實把++和賦值(也就是”用”);分開處理,字首就先加,字尾就先賦值。

–與++類似,對應的彙編語句會由add變為sub,大家可以自行實驗對比。

透過這此分析,想必一定會加深我們對字首和字尾的區別。

建議大家親自上機實驗,可以適當改變C語言程式,觀察對應彙編語句的變化。

——————————————————————

- END -

不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計,進階程式設計師~

【值得關注】我!