亚洲国产成人,色呦呦内射午夜,无码一级片,无码人妻少妇色欲AV一区二区

<samp id="jg8hh"></samp>

<p id="jg8hh"></p><delect id="jg8hh"><em id="jg8hh"><blockquote id="jg8hh"></blockquote></em></delect><acronym id="jg8hh"><dd id="jg8hh"></dd></acronym><button id="jg8hh"><dd id="jg8hh"><acronym id="jg8hh"></acronym></dd></button><samp id="jg8hh"><em id="jg8hh"><blockquote id="jg8hh"></blockquote></em></samp>

<p id="jg8hh"></p>

<samp id="jg8hh"><legend id="jg8hh"></legend></samp>
<samp id="jg8hh"><legend id="jg8hh"><samp id="jg8hh"></samp></legend></samp>

<samp id="jg8hh"></samp>

<p id="jg8hh"></p><acronym id="jg8hh"></acronym><p id="jg8hh"><dd id="jg8hh"><acronym id="jg8hh"></acronym></dd></p><p id="jg8hh"></p>

<p id="jg8hh"></p><delect id="jg8hh"><legend id="jg8hh"><var id="jg8hh"></var></legend></delect><button id="jg8hh"><listing id="jg8hh"><i id="jg8hh"></i></listing></button>
<delect id="jg8hh"><legend id="jg8hh"><var id="jg8hh"></var></legend></delect>

匯編語言入門

