當前位置:首頁 » 編程軟體 » 編譯器連接地址是內存地址

編譯器連接地址是內存地址

發布時間: 2024-05-10 11:16:34

Ⅰ 鍦板潃璇戠爜鍣ㄥ湪浠涔堜綅緗

鍦板潃璇戠爜鍣ㄥ湪鍐呭瓨褰撲腑銆
鍦板潃璇戠爜鍣錛氬氨鏄鎶婅緭鍏ョ殑浜岃繘鍒舵暟鍦板潃錛屾寚鍚戠浉搴旂殑鐗╃悊絀洪棿銆傚湴鍧璇戠爜鍣ㄦ槸鍦ㄥ唴瀛樺唴閮ㄧ殑錛屽唴瀛橀櫎浜嗗瓨鍌ㄥ崟鍏冨栵紝榪樺寘鎷錛氳誨啓鐢佃礬銆佸湴鍧璇戠爜鍣ㄣ
鍦板潃璇戠爜鍣ㄦ牴鎹杈撳叆鍦板潃閫夋嫨鏌愭潯杈撳嚭錛堝瓧綰匡級錛屽啀鐢卞畠椹卞姩璇ヤ綅綰匡紝浠ヤ究璇誨嚭瀛楃嚎涓婂悇鍗曞厓瀛樺偍鐨勪唬鐮併

Ⅱ 緙栬瘧榪囩▼涓鍐呭瓨鐨勫垎閰嶄笌閲婃斁

緙栬瘧榪囩▼涓錛屽唴瀛樼殑鍒嗛厤涓庨噴鏀炬槸涓涓闈炲父閲嶈佺殑鐜鑺傘傛爤絀洪棿鍜屽爢絀洪棿鏄鍐呭瓨綆$悊涓鐨勪袱涓閲嶈佹傚康錛屽畠浠鍚勮嚜鏈夌潃鐙鐗圭殑鐗圭偣鍜岀敤閫斻傛湰鏂囧皢娣卞叆鎺㈣ㄦ爤絀洪棿鍜屽爢絀洪棿鐨勫尯鍒錛屼互鍙婂畠浠鍦ㄥ唴瀛樼$悊涓鐨勪綔鐢ㄣ
📚鏍堢┖闂村拰鍫嗙┖闂寸殑鍖哄埆
鏍堢┖闂存槸鐢辨搷浣滅郴緇(緙栬瘧鍣)鑷鍔ㄧ$悊錛屽畠涓哄彉閲忓拰鍑芥暟鎻愪緵涓存椂鐨勫瓨鍌ㄧ┖闂達紝騫跺湪榪愯屾椂鎵ц屽弬鏁頒紶閫掋傝屽爢絀洪棿鍒欐槸鍦ㄧ▼搴忚繍琛屾椂鍔ㄦ佸垎閰嶇殑錛屽ぇ灝忓彲鏍規嵁闇奼傝皟鏁淬傜浉姣斾箣涓嬶紝鍫嗗唴瀛樺垎閰嶇敱C/c++鍑芥暟搴撹礋璐o紝鍏鋒湁鏇村ぇ鐨勭伒媧繪у拰鏂逛究鎬с
🚀鍫嗗唴瀛樺垎閰嶇殑鏁堢巼闂棰
鍫嗗唴瀛樺垎閰嶇敱C/c++鍑芥暟搴撹礋璐o紝鍏鋒湁鏇村ぇ鐨勭伒媧繪у拰鏂逛究鎬с備絾鐢變簬娑夊強鍔ㄦ佸垎閰嶏紝鍏舵晥鐜囧彲鑳藉彈鍒板獎鍝嶃傜▼搴忓憳闇瑕佹敞鎰忓湪浣跨敤鍫嗗唴瀛樻椂錛屽敖鍙鑳藉噺灝戝唴瀛樺垎閰嶇殑嬈℃暟錛屼互鎻愰珮紼嬪簭鐨勬晥鐜囥
🔗鏍堢┖闂村拰鍫嗙┖闂寸殑鑱旂郴
鍦ㄥ唴瀛樼$悊鏂歸潰錛屽爢閫氬父鐢ㄤ簬淇濆瓨鏂板壋寤虹殑瀵硅薄鍜屾暟緇勶紝騫剁敱鉶氭嫙鏈虹殑鑷鍔ㄥ瀮鍦炬敹闆嗗櫒璐熻矗綆$悊銆傚綋鍦ㄥ爢涓鍒涘緩涓涓鏁扮粍鎴栧硅薄鏃訛紝鏍堜腑鍙浠ヨ劇疆涓涓寮曠敤鍙橀噺錛屼嬌鍏跺肩瓑浜庤ユ暟緇勬垨瀵硅薄鍦ㄥ爢涓鐨勫湴鍧銆傝繖鏍鳳紝鎴戜滑鍙浠ラ氳繃榪欎釜寮曠敤鏉ヨ塊棶鍫嗕腑鐨勬暟鎹銆
💡鍫嗗唴瀛樼殑綆$悊
紼嬪簭鍛橀氬父璐熻矗綆$悊鍫嗗唴瀛樼殑鍒嗛厤銆傞渶瑕佹敞鎰忕殑鏄錛屽傛灉鏁扮粍鎴栧硅薄娌℃湁寮曠敤鍙橀噺鎸囧悜瀹冿紝鍗充嬌瀹冨湪鍫嗕腑鍒嗛厤浜嗗唴瀛橈紝涔熶細閫犳垚鍐呭瓨嫻璐癸紝鍥犱負鍨冨溇鏀墮泦鍣ㄦ棤娉曞湪涓嶇『瀹氱殑鏃墮棿閲婃斁榪欓儴鍒嗗唴瀛樸

