0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

看完這篇文章,匯編也不難

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 2023-11-12 11:13 ? 次閱讀

一、匯編語(yǔ)言是什么?

計(jì)算機(jī)真正能夠理解的是低級(jí)語(yǔ)言,它專(zhuān)門(mén)用來(lái)控制硬件。匯編語(yǔ)言就是低級(jí)語(yǔ)言,直接描述/控制 CPU 的運(yùn)行。如果你想了解 CPU 到底干了些什么,以及代碼的運(yùn)行步驟,就一定要學(xué)習(xí)匯編語(yǔ)言。匯編語(yǔ)言不容易學(xué)習(xí),就連簡(jiǎn)明扼要的介紹都很難找到。下面我嘗試寫(xiě)一篇最好懂的匯編語(yǔ)言教程,解釋 CPU 如何執(zhí)行代碼。我們知道,CPU 只負(fù)責(zé)計(jì)算,本身不具備智能。你輸入一條指令(instruction),它就運(yùn)行一次,然后停下來(lái),等待下一條指令。這些指令都是二進(jìn)制的,稱(chēng)為操作碼(opcode),比如加法指令就是00000011。編譯器的作用,就是將高級(jí)語(yǔ)言寫(xiě)好的程序,翻譯成一條條操作碼。對(duì)于人類(lèi)來(lái)說(shuō),二進(jìn)制程序是不可讀的,根本看不出來(lái)機(jī)器干了什么。為了解決可讀性的問(wèn)題,以及偶爾的編輯需求,就誕生了匯編語(yǔ)言。

f220d530-8049-11ee-939d-92fbcf53809c.png

匯編語(yǔ)言是二進(jìn)制指令的文本形式,與指令是一一對(duì)應(yīng)的關(guān)系。比如,加法指令00000011寫(xiě)成匯編語(yǔ)言就是 ADD。只要還原成二進(jìn)制,匯編語(yǔ)言就可以被 CPU 直接執(zhí)行,所以它是最底層的低級(jí)語(yǔ)言。

二、來(lái)歷

最早的時(shí)候,編寫(xiě)程序就是手寫(xiě)二進(jìn)制指令,然后通過(guò)各種開(kāi)關(guān)輸入計(jì)算機(jī),比如要做加法了,就按一下加法開(kāi)關(guān)。后來(lái),發(fā)明了紙帶打孔機(jī),通過(guò)在紙帶上打孔,將二進(jìn)制指令自動(dòng)輸入計(jì)算機(jī)。為了解決二進(jìn)制指令的可讀性問(wèn)題,工程師將那些指令寫(xiě)成了八進(jìn)制。二進(jìn)制轉(zhuǎn)八進(jìn)制是輕而易舉的,但是八進(jìn)制的可讀性也不行。很自然地,最后還是用文字表達(dá),加法指令寫(xiě)成 ADD。內(nèi)存地址也不再直接引用,而是用標(biāo)簽表示。這樣的話(huà),就多出一個(gè)步驟,要把這些文字指令翻譯成二進(jìn)制,這個(gè)步驟就稱(chēng)為 assembling,完成這個(gè)步驟的程序就叫做 assembler。它處理的文本,自然就叫做 aseembly code。標(biāo)準(zhǔn)化以后,稱(chēng)為 assembly language,縮寫(xiě)為 asm,中文譯為匯編語(yǔ)言。每一種 CPU 的機(jī)器指令都是不一樣的,因此對(duì)應(yīng)的匯編語(yǔ)言也不一樣。本文介紹的是目前最常見(jiàn)的 x86 匯編語(yǔ)言,即 Intel 公司的 CPU 使用的那一種。

三、寄存器