發(fā)布時(shí)間:2023-11-05
人類設(shè)計(jì)的計(jì)算機(jī)語言即高級語言,就是學(xué)習(xí)編程所用的語言。
計(jì)算機(jī)不理解高級語言,必須通過編譯器轉(zhuǎn)成二進(jìn)制代碼,才能運(yùn)行。學(xué)會高級語言,并不等于理解計(jì)算機(jī)實(shí)際的運(yùn)行步驟。
計(jì)算機(jī)真正能夠理解的是符號語言,它專門用來控制硬件。
匯編語言就是符號語言,直接描述/控制 cpu 的運(yùn)行。
如果你想了解 cpu 到底干了些什么,以及代碼的運(yùn)行步驟,就一定要學(xué)習(xí)匯編語言。
匯編語言不容易學(xué)習(xí),就連簡明扼要的介紹都很難找到。下面我嘗試寫一篇最好懂的匯編語言教程,解釋 cpu 如何執(zhí)行代碼。
匯編語言是什么?
我們知道,cpu 只負(fù)責(zé)計(jì)算,本身不具備智能。你輸入一條指令(instruction),它就運(yùn)行一次,然后停下來,等待下一條指令。
這些指令都是二進(jìn)制的,稱為操作碼(opcode),比如加法指令就是00000011。編譯器的作用,就是將高級語言寫好的程序,翻譯成一條條操作碼。
對于人類來說,二進(jìn)制程序是不可讀的,根本看不出來機(jī)器干了什么。為了解決可讀性的問題,以及偶爾的編輯需求,就誕生了匯編語言。
匯編語言是二進(jìn)制指令的文本形式,與指令是一一對應(yīng)的關(guān)系。
比如,加法指令00000011寫成匯編語言就是 add。只要還原成二進(jìn)制,匯編語言就可以被 cpu 直接執(zhí)行,所以它是最底層的低級語言。
來歷
最早的時(shí)候,編寫程序就是手寫二進(jìn)制指令,然后通過各種開關(guān)輸入計(jì)算機(jī),比如要做加法了,就按一下加法開關(guān)。后來,發(fā)明了紙帶打孔機(jī),通過在紙帶上打孔,將二進(jìn)制指令自動(dòng)輸入計(jì)算機(jī)。
為了解決二進(jìn)制指令的可讀性問題,工程師將那些指令寫成了八進(jìn)制。二進(jìn)制轉(zhuǎn)八進(jìn)制是輕而易舉的,但是八進(jìn)制的可讀性也不行。很自然地,最后還是用文字表達(dá),加法指令寫成 add。內(nèi)存地址也不再直接引用,而是用標(biāo)簽表示。
這樣的話,就多出一個(gè)步驟,要把這些文字指令翻譯成二進(jìn)制,這個(gè)步驟就稱為 assembling,完成這個(gè)步驟的程序就叫做 assembler。它處理的文本,自然就叫做 aseembly code。標(biāo)準(zhǔn)化以后,稱為 assembly language,縮寫為 asm,中文譯為匯編語言。
每一種 cpu 的機(jī)器指令都是不一樣的,因此對應(yīng)的匯編語言也不一樣。本文介紹的是目前最常見的 x86 匯編語言,即 intel 公司的 cpu 使用的那一種。
學(xué)習(xí)匯編語言,首先必須了解兩個(gè)知識點(diǎn):寄存器和內(nèi)存模型。
先來看寄存器。
cpu 本身只負(fù)責(zé)運(yùn)算,不負(fù)責(zé)儲存數(shù)據(jù)。數(shù)據(jù)一般都儲存在內(nèi)存之中,cpu 要用的時(shí)候就去內(nèi)存讀寫數(shù)據(jù)。但是,cpu 的運(yùn)算速度遠(yuǎn)高于內(nèi)存的讀寫速度,為了避免被拖慢,cpu 都自帶一級緩存和二級緩存。基本上,cpu 緩存可以看作是讀寫速度較快的內(nèi)存。
但是,cpu 緩存還是不夠快,另外數(shù)據(jù)在緩存里面的地址是不固定的,cpu 每次讀寫都要尋址也會拖慢速度。因此,除了緩存之外,cpu 還自帶了寄存器(register),用來儲存最常用的數(shù)據(jù)。也就是說,那些最頻繁讀寫的數(shù)據(jù)(比如循環(huán)變量),都會放在寄存器里面,cpu 優(yōu)先讀寫寄存器,再由寄存器跟內(nèi)存交換數(shù)據(jù)。
寄存器不依靠地址區(qū)分?jǐn)?shù)據(jù),而依靠名稱。每一個(gè)寄存器都有自己的名稱,我們告訴 cpu 去具體的哪一個(gè)寄存器拿數(shù)據(jù),這樣的速度是最快的。有人比喻寄存器是 cpu 的零級緩存。
寄存器的種類
早期的 x86 cpu 只有8個(gè)寄存器,而且每個(gè)都有不同的用途?,F(xiàn)在的寄存器已經(jīng)有100多個(gè)了,都變成通用寄存器,不特別指定用途了,但是早期寄存器的名字都被保存了下來。
eax
ebx
ecx
edx
edi
esi
ebp
esp
上面這8個(gè)寄存器之中,前面七個(gè)都是通用的。esp 寄存器有特定用途,保存當(dāng)前 stack 的地址。
我們常??吹?32位 cpu、64位 cpu 這樣的名稱,其實(shí)指的就是寄存器的大小。32 位 cpu 的寄存器大小就是4個(gè)字節(jié)。
內(nèi)存模型:heap
寄存器只能存放很少量的數(shù)據(jù),大多數(shù)時(shí)候,cpu 要指揮寄存器,直接跟內(nèi)存交換數(shù)據(jù)。所以,除了寄存器,還必須了解內(nèi)存怎么儲存數(shù)據(jù)。
程序運(yùn)行的時(shí)候,操作系統(tǒng)會給它分配一段內(nèi)存,用來儲存程序和運(yùn)行產(chǎn)生的數(shù)據(jù)。這段內(nèi)存有起始地址和結(jié)束地址,比如從0x1000到0x8000,起始地址是較小的那個(gè)地址,結(jié)束地址是較大的那個(gè)地址。
程序運(yùn)行過程中,對于動(dòng)態(tài)的內(nèi)存占用請求(比如新建對象,或者使用malloc命令),系統(tǒng)就會從預(yù)先分配好的那段內(nèi)存之中,劃出一部分給用戶,具體規(guī)則是從起始地址開始劃分。
舉例來說,用戶要求得到10個(gè)字節(jié)內(nèi)存,那么從起始地址0x1000開始給他分配,一直分配到地址0x100a,如果再要求得到22個(gè)字節(jié),那么就分配到0x1020。
這種因?yàn)橛脩糁鲃?dòng)請求而劃分出來的內(nèi)存區(qū)域,叫做 heap(堆)。它由起始地址開始,從低位(地址)向高位(地址)增長。heap 的一個(gè)重要特點(diǎn)就是不會自動(dòng)消失,必須手動(dòng)釋放,或者由垃圾回收機(jī)制來回收。
內(nèi)存模型:stack
除了 heap 以外,其他的內(nèi)存占用叫做 stack(棧)。簡單說,stack 是由于函數(shù)運(yùn)行而臨時(shí)占用的內(nèi)存區(qū)域。
所有的幀都存放在 stack,由于幀是一層層疊加的,所以 stack 叫做棧。
生成新的幀,叫做入棧,英文是 push;棧的回收叫做出棧,英文是 pop。stack 的特點(diǎn)就是,最晚入棧的幀最早出棧(因?yàn)樽顑?nèi)層的函數(shù)調(diào)用,最先結(jié)束運(yùn)行),這就叫做后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。每一次函數(shù)執(zhí)行結(jié)束,就自動(dòng)釋放一個(gè)幀,所有函數(shù)執(zhí)行結(jié)束,整個(gè) stack 就都釋放了。
stack 是由內(nèi)存區(qū)域的結(jié)束地址開始,從高位(地址)向低位(地址)分配。比如,內(nèi)存區(qū)域的結(jié)束地址是0x8000,第一幀假定是16字節(jié),那么下一次分配的地址就會從0x7ff0開始;第二幀假定需要64字節(jié),那么地址就會移動(dòng)到0x7fb0。
cpu 指令
了解寄存器和內(nèi)存模型以后,就可以來看匯編語言到底是什么了。
學(xué)習(xí)匯編語言一定要基于一定的cpu平臺,從單片機(jī)開始,單片機(jī)的芯片最為簡單,最能體現(xiàn)計(jì)算機(jī)內(nèi)部的原理,學(xué)匯編就是為了學(xué)計(jì)算機(jī)組成原理,單片機(jī)是沒有操作系統(tǒng)的,在單片機(jī)上用匯編開發(fā)最能夠獲得直接控制硬件的編程體驗(yàn),這種直接控制硬件的編程經(jīng)驗(yàn)?zāi)軌驗(yàn)橐院蟮牟僮飨到y(tǒng)的學(xué)習(xí)打下良好的基礎(chǔ),更能夠從硬件到軟件系統(tǒng)地思考問題。
了解了這些,真正了解底層工作原理的,使我們能夠更好的學(xué)習(xí)編程。
上一個(gè):一品紅繁殖要點(diǎn)
下一個(gè):美國velcro軍用搭扣

光柵方程,什么是光柵方程?
臺式機(jī)買組裝機(jī)好還是品牌機(jī)好,臺式機(jī)是組裝的好還是品牌機(jī)好
筆記本維修流程(筆記本維修流程圖)
微信如何查看最近訪客記錄方法(微信如何查看最近訪客的人)
人機(jī)界面的設(shè)計(jì)過程注意事項(xiàng)
普洱茶的花式喝法
256g有必要分區(qū)嗎,256的固態(tài)要不要分區(qū)大神指點(diǎn)下
開湯來鑒品普洱茶
香豌豆的養(yǎng)護(hù)方法
域名site特點(diǎn)是什么?新手注冊域名五大注意事項(xiàng)