底層的重要性

2021-09-11 07:04:59 字數 3366 閱讀 2237

有時候,我更想念以前編寫basic和彙編的時代。

我相信有很多人用c語言寫了如下程式:

int main()

然後編譯成***.exe檔案,然後用反編譯軟體(od)開啟檢視:(結果因編譯器不同而不同)

... ...

00401a10 . 56 push esi

00401a11 . 53 push ebx ; zero.00401a10

00401a12 . 83ec 14 sub esp,0x14

00401a15 . 833d 64704000>cmp dword ptr ds:[0x407064],0x2

00401a1c . 8b4424 24 mov eax,dword ptr ss:[esp+0x24] ; zero.00401a10

00401a20 . 74 0a je short zero.00401a2c

00401a22 . c705 64704000>mov dword ptr ds:[0x407064],0x2

00401a2c > 83f8 02 cmp eax,0x2

00401a2f . 74 12 je short zero.00401a43

00401a31 . 83f8 01 cmp eax,0x1

00401a34 . 74 3f je short zero.00401a75

00401a36 > 83c4 14 add esp,0x14

00401a39 . b8 01000000 mov eax,0x1

00401a3e . 5b pop ebx ; ntdll_12.779f9264

00401a3f . 5e pop esi ; ntdll_12.779f9264

00401a40 . c2 0c00 retn 0xc

00401a43 > be 14904000 mov esi,zero.00409014

00401a48 . 81ee 14904000 sub esi,zero.00409014

00401a4e . 83fe 03 cmp esi,0x3

00401a51 .^ 7e e3 jle short zero.00401a36

00401a53 . 31db xor ebx,ebx ; zero.00401a10

00401a55 > 8b83 14904000 mov eax,dword ptr ds:[ebx+0x409014]

00401a5b . 85c0 test eax,eax

00401a5d . 74 02 je short zero.00401a61

00401a5f . ffd0 call eax

00401a61 > 83c3 04 add ebx,0x4

00401a64 . 39de cmp esi,ebx ; zero.00401a10

00401a66 .^ 75 ed jnz short zero.00401a55

00401a68 . 83c4 14 add esp,0x14

00401a6b . b8 01000000 mov eax,0x1

00401a70 . 5b pop ebx ; ntdll_12.779f9264

00401a71 . 5e pop esi ; ntdll_12.779f9264

00401a72 . c2 0c00 retn 0xc

00401a75 > 8b4424 28 mov eax,dword ptr ss:[esp+0x28] ; zero.00400000

... ...

這是什麼鬼東西

好吧,所以說無論你編寫怎樣的**,最後也將變成無數行彙編,那為何不直接寫彙編呢?那是因為。。。我們懶嘛!

高階語言的好處在這裡就可以體現出來:可讀性!  但是隨之而來的還有大量冗餘的指令 中的printf()函式就有上千條指令,雖然說這多餘的部分可以使該軟體執行在其他的作業系統平台上,增加相容性,但是這對我們真正了解電腦的工作原理沒有好處。在軟體執行中的很多問題bug是只有去檢視反彙編才能體會的。

比如說:

#includeint main()

這段**的執行結果是什麼?  

結果是不確定的,取決於你使用哪種編譯器。如果你用gcc來編譯的話,應該是輸出:7  用vc編譯輸出: 9

(發生了什麼?)

我們一般認為程式是這樣執行的:a++;b+=a;a++;b+=a;a++;b+=a;所以應該輸出b=1+2+3=6才對

(大家可以用反彙編檢視,但考慮到不一定大家都看得懂,所以就不直接放出來了)

然而事實上依據從左向右的順序, 相當於b=((++a)+(++a))+(++a)

b=(a+(++a))+(++a)           //第一次脫括號的結果, 這時a=1

b=(a+a)+(++a)               //第二次脫括號的結果. 這時a=2

b=(2+2)+(++a)  

b=4+(++a)                   //第三次脫括號的結果, 這時a=2

b=4+a                       //第四次脫括號的結果, 這時a=3

b=4+3=7

//題外話:++a 在c++中是左值表示式, 但在c中不是左值表示式

在vc中是這樣的:

a++;a++;a++;

b=a+a+a=9

可以看出其中的區別

所以在學習高階語言的時候,有必要了解一下軟體底層的實現,而不是成為「碼農」。

重要性取樣

from scipy import stats from scipy.stats import norm import numpy as np import matplotlib.pyplot as plt def f x return np.sin x x def intf x1,x2 retur...

定時的重要性

2.wm timer訊息 是又定時器發出的訊息 首先我們先建立乙個定時器 函式原型 unit settimer hwnd hwnd,uint nidevent,uint nelapse,timerproc lptimerfunc 要建立定時器,還需要 a.視窗控制代碼 b.選擇識別符號 c.微秒級的...

資料的重要性

對於程式設計師來說,高手 和 菜鳥 之間的區別實際上只有兩個因素 一是從事程式設計時間的長短不同,使經驗的多少有所區別 第二個因素就是手頭掌握資料的多少了,因為很多問題並不是靠自己鑽研可以解決的,必須靠資料,試想在寫 dos匯程式設計序時如果沒有中斷手冊,可以自己鑽研出來嗎?實際上,大部分 菜鳥 向...