本文要討論的內容:關於 變數
警告:本文是給昨晚看2022-01-21看直播的朋友的總結文章,其它朋友直接關閉本頁面就可以了。
變數的功能:用來儲存資料,估計你只知道這麼多了
本文預警:你可能看不懂
然後你會
程式資料+程式指令
雖然昨晚拿的是c語言講解,golang也是一樣的。
package main
import "fmt"
var bf uint32=9502
func bfx() uint32{
return bf
}
func main() {
fmt.Println(bf)
fmt.Printf("bf=%p\r\n",&bf)
fmt.Printf("main=%p,bfx=%p,bfx=%T\n",main,bfx,bfx)
}
一個程式【已經編譯好的binary 檔案,在Linux系統中以ELF格式儲存,你可以手寫ELF檔案,就可以得到一個可執行檔案,不需要你寫什麼語言,我相信你寫個”hello,world”程式肯定會有用某一語言來實現,除了這個,你不會了】
一個程式【ELF檔案】上儲存的資料分為2類:程式指令+程式資料,它們在記憶體中全是二進位制儲存,我們檢視時,資料可以以16進位制,字元方式顯示。我們的ELF檔案將“資料”以許可權進行區分是指令還是資料。
- 認識 程式 與 text 文字
demo.go===>只是普通的text文字檔案,並不是嚴格意義上的程式
demo ===>elf格式儲存的檔案【它是靜態連結檔案,虛擬地址已經分配完成】,是我們嚴格意義上的程式 ===>cpu它只會認識這檔案裡面儲存的指令+資料且在執行時,取出這檔案裡的資料
- 啟動執行檢視bf和main,bfx符號的地址
符號Symbol 即bf,main,bfx【你們稱為變數,函式】
- 符號bf詳解
這裡的符號bf,捲毛程式設計師稱為變數,這個虛擬地址是0x540024,為了便於操作這記憶體上的資料
bf上面儲存的資料是:程式資料 上面儲存的資料是:程式資料
這個虛擬地址我們起了個別名為bf,當我們對bf操作時,就是對0x540024上的資料進行操作,這個bf它所在的虛擬地址範圍是【下圖是golang程式啟動後,程式的詳細布局圖】
符號main/bfx詳解
詳細在上圖,main,bfx虛擬地址上儲存的是程式資料詳細在上圖,main,bfx虛擬地址上儲存的是程式資料
底層大概情況
[你要是有興趣,可以想想建立多程式時,內部是怎麼樣的]
當啟動之後,程式會和ELF檔案建立對映關係【作業系統內部會維護資料結構】ELF檔案中的程式指令+程式資料會區域性的裝載到記憶體電路中,CPU在乎的某個地址【實體地址】上的指令和資料,CPU取出指令後對資料進行處理,CPU要的是一串的程式指令和程式資料【其實全是二進位制】
虛擬地址0x540024上儲存的資料是1e25[即10進位制9502,如果程式之間轉換你都不會,說明你基礎有必要加強],它的地址範圍大小是4Byte,這4個大小的記憶體區域位於 程式的 資料區中【我們會根據某範圍虛擬記憶體地址上的許可權進行命名是資料區,還是程式碼區,還是堆區,棧區】人類為了便於操作這4位元組的記憶體空間,起了個助記符號為bf
bf上的程式資料和bfx,main符號上的程式指令會被編譯器處理儲存在/home/go/demo ELF檔案中,啟動執行後【之前我講過 程式的誕生和滅亡文章,不過你可能都不看】,會動態區域性載入到實體記憶體中(作業系統來控制),從而CPU取得bfx,main上的程式指令及bf等(還有其它特殊符號上的程式指令和程式資料)上的程式資料===》輸入到內部邏輯電路中驅動CPU工作。
【由於二進位制檔案內容非常大,我這裡只是擷取部分,裡含有程式指令+程式資料全是二進位制數字訊號,我昨晚直播時講過徒手擼16進位制程式碼編寫程式(相當於後擼二進位制寫程式,不依賴任何語言)】
總結
本文的目的:是總結給昨晚看直播朋友的一個複習,不合適新手程式設計師,更不適合菜雞。內容的充分理解是基於我前面講過的內容及昨晚的直播的。如果你進來一臉蒙逼,然後焯關閉了頁面,我覺得正常。
本作品採用《CC 協議》,轉載必須註明作者和本文連結