c語言竟是如何調用硬體

大家都知道我們可以使用C語言寫一段程序來控制硬體工作,但你知道其工作原理嗎?以下僅供參考!

c語言在實際運行中,都是以匯編指令的方式運行的,由編譯器把C語言編譯成匯編指令,CPU直接執行匯編指令。

所以這個問題就變成,匯編指令是如何操作硬體的?

如果把硬體平台限制在x86環境下,那麼匯編指令操作硬體基本上只有兩種方式:

方式一:

通過向內存空間寫數據。硬體會把硬體上的各種寄存器(外行可以理解為訪問硬體的介面或者操作硬體的工具)映射到某一塊內存地址空間上,之後只要用匯編指令,甚至C語言去讀寫這一段內存地址空間(並非真正操作物理內存),就可以達到操作硬體的目的了。

如果題主還有WindowsXP環境(虛擬機也可以),就可以用匯編指令直接操作顯存:

MOV AX,B800

MOV ES,AX

XOR DI,DI

MOV CX,0800

MOV AX,5555

REPZ STOSB

硬體的各種寄存器會被映射到某一塊物理內存中,這種方式稱為MMIO,在Windows的設備管理器里,右鍵點設備,看屬性-》資源里,不少硬體設備都有「內存范圍」的參數,這里的內存范圍就表示這個硬體的資源可以通過訪問這一段內存來控制它。

方式二:

x86匯編中,還有兩個特殊的指令是IN和OUT,這是x86平台上獨有的,上面圖里的I/O范圍,就是用IN/OUT這兩個指令來訪問和控制的。

以上兩種訪問硬體的方式,第一種是可以用C語言實現的,上面一段匯編,本質上類似於C語言代碼:

char ptr = 0xB8000;

int i;

for (i = 0; i 《0x800; i++)

{ptr + i = 0x55;

}

第二種IN/OUT方式沒有直接的C語言語法對應,需要自己封裝匯編。

那麼為什麼平時很難用C語言操作硬體呢?這是因為平時寫的代碼大多數都在保護模式下,保護模式下,直接訪問物理地址會受到限制,C語言操作的地址都是虛地址。

對於Windows來說,要訪問物理地址,需要工作在內核模式,也就是的寫驅動才行。

而在顯存方面,首先,題主要先明白物理地址和虛擬地址的概念。

原來的8086cpu設計的時候,地址空間有一塊區域(640K-1M)之間,有一塊作為顯存使用

這里你說的預留的地址,是指物理地址,這一段地址的准確范圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理內存地址一直都保留給顯存使用,不區分32位還是64位,也不區分保護模式還是實模式。

可見這一段內存至今仍然是留給顯卡使用的。

那麼現在為什麼不能直接用這段內存了?

因為現在的軟體都運行在保護模式下,訪問的地址都是虛擬地址,而並非物理地址,包括你使用cmd命令打開的環境,都是虛擬地址,雖然32位XP里能用debug命令向000B8000上寫數據並能顯示在cmd的界面里,但本質上,這都是虛擬出來的。

如果要想用這段顯存怎麼辦?

自己寫一個簡易的操作系統,不啟動顯卡的各種圖形加速功能,CPU進入保護模式後在GDT里映射一個4G的數據段,與物理地址一致,那麼向000B8000上寫數據,就會像過去DOS一樣顯示在屏幕上,所以保護模式下也可以訪問這一段內存。所以,保護模式下,也可以用它。

顯卡那麼多顯存是怎麼映射的?

