研究實驗三
在學習組合語言的時候,提供了很多種定址方式,便於我們找到記憶體單元位址,我們關注資料,無非關注資料的兩個量:資料存放的位置;資料有多大。那麼,在c語言中,我們如何使用記憶體儲存資料,使得我們能夠達到和彙編一樣的水平:即我們清楚的知道我們的資料在哪,我們知道我們的資料與多大?
下面通過實驗一研究,c語言中資料如何放置到記憶體中,通過其彙編**使我們更清晰的去認識這一點:
圖1 uml.c程式對應的彙編**
通過單步執行程式,發現和組合語言中國結論一樣,段位址預設還是ds
通過修改ip使其指到1fa,開始用t命令單步執行程式,然後通過d命令檢視相應記憶體內容,發現c語言對使用記憶體儲存資料達到了和組合語言一樣的目的!
用c語言在螢幕上顯示字元:
圖2 c語言螢幕顯示
可以發現,再次印證,c語言能夠達到和彙編同樣的目的,同樣能夠隨心所欲的操控記憶體。
圖3 全域性變數和區域性變數
從對應的組合語言可以看出的,全域性變數存在乙個固定的記憶體裡,而區域性變數存放在堆疊中。而push bp,mov bp,sp的作用就是為了用於存放區域性變數的而設定的。
圖4 返回值
通過彙編**可以看出程式返回值存放在ax中。
圖5 安全空間
總結體會:
本次研究實驗,最重要的是學到了兩點:c語言也可以和組合語言一樣,能夠達到隨心所欲操控記憶體的目的,不管對於何種語言,我們對所關心資料的引數,無非是資料在哪,資料有多大。以及,全域性變數存放在乙個固定的記憶體單元中,區域性變數存放在堆疊中。
MySQL 記錄長度與字元儲存
mysql中規定 任何一條記錄最多不能超過65535個位元組,即varchar永遠不可能達到其理論值 即使編碼改為latin1,那麼最多儲存65533個字元,餘出兩位儲存字元長度 varchar的實際儲存長度能達到多少呢?依據字元編碼。看了上圖,提示是21845 再看下圖 提示size too la...
python定義變數長度 python 變數
1 python是一門弱型別語言,變數的型別由它的值確定。2 賦值 直接賦值 a 1 鏈式賦值 a b 1 序列解包賦值 a,b 1,2 等號左邊的變數和右邊的常量個數一定要一致 list a 1 3 a b a list range 10 0,1,2,3,4,5,6,7,8,9 0,1,2,3,4...
靜態儲存 動態儲存 靜態變數與動態變數
動態變數 int a 靜態變數 static int a 靜態變數,全域性動態變數都是靜態儲存,儲存在全域性資料區,在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。靜態儲存變數是一直存在的,只會初始化一次。區域性動態變數是動態儲存,動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,...