學(xué)習(xí)匯編語(yǔ)言,首先必須了解兩個(gè)知識(shí)點(diǎn):寄存器 和 內(nèi)存模型。先來(lái)看寄存器。CPU 本身只負(fù)責(zé)運(yùn)算,不負(fù)責(zé)儲(chǔ)存數(shù)據(jù)。數(shù)據(jù)一般都儲(chǔ)存在內(nèi)存之中,CPU 要用的時(shí)候就去內(nèi)存讀寫(xiě)數(shù)據(jù)。但是,CPU 的運(yùn)算速度遠(yuǎn)高于內(nèi)存的讀寫(xiě)速度,為了避免被拖慢,CPU 都自帶一級(jí)緩存和二級(jí)緩存?;旧?,CPU 緩存可以看作是讀寫(xiě)速度較快的內(nèi)存。但是,CPU 緩存還是不夠快,另外數(shù)據(jù)在緩存里面的地址是不固定的,CPU 每次讀寫(xiě)都要尋址也會(huì)拖慢速度。因此,除了緩存之外,CPU 還自帶了寄存器(register),用來(lái)儲(chǔ)存最常用的數(shù)據(jù)。也就是說(shuō),那些最頻繁讀寫(xiě)的數(shù)據(jù)(比如循環(huán)變量),都會(huì)放在寄存器里面,CPU 優(yōu)先讀寫(xiě)寄存器,再由寄存器跟內(nèi)存交換數(shù)據(jù)。

f261051a-8049-11ee-939d-92fbcf53809c.png

寄存器不依靠地址區(qū)分?jǐn)?shù)據(jù),而依靠名稱(chēng)。每一個(gè)寄存器都有自己的名稱(chēng),我們告訴 CPU 去具體的哪一個(gè)寄存器拿數(shù)據(jù),這樣的速度是最快的。有人比喻寄存器是 CPU 的零級(jí)緩存。

四、寄存器的種類(lèi)

早期的 x86 CPU 只有8個(gè)寄存器,而且每個(gè)都有不同的用途?,F(xiàn)在的寄存器已經(jīng)有100多個(gè)了,都變成通用寄存器,不特別指定用途了,但是早期寄存器的名字都被保存了下來(lái)。
  • EAX
  • EBX
  • ECX
  • EDX
  • EDI
  • ESI
  • EBP
  • ESP
上面這8個(gè)寄存器之中,前面七個(gè)都是通用的。ESP 寄存器有特定用途,保存當(dāng)前 Stack 的地址(詳見(jiàn)下一節(jié))。

f276262a-8049-11ee-939d-92fbcf53809c.png

我們常??吹?32位 CPU、64位 CPU 這樣的名稱(chēng),其實(shí)指的就是寄存器的大小。32 位 CPU 的寄存器大小就是4個(gè)字節(jié)。

五、內(nèi)存模型:Heap

寄存器只能存放很少量的數(shù)據(jù),大多數(shù)時(shí)候,CPU 要指揮寄存器,直接跟內(nèi)存交換數(shù)據(jù)。所以,除了寄存器,還必須了解內(nèi)存怎么儲(chǔ)存數(shù)據(jù)。程序運(yùn)行的時(shí)候,操作系統(tǒng)會(huì)給它分配一段內(nèi)存,用來(lái)儲(chǔ)存程序和運(yùn)行產(chǎn)生的數(shù)據(jù)。這段內(nèi)存有起始地址和結(jié)束地址,比如從0x1000到0x8000,起始地址是較小的那個(gè)地址,結(jié)束地址是較大的那個(gè)地址。

f288256e-8049-11ee-939d-92fbcf53809c.png

程序運(yùn)行過(guò)程中,對(duì)于動(dòng)態(tài)的內(nèi)存占用請(qǐng)求(比如新建對(duì)象,或者使用malloc命令),系統(tǒng)就會(huì)從預(yù)先分配好的那段內(nèi)存之中,劃出一部分給用戶(hù),具體規(guī)則是從起始地址開(kāi)始劃分(實(shí)際上,起始地址會(huì)有一段靜態(tài)數(shù)據(jù),這里忽略)。舉例來(lái)說(shuō),用戶(hù)要求得到10個(gè)字節(jié)內(nèi)存,那么從起始地址0x1000開(kāi)始給他分配,一直分配到地址0x100A,如果再要求得到22個(gè)字節(jié),那么就分配到0x1020。

f2958d58-8049-11ee-939d-92fbcf53809c.png