有很多內存地址被映射給顯存了,就是通過這種映射關系,把一些物理地址留給顯存,使得CPU能像訪問內存一樣訪問顯存資源。

當然,實際情況是,2G顯存未必完全映射,而是只映射一部分地址,顯卡有一些開放的寄存器能夠控制哪部分顯存映射過來,這樣就能使得CPU在使用比較少的物理地址范圍的情況下,訪問全部的顯存。

還有一個很有意思的事情:在虛擬機里,找到映射的高地址部分的第一塊內存區域,寫一個能直接訪問物理地址的程序(比如一個驅動),去讀這一塊內存,然後寫到文件里,再用屏幕截圖,也寫到文件里,會發現截圖的內容和顯存里讀出來的內容基本上是一樣的。

網友awayisblue

要回答你的問題,我們需要要知道:

硬體是一種什麼樣的存在

什麼是驅動。

C語言怎麼操作硬體

我就不嚴格去定義這些概念了,我就以一個例子來通俗地講解一下吧。

首先講硬體:

先介紹一款單片機晶元STM8。

這款晶元裡面有cpu, 內存,寄存器(先不要覺得看到新名詞壓力大,繼續往下看)等等,相當於我們的電腦了,但還要外接其它硬體。

這里你需要知道的概念是:

晶元的引腳跟寄存器是相對應的,寄存器是8位的內存單元(對,存在於內存上面),當你往這個內存單元裡面寫入數據時,晶元的引腳的電壓會發生變化,比如說我寫入的是01100001,則晶元上與之對應的8個引腳的電壓狀態(分為高電平與低電平兩種)會輸出:低高高低低低低高。

cpu可以執行代碼指令,指令可以操作內存。

結論:所以從上面兩點可以我們可以知道,cpu可以執行指令,使晶元的引腳電平(電壓)發生變化。

關於這款顯示器,我們需要知道的是:

它是有引腳的,這些引腳可以跟到前面介紹的那款單片機晶元的引腳相連。

該顯示器有自帶的內存,用於存儲要顯示的字元,顯示器從該內存裡面讀取字元來來顯示。

單片機晶元與該顯示器相連後,可以通過引腳往該顯示器的內存里寫數據(通過多個引腳電平的高低不同來代表不同的數據,比如說:低高高低低低低高 代表01100001,這個數據寫在顯示器的.內存裡面,被顯示器所顯示,當然,會根據ASCII來顯示數字對應的字元,01100001對應的字元是『a』),除了接收數據的引腳外,還有控制顯示器的引腳(這個我們會在驅動那裡介紹,繼續往下看)。

結論:單片機晶元與顯示器相連,可以通過引腳輸出的電平來控制顯示器的字元顯示。

那麼,綜合上面,也就是說,單片機晶元cpu可以通過執行指令來控制顯示器的字元顯示。

而這里,題主所說的硬體,指的就是這個顯示器了。

接下來講驅動:

那麼,什麼是驅動呢?驅動無非就是硬體跟軟體的中間層,但我們不糾結這種關系,直接來看一下,對於我們這個例子,驅動指的是什麼。首先我們要知道:

顯示器支持很多種操作,比如說清除顯示,游標移動,讀取數據,寫數據等等。

這些操作數據引腳和控制引腳來實現。

引腳可以通過單片機晶元來控制。

結論:我們可以通過在單片機晶元裡面寫顯示器的「驅動」程序來屏蔽掉硬體(顯示器硬體)層。

於是這里驅動程序,指的是顯示器所支持操作的程序表示。比如說清除顯示,我們可以編寫一個clear()函數,游標移動,我們編寫一個move_cursor()函數,讀取數據和寫數據分別為read()和write(),然後分別實現就可以了(通過向寄存器里寫數據的形式,進而控制引腳的電平變化,再而控制顯示器,這個過程前面已有介紹)。這些函數就是驅動程序了。為什麼上面說驅動程序可以屏蔽掉硬體呢?因為程序員可以使用前面的驅動程序來直接操作顯示器(硬體),而不用知道太多關於硬體的事情,而一般的驅動程序也可以由廠家來提供。

再說明一點:一般這些驅動程序可以用匯編寫(出於運行效率的考慮),也可以用C語言來編寫的,比如說我上面的例子,就可以直接用C語言來編寫。當然C語言內聯匯編的形式也可以。

最後講C語言怎麼操作硬體:

相信到這里,C語言是怎麼操作硬體的已經比較明白了。

這里總結一下:

C語言由CPU運行(實際上是先編譯成機器碼存在晶元裡面然後執行),可以去操作內存。

