高手之路-- 明白計算機底層! 爲了更好地精通C++ ,否則你指針永遠也用不好!!必須知道的概念!

首先看一下這堆代碼, 我先證明 release 跟Debug 編譯出來的 反彙編是一樣的, 否則那無法進一步 推測了!

以上呢 通過 2種編譯 ,結果 居然 release 更慢, 這說明 這代碼已經無法 優化了.

以下,讓你學習如何看懂  內存, 跟 EBP ,指針對應的 寫入堆棧 跟 寫入 內存是一樣的概念,

只是 相對於 EBP 棧底 地址而言。

你看以下 是 第二次運行的內存 , 你會發現 不可讀, 爲啥不可讀呢,就是因爲程序每次運行 基地址都是動態分配的。

那麼 以爲着, EBP 地址 也是 根據 基址 + 偏移 得到的。

進程需要 通過調用 winAPI的方式 來 實現 向 操作系統申請 更多  內存地址 空間。

你才能 寫入更多的內存地址。

 

這次運行 EBP 地址 變成了 4EEF40 ,然後我們定位到 4EEF40 地址 就能看到 CPU是怎麼直接寫入 內存地址的.

直接輸入 0x 004EEF40

就能定位了, 然後滾輪,往上滾一點點, 你就能看到 ,各種 變量,都會在堆棧底部 網上的位置 存放的。

滾上去,一看 發現很多 0x000000 的 
就是 初始化 堆棧的痕跡 !
瞬間就明白這就是 堆棧的內部!


然後 這裏 inc dword ptr [ebp-60h] 

就是 ebp-60h 這個地址 ,的數據 自增 1 

那麼ebp對應的地址是什麼呢?

然後 按調試, 可以在彙編 窗口 裏 按 F11 鍵 ,進行 逐步調試.

然後你就會發現   內存查看器裏, 看到 不少 數據標紅 , 那就是 被修改的 標記!

堆棧一般 就是 從 高地址值 往 地址值 方向 寫入 。

就是從 下往上 寫入數據的!。

你就明白, 你所定義的變量 大部分都存放在堆棧裏!, 說白了, 變量 就只是一個 地址,

彙編 可以直接 定位到 對應的 變量地址 然後修改。 存放地址的 地址就稱爲 指針。 就是用於重定位的。

就如 郵件上的地址, 這郵件封面 存放的就是 地址, 郵差 就相當於 彙編裏的 指針, 可以直接通過 郵件 找到 目的地。

那麼我是不是 拿着 郵件就可以了。就能知道目的地了。。

 變量還不如說 就是一個  基址 +偏移 的  虛擬 地址。

 運行後 windows 會告訴你基址的 然後你就瞬間能確定 所有相對地址了。

程序結構就還原,復活了!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章