這種因?yàn)橛脩?hù)主動(dòng)請(qǐng)求而劃分出來(lái)的內(nèi)存區(qū)域,叫做 Heap(堆)。它由起始地址開(kāi)始,從低位(地址)向高位(地址)增長(zhǎng)。Heap 的一個(gè)重要特點(diǎn)就是不會(huì)自動(dòng)消失,必須手動(dòng)釋放,或者由垃圾回收機(jī)制來(lái)回收。

六、內(nèi)存模型:Stack

除了 Heap 以外,其他的內(nèi)存占用叫做 Stack(棧)。簡(jiǎn)單說(shuō),Stack 是由于函數(shù)運(yùn)行而臨時(shí)占用的內(nèi)存區(qū)域。

f2a0fb84-8049-11ee-939d-92fbcf53809c.png

請(qǐng)看下面的例子。

	
int main() {
   int a = 2;
   int b = 3;
}
上面代碼中,系統(tǒng)開(kāi)始執(zhí)行main函數(shù)時(shí),會(huì)為它在內(nèi)存里面建立一個(gè)幀(frame),所有main的內(nèi)部變量(比如a和b)都保存在這個(gè)幀里面。main函數(shù)執(zhí)行結(jié)束后,該幀就會(huì)被回收,釋放所有的內(nèi)部變量,不再占用空間。

f2a0fb84-8049-11ee-939d-92fbcf53809c.png

如果函數(shù)內(nèi)部調(diào)用了其他函數(shù),會(huì)發(fā)生什么情況?

	
int main() {
   int a = 2;
   int b = 3;
   return add_a_and_b(a, b);
}
上面代碼中,main函數(shù)內(nèi)部調(diào)用了add_a_and_b函數(shù)。執(zhí)行到這一行的時(shí)候,系統(tǒng)也會(huì)為add_a_and_b新建一個(gè)幀,用來(lái)儲(chǔ)存它的內(nèi)部變量。也就是說(shuō),此時(shí)同時(shí)存在兩個(gè)幀:main和add_a_and_b。一般來(lái)說(shuō),調(diào)用棧有多少層,就有多少幀。

f2c3c6c8-8049-11ee-939d-92fbcf53809c.png

等到add_a_and_b運(yùn)行結(jié)束,它的幀就會(huì)被回收,系統(tǒng)會(huì)回到函數(shù)main剛才中斷執(zhí)行的地方,繼續(xù)往下執(zhí)行。通過(guò)這種機(jī)制,就實(shí)現(xiàn)了函數(shù)的層層調(diào)用,并且每一層都能使用自己的本地變量。所有的幀都存放在 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 就都釋放了。

f2d71f20-8049-11ee-939d-92fbcf53809c.png

f2eeebe6-8049-11ee-939d-92fbcf53809c.png

Stack 是由內(nèi)存區(qū)域的結(jié)束地址開(kāi)始,從高位(地址)向低位(地址)分配。比如,內(nèi)存區(qū)域的結(jié)束地址是0x8000,第一幀假定是16字節(jié),那么下一次分配的地址就會(huì)從0x7FF0開(kāi)始;第二幀假定需要64字節(jié),那么地址就會(huì)移動(dòng)到0x7FB0。

f2f9e6a4-8049-11ee-939d-92fbcf53809c.png

七、CPU 指令

7.1 一個(gè)實(shí)例

了解寄存器和內(nèi)存模型以后,就可以來(lái)看匯編語(yǔ)言到底是什么了。下面是一個(gè)簡(jiǎn)單的程序example.c。

	
int add_a_and_b(int a, int b) {
   return a + b;
}


int main() {
   return add_a_and_b(2, 3);
}
gcc 將這個(gè)程序轉(zhuǎn)成匯編語(yǔ)言。
$ gcc -S example.c
上面的命令執(zhí)行以后,會(huì)生成一個(gè)文本文件example.s,里面就是匯編語(yǔ)言,包含了幾十行指令。這么說(shuō)吧,一個(gè)高級(jí)語(yǔ)言的簡(jiǎn)單操作,底層可能由幾個(gè),甚至幾十個(gè) CPU 指令構(gòu)成。CPU 依次執(zhí)行這些指令,完成這一步操作。example.s經(jīng)過(guò)簡(jiǎn)化以后,大概是下面的樣子。

	
_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  