內存里有一段是跟寄存器相對應的,而寄存器是跟晶元的引腳相對應的,於是操作該段內存就能控制晶元引腳的電壓變化。

硬體(比如說顯示器)有引腳(或者說排線,這些也是一樣的東西),這些引腳跟晶元的引腳相連可以接受晶元的控制。

可以把對某個硬體的操作做成一系列操作函數,這些操作函數就是驅動程序了。

於是我們的C語言只要去調用這個驅動程序就可以直接操作硬體了。(當然驅動程序也可以由C語言來編寫,所以C語言操作硬體並不一定要經過驅動程序)。

Ⅳ 高級語言源程序編譯後產生的地址是邏輯地址還是物理地址

由於操作系統技術的發展,可重用二進製程序技術使用了內存重定位技術,所以從匯編的角度來看即不是邏輯地址也不是物理地址。而且這個概念有些不同,編譯後產生的地址是相對地址,是相對於可執行頭部位置的地址。而邏輯地址是指在指令系統內部使用的用來訪問內存的一個邏輯表示,通常表現為相對於某個段基地址的偏移量。
當可執行程序被載入內存之後,才會有邏輯地址存在,此時可執行程序被如何載入於何處,地址為多少,由操作系統決定,此時cpu訪問程序用的是邏輯地址。一個程序一旦被編譯確定之後基本上變數初始化的順序固定,資源分配位置也固定,設置有編譯器使用預分配機制,然後採用相對地址引用。
注意:某些工具書也稱二進制可執行文件內所有的相對地址范圍是邏輯地址空間,相對地址就是邏輯地址。因為兩者的訪問方式相似,邏輯地址變換依賴cpu或者附加變換機構(硬體),而二進製程序地址空間變換需要操作系統插手管理。
反匯編分析中常常將二進制內部地址稱為邏輯地址,因為反匯編器不能還原原來匯編代碼的地址跳轉空間特性,因此得到一個相對於二進制數據起點位置的相對地址,而和內存和物理存儲都沒有關系。

Ⅳ vs2010鏌ョ湅鍐呭瓨鍦板潃鐨勬柟娉

銆銆鍦ㄤ綘浣跨敤vs緙栫▼錛屾兂瑕佺敤鏌ョ湅vs鐨勫唴瀛樺湴鍧錛屽彲浠ュ湪璁劇疆閭i噷淇鏀癸紝璇︾粏鎯呭喌浠ヤ笅鎴戜負澶у舵暣鐞嗗ソ浜嗚祫鏂欙紝甯屾湜澶у跺枩嬈銆

銆銆 vs2010鏌ョ湅鍐呭瓨鍦板潃

銆銆1銆侀栧厛鎵撳紑vs緙栬瘧鍣錛屽壋寤哄ソ欏圭洰錛屽苟涓斿皢浠g爜鍐欒繘鍘伙紝榪欓噷灝變笉璐翠唬鐮佷簡錛屼綘鍙浠ラ殢渚跨殑鍐欎釜鍋氫釜嫻嬭瘯銆

Ⅵ 在ARM匯編編程中如何指定某段程序的存儲地址

在要指定代碼的存儲空間不是一件特別簡單的事情,尤其是你想為某個或某幾個函數指定具體的地址。
1,編譯器只有在最終的Link階段才會為代碼和數據分配內存地址,因此指定代碼段的地址一般是通過寫一個link腳本來進行的。Link階段時,編譯器的Linker會讀取你寫的Link腳本,並且按照腳本的規定給代碼分配地址。
2,根據ARM開發工具的不同,link腳本的語法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等開發工具都支持Link腳本。
如果你英文還可以,建議你直接找到開發工具的Help手冊去研究。如果你英語實在不行,也可以把開發工具名稱和你代碼的具體情況告訴我,我幫你看看。

熱點內容
編程學習方法 發布:2024-11-08 22:55:48 瀏覽:261
自己搭建以太伺服器 發布:2024-11-08 22:55:41 瀏覽:472
c語言完美數 發布:2024-11-08 22:27:43 瀏覽:105
遠程桌面伺服器搭建h5網頁嗎 發布:2024-11-08 22:27:37 瀏覽:959
簡單點編程 發布:2024-11-08 22:21:50 瀏覽:812
mysql存儲過程教程 發布:2024-11-08 22:20:56 瀏覽:201
shell腳本sort 發布:2024-11-08 22:20:55 瀏覽:182
linux怎麼登錄 發布:2024-11-08 22:19:07 瀏覽:410
段頁式存儲管理中 發布:2024-11-08 22:03:22 瀏覽:734
易語言注冊碼源碼 發布:2024-11-08 22:03:22 瀏覽:238