_main:
   push   3
   push   2
   call   _add_a_and_b 
   add    %esp, 8
   ret
可以看到,原程序的兩個(gè)函數(shù)add_a_and_b和main,對(duì)應(yīng)兩個(gè)標(biāo)簽_add_a_and_b和_main。每個(gè)標(biāo)簽里面是該函數(shù)所轉(zhuǎn)成的 CPU 運(yùn)行流程。每一行就是 CPU 執(zhí)行的一次操作。它又分成兩部分,就以其中一行為例。
push   %ebx
這一行里面,push是 CPU 指令,%ebx是該指令要用到的運(yùn)算子。一個(gè) CPU 指令可以有零個(gè)到多個(gè)運(yùn)算子。下面我就一行一行講解這個(gè)匯編程序,建議讀者最好把這個(gè)程序,在另一個(gè)窗口拷貝一份,省得閱讀的時(shí)候再把頁(yè)面滾動(dòng)上來(lái)。

7.2 push 指令

根據(jù)約定,程序從_main標(biāo)簽開(kāi)始執(zhí)行,這時(shí)會(huì)在 Stack 上為main建立一個(gè)幀,并將 Stack 所指向的地址,寫(xiě)入 ESP 寄存器。后面如果有數(shù)據(jù)要寫(xiě)入main這個(gè)幀,就會(huì)寫(xiě)在 ESP 寄存器所保存的地址。然后,開(kāi)始執(zhí)行第一行代碼。
push   3
push指令用于將運(yùn)算子放入 Stack,這里就是將3寫(xiě)入main這個(gè)幀。雖然看上去很簡(jiǎn)單,push指令其實(shí)有一個(gè)前置操作。它會(huì)先取出 ESP 寄存器里面的地址,將其減去4個(gè)字節(jié),然后將新地址寫(xiě)入 ESP 寄存器。使用減法是因?yàn)?Stack 從高位向低位發(fā)展,4個(gè)字節(jié)則是因?yàn)?的類(lèi)型是int,占用4個(gè)字節(jié)。得到新地址以后, 3 就會(huì)寫(xiě)入這個(gè)地址開(kāi)始的四個(gè)字節(jié)。
push   2
第二行也是一樣,push指令將2寫(xiě)入main這個(gè)幀,位置緊貼著前面寫(xiě)入的3。這時(shí),ESP 寄存器會(huì)再減去 4個(gè)字節(jié)(累計(jì)減去8)。

f30cb522-8049-11ee-939d-92fbcf53809c.png

7.3 call 指令

第三行的call指令用來(lái)調(diào)用函數(shù)。
call   _add_a_and_b
上面的代碼表示調(diào)用add_a_and_b函數(shù)。這時(shí),程序就會(huì)去找_add_a_and_b標(biāo)簽,并為該函數(shù)建立一個(gè)新的幀。下面就開(kāi)始執(zhí)行_add_a_and_b的代碼。
push   %ebx
這一行表示將 EBX 寄存器里面的值,寫(xiě)入_add_a_and_b這個(gè)幀。這是因?yàn)楹竺嬉玫竭@個(gè)寄存器,就先把里面的值取出來(lái),用完后再寫(xiě)回去。這時(shí),push指令會(huì)再將 ESP 寄存器里面的地址減去4個(gè)字節(jié)(累計(jì)減去12)。

7.4 mov 指令

mov指令用于將一個(gè)值寫(xiě)入某個(gè)寄存器。
mov    %eax, [%esp+8]
這一行代碼表示,先將 ESP 寄存器里面的地址加上8個(gè)字節(jié),得到一個(gè)新的地址,然后按照這個(gè)地址在 Stack 取出數(shù)據(jù)。根據(jù)前面的步驟,可以推算出這里取出的是2,再將2寫(xiě)入 EAX 寄存器。下一行代碼也是干同樣的事情。
mov    %ebx, [%esp+12]
上面的代碼將 ESP 寄存器的值加12個(gè)字節(jié),再按照這個(gè)地址在 Stack 取出數(shù)據(jù),這次取出的是3,將其寫(xiě)入 EBX 寄存器。

7.5 add 指令

add指令用于將兩個(gè)運(yùn)算子相加,并將結(jié)果寫(xiě)入第一個(gè)運(yùn)算子。
add    %eax, %ebx
上面的代碼將 EAX 寄存器的值(即2)加上 EBX 寄存器的值(即3),得到結(jié)果5,再將這個(gè)結(jié)果寫(xiě)入第一個(gè)運(yùn)算子 EAX 寄存器。

7.6 pop 指令

pop指令用于取出 Stack 最近一個(gè)寫(xiě)入的值(即最低位地址的值),并將這個(gè)值寫(xiě)入運(yùn)算子指定的位置。
pop    %ebx
上面的代碼表示,取出 Stack 最近寫(xiě)入的值(即 EBX 寄存器的原始值),再將這個(gè)值寫(xiě)回 EBX 寄存器(因?yàn)榧臃ㄒ呀?jīng)做完了,EBX 寄存器用不到了)。注意,pop指令還會(huì)將 ESP 寄存器里面的地址加4,即回收4個(gè)字節(jié)。

7.7 ret 指令

ret指令用于終止當(dāng)前函數(shù)的執(zhí)行,將運(yùn)行權(quán)交還給上層函數(shù)。也就是,當(dāng)前函數(shù)的幀將被回收。
ret
可以看到,該指令沒(méi)有運(yùn)算子。隨著add_a_and_b函數(shù)終止執(zhí)行,系統(tǒng)就回到剛才main函數(shù)中斷的地方,繼續(xù)往下執(zhí)行。
add    %esp, 8
上面的代碼表示,將 ESP 寄存器里面的地址,手動(dòng)加上8個(gè)字節(jié),再寫(xiě)回 ESP 寄存器。這是因?yàn)?ESP 寄存器的是 Stack 的寫(xiě)入開(kāi)始地址,前面的pop操作已經(jīng)回收了4個(gè)字節(jié),這里再回收8個(gè)字節(jié),等于全部回收。
ret
最后,main函數(shù)運(yùn)行結(jié)束,ret指令退出程序執(zhí)行。http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10804

    瀏覽量

    210829
  • 匯編語(yǔ)言
    +關(guān)注

    關(guān)注

    14

    文章

    409

    瀏覽量

    35693
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015

原文標(biāo)題:看完這篇文章,匯編也不難

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么要反匯編?反匯編文件的生成和解讀

    匯編顧名思義就是匯編的逆過(guò)程,將二進(jìn)制文件反匯編匯編代碼。arm-linux-objdump是交叉編譯工具鏈里的一個(gè)工具,專(zhuān)門(mén)用來(lái)反匯編
    發(fā)表于 08-02 10:25 ?6658次閱讀
    為什么要反<b class='flag-5'>匯編</b>?反<b class='flag-5'>匯編</b>文件的生成和解讀

    qemu入門(mén)難不難

    大佬閃,QEMU在win11下面好不好裝,入門(mén)難不難。
    發(fā)表于 04-14 06:58

    arm到底難不難

    馬上就要學(xué)ARM 啦,不知道這個(gè)到底難不難?有哪位高手能夠指點(diǎn)下不?
    發(fā)表于 11-12 11:58

    關(guān)于編寫(xiě)ARM匯編程序的幾點(diǎn)理解

    其實(shí)編寫(xiě)ARM匯編程序并不難,但初步學(xué)習(xí)理解困難。關(guān)鍵我們需整體進(jìn)行匯編學(xué)習(xí)。其實(shí)對(duì)于ARM來(lái)說(shuō),無(wú)非就是那些指令使用,但指令很多。學(xué)過(guò)51的匯編指令很少,為什么?很容易,ARM中有3
    發(fā)表于 07-03 00:19

    單片機(jī)難不難學(xué)?

    單片機(jī)難不難學(xué)?編程難不難?
    發(fā)表于 03-01 08:34

    學(xué)習(xí)Stm32難不難

    一、入門(mén)總結(jié)  1.1為什么要把時(shí)間花在“猶豫”上?  每當(dāng)我們?cè)谌腴T(mén)之前(ARm是這樣,DsP一樣),總會(huì)有很多疑問(wèn),會(huì)有很多顧慮。我們渴望知道學(xué)習(xí)Stm32前景如何?需要啥基礎(chǔ)?難不難?適
    發(fā)表于 08-03 07:11

    ARM標(biāo)準(zhǔn)匯編與GNU匯編大全

    ARM標(biāo)準(zhǔn)匯編與GNU匯編 前段時(shí)間看arm的匯編,發(fā)現(xiàn)很多有一個(gè)小點(diǎn),但是借來(lái)的書(shū)上的語(yǔ)法卻沒(méi)有,問(wèn)同學(xué)不知道,于是在網(wǎng)上查了一番才發(fā)現(xiàn)我書(shū)上看到的
    發(fā)表于 03-03 16:24 ?100次下載

    中斷方式閃爍【匯編版】

    中斷方式閃爍【匯編版】中斷方式閃爍【匯編版】中斷方式閃爍【匯編版】中斷方式閃爍【匯編版】
    發(fā)表于 12-29 10:50 ?0次下載

    按鍵讀取程序【匯編版】

    按鍵讀取程序【匯編版】按鍵讀取程序【匯編版】按鍵讀取程序【匯編版】按鍵讀取程序【匯編版】
    發(fā)表于 12-29 11:05 ?0次下載

    內(nèi)聯(lián)匯編和嵌入型匯編的使用

    ),如SSAT16 和 USAT16指令。 程序中需要對(duì)協(xié)處理器進(jìn)行操作。 在C或C++程序中完成對(duì)程序狀態(tài)寄存器的操作。 使用內(nèi)聯(lián)匯編編寫(xiě)的程序代碼效率比較高。 12.1.1 內(nèi)聯(lián)匯編 1.內(nèi)
    發(fā)表于 10-19 09:30 ?0次下載

    PIC反匯編(一)匯編程序和PIC

    PIC反匯編(一)匯編程序和PIC前言1、PIC2、匯編語(yǔ)言和反匯編語(yǔ)言3、目標(biāo)流程前言由于一些要求,現(xiàn)在需要將一段hex文件反匯編成為C,
    發(fā)表于 11-16 16:21 ?20次下載
    PIC反<b class='flag-5'>匯編</b>(一)<b class='flag-5'>匯編</b>程序和PIC

    【IAR下的匯編】IAR下的匯編/單片機(jī)啟動(dòng)代碼匯編

    【IAR下的匯編】IAR下的匯編/單片機(jī)啟動(dòng)代碼匯編
    發(fā)表于 12-03 10:21 ?12次下載
    【IAR下的<b class='flag-5'>匯編</b>】IAR下的<b class='flag-5'>匯編</b>/單片機(jī)啟動(dòng)代碼<b class='flag-5'>匯編</b>

    RISC-V匯編簡(jiǎn)介

    RISC-V匯編簡(jiǎn)介匯編語(yǔ)言有3類(lèi)指令組成:a.匯編指令:機(jī)器碼的助記符,有對(duì)應(yīng)的機(jī)器碼,可以翻譯成對(duì)應(yīng)的二進(jìn)制機(jī)器碼。b.偽指令:沒(méi)有對(duì)應(yīng)的機(jī)器碼,由匯編器解釋執(zhí)行,可以翻譯成多條
    發(fā)表于 12-08 18:21 ?9次下載
    RISC-V<b class='flag-5'>匯編</b>簡(jiǎn)介

    匯編

    1.如何在C語(yǔ)言程序集成匯編總結(jié):1)Turbo C :①使用預(yù)處理程序的偽指令#asm和#endasm,#asm用來(lái)開(kāi)始一個(gè)匯編程序塊,而#endasm指令用于該塊的結(jié)束。/*#pragram
    發(fā)表于 12-31 18:53 ?1次下載
    <b class='flag-5'>匯編</b>

    微機(jī)原理匯編chm和匯編工具

    微機(jī)原理匯編chm和匯編工具
    發(fā)表于 03-06 10:23 ?1次下載