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

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

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

在學(xué)習(xí)STM32時(shí)為什么要學(xué)習(xí)匯編?

Q4MP_gh_c472c21 ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 作者:STM32嵌入式開(kāi)發(fā) ? 2020-11-26 14:32 ? 次閱讀

不同的平臺(tái)的匯編代碼是不一樣的,最早的匯編在50年代就發(fā)明了,比很多人的父母的年齡都大,老掉牙,不用學(xué)習(xí)怎么寫(xiě)匯編。一個(gè)公司有一個(gè)人知道怎么寫(xiě)匯編就夠了。但要學(xué)習(xí)讀匯編,為什么學(xué)習(xí)匯編? 1、性能 直接翻譯為機(jī)器語(yǔ)言,性能最高。優(yōu)秀的C語(yǔ)言效率只能達(dá)到匯編的80%左右。其他高級(jí)語(yǔ)言跟匯編一比差得更遠(yuǎn)。語(yǔ)言越高級(jí)性能越差。很多bootloader和BIOS用匯編寫(xiě),匯編操作的是電腦,手機(jī)剛剛上電時(shí),硬件和初始化的那些命令,它們的性能的要求比較高,效率高開(kāi)機(jī)速度更快。

分析問(wèn)題 個(gè)人認(rèn)為,編程人與機(jī)器對(duì)話,我們寫(xiě)C,寫(xiě)JAVA,但是電腦并不認(rèn)識(shí)這些語(yǔ)言,電腦只認(rèn)識(shí)0和1;所以需要一個(gè)人來(lái)翻譯這些語(yǔ)言,這個(gè)翻譯官就是編譯器,但是編譯器不能百分之百準(zhǔn)確的表達(dá)程序員的意思,也就是所謂的翻譯有反義。例如,編譯器為了性能好一點(diǎn),可能會(huì)優(yōu)化變量和語(yǔ)句,這個(gè)過(guò)程可能好心辦壞事,把有用的操作優(yōu)化了。因此只有看懂一些匯編語(yǔ)句,才能分析程序真正執(zhí)行的流程。在問(wèn)題難以定位的情況下,匯編可能是分析問(wèn)題的最后一根稻草。 幫助理解硬件 有些學(xué)校的單片機(jī)課程是以匯編進(jìn)行教學(xué)的,主要原因就是匯編更貼近硬件。不過(guò)我不贊成這種做法,C語(yǔ)言能快速做出一點(diǎn)東西,有利于學(xué)生在放棄之前,增加成就感,好堅(jiān)持下去。但是匯編確實(shí)更貼近硬件。

LDR指令

為了便于理解下文,先介紹下LDR指令,其格式如下:

LDR{條件} 目的寄存器 <存儲(chǔ)器地址> 作用:將 存儲(chǔ)器地址 所指地址處連續(xù)的4個(gè)字節(jié)(1個(gè)字)的數(shù)據(jù)傳送到目的寄存器中。LDR指令的尋址方式比較靈活,實(shí)例如下:

LDR R0,[R1] ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0。LDR R0,[R1,R2] ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0。LDR R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0。LDR R0,[R1],R2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+R2的值存入R1。LDR R0,[R1],#8 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+8的值存入R1。LDR R0,[R1,R2]! ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+R2的值存入R1。LDR R0,[R1,LSL #3] ;將存儲(chǔ)器地址為R1*8的字?jǐn)?shù)據(jù)讀入寄存器R0。LDR R0,[R1,R2,LSL #2] ;將存儲(chǔ)器地址為R1+R2*4的字?jǐn)?shù)據(jù)讀入寄存器R0。LDR R0,[R1,,R2,LSL #2]??;將存儲(chǔ)器地址為R1+R2*4的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+R2*4的值存入R1。LDR R0,[R1],R2,LSL #2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+R2*4的值存入R1。LDR R0,Label ;Label為程序標(biāo)號(hào),Label必須是當(dāng)前指令的-4~4KB范圍內(nèi)。要注意的是:

LDR Rd,[Rn],#0x04 ;這里Rd不允許是R15。 另外LDRB 的指令格式與LDR相似,只不過(guò)它是將存儲(chǔ)器地址中的8位(1個(gè)字節(jié))讀到目的寄存器中。LDRH的指令格式也與LDR相似,它是將內(nèi)存中的16位(半字)讀到目的寄存器中。

LDR R0,=0xff 這里的LDR不是arm指令,而是偽指令。這個(gè)時(shí)候與MOVE很相似,只不過(guò)MOV指令后的立即數(shù)是有限制的。這個(gè)立即數(shù)必須是0X00-OXFF范圍內(nèi)的數(shù)經(jīng)過(guò)偶數(shù)次右移得到的數(shù),所以MOV用起來(lái)比較麻煩,因?yàn)橛行?shù)不那么容易看出來(lái)是否合法。 2、如何在KEIL下閱讀匯編 按d進(jìn)入debug模式,在view下選擇disassembly window 。

看光標(biāo),c文件下指向了main函數(shù)的第一行。 匯編窗口也指向了對(duì)應(yīng)的語(yǔ)句。但是,在執(zhí)行C語(yǔ)言的第一行之前,仍然有許多操作要做,比如變量放在哪?在哪里調(diào)用了main函數(shù)等,這些操作都被集成開(kāi)發(fā)環(huán)境IDE給封裝起來(lái)了。我們必須知道,在執(zhí)行main函數(shù)之前,有許多事情要做,只不過(guò),初學(xué)的時(shí)候不必理會(huì)。以下是C語(yǔ)言源碼,功能是點(diǎn)亮LED。

//main.c#include int main(void){ RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; GPIOB->CRL &= ~(0xf<<(1*4)); GPIOB->CRL |= 0x2<<(1*4); GPIOB->ODR &= ~(1<<1); return 0; } //main.h#define RCC_APB2ENR (*(unsigned int *)0x40021018)#define GPIOB_CRL (*(unsigned int *)0x40010c00)#define GPIOB_ODR (*(unsigned int *)0x40010c0c)? 匯編窗口往上翻,確實(shí)很多語(yǔ)句,先看這幾行代碼的匯編: ?

先說(shuō)最常用的兩句匯編:

LDR r0,[r1] r0 = *r1 STR r0,[r1] *r1 = r0 MOVr0,r1r1->r0拷貝

從內(nèi)存0x0800 017c的32位數(shù)據(jù)拷貝到r0:

r0 = * 0x0800 017c 我們看到的 1000 4002其實(shí) 就是0x4002 1000。這里邊有個(gè)知識(shí)點(diǎn)叫做大小端模式,以下簡(jiǎn)單講解,不能理解就記住。

這個(gè)數(shù)據(jù)是在地址是這么存放的: 7C 7D 7E 7F 00 10 02 40 實(shí)際數(shù)據(jù)是0x4002 1000

* 0x0800 017c=0x4002 1000 然后r0的值+0x18也就是24 因?yàn)檫@個(gè)是第6號(hào)(第6號(hào)就是第7個(gè)的意思)元素 得到r0 = *0x4002 1018,r0的值由一個(gè)地址,變成了地址所存放的數(shù)據(jù)。 然后是或0x08操作,結(jié)果再?gòu)?fù)制給r0,*0x4002 1018 |=0x08 給r1分配地址,這個(gè)地址也是0x4002 1000, r1 = *0x4002 1000 把r0存放的值,(不是r0的地址,)存到r1+18的空間上 *(r1+0x18) = r0 *0x4002 1018 = (*0x4002 1018 |=0x08) *0x4002 1018|=0x08 最終結(jié)果:地址4002 1018的數(shù),執(zhí)行了或0x08的操作。再分析下一句 :

前兩句給r0分配空間,r0 = *0x4001 0c00 然后用BIC清除數(shù)據(jù)位,把4-7位清零,結(jié)果再賦值給r0。

*0x4001 0c00 &= ~(0xf0) r1 = *0x4001 0c00 *0x4001 0c00 &= ~(0xf0)

剩下的不再詳細(xì)分析,直接給答案:

***0x4001 0c00 |= 0x20 0x4001 0c0c &= ~(0x02)* 最終,可以看到C語(yǔ)句被翻譯成了意料之中的匯編語(yǔ)句,自己的意圖被機(jī)器準(zhǔn)確的理解了。

原文標(biāo)題:學(xué)習(xí)STM32時(shí)為什么要學(xué)習(xí)匯編?

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10915

    瀏覽量

    356758
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137249

原文標(biāo)題:學(xué)習(xí)STM32時(shí)為什么要學(xué)習(xí)匯編?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    華為云 Flexus X 實(shí)例部署安裝 Jupyter Notebook,學(xué)習(xí) AI,機(jī)器學(xué)習(xí)算法

    前言 由于本人最近在學(xué)習(xí)一些機(jī)器算法,AI 算法的知識(shí),需要搭建一個(gè)學(xué)習(xí)環(huán)境,所以就在最近購(gòu)買的華為云 Flexus X 實(shí)例上安裝了學(xué)習(xí)環(huán)境,Jupyter Notebook。沒(méi)想到效果格外
    的頭像 發(fā)表于 01-02 13:43 ?112次閱讀
    華為云 Flexus X 實(shí)例部署安裝 Jupyter Notebook,<b class='flag-5'>學(xué)習(xí)</b> AI,機(jī)器<b class='flag-5'>學(xué)習(xí)</b>算法

    什么是機(jī)器學(xué)習(xí)?通過(guò)機(jī)器學(xué)習(xí)方法能解決哪些問(wèn)題?

    來(lái)源:Master編程樹(shù)“機(jī)器學(xué)習(xí)”最初的研究動(dòng)機(jī)是讓計(jì)算機(jī)系統(tǒng)具有人的學(xué)習(xí)能力以便實(shí)現(xiàn)人工智能。因?yàn)闆](méi)有學(xué)習(xí)能力的系統(tǒng)很難被認(rèn)為是具有智能的。目前被廣泛采用的機(jī)器學(xué)習(xí)的定義是“利用經(jīng)
    的頭像 發(fā)表于 11-16 01:07 ?460次閱讀
    什么是機(jī)器<b class='flag-5'>學(xué)習(xí)</b>?通過(guò)機(jī)器<b class='flag-5'>學(xué)習(xí)</b>方法能解決哪些問(wèn)題?

    在學(xué)習(xí)go語(yǔ)言的過(guò)程踩過(guò)的坑

    作為一個(gè)5年的phper,這兩年公司和個(gè)人都在順應(yīng)技術(shù)趨勢(shì),新項(xiàng)目慢慢從php轉(zhuǎn)向了go語(yǔ)言,從2021年到現(xiàn)在,筆者手上也先后開(kāi)發(fā)了兩個(gè)go項(xiàng)目。在學(xué)習(xí)go語(yǔ)言的過(guò)程中也學(xué)習(xí)并總結(jié)了一些相關(guān)的東西,這篇文章就分享下自己踩過(guò)的一些坑吧。
    的頭像 發(fā)表于 11-11 09:22 ?183次閱讀

    嵌入式學(xué)習(xí)建議

    培訓(xùn)班的宣傳所誤導(dǎo),而忽視實(shí)際嵌入式系統(tǒng)軟硬件基礎(chǔ)知識(shí)的學(xué)習(xí)。 ⑤避免片面地單純從“電子”或“計(jì)算機(jī)軟件”角度認(rèn)識(shí)嵌入式系統(tǒng)。前面說(shuō)過(guò),嵌入式系統(tǒng)是軟件與硬件的綜合體。因此,逐步從MCU的最小
    發(fā)表于 10-22 11:41

    如何學(xué)習(xí)ARM?

    ARM 處理器的程序。此外,還需要了解一些常用的開(kāi)發(fā)工具和調(diào)試工具,如交叉編譯器、調(diào)試器等。 4.實(shí)踐項(xiàng)目: 在學(xué)習(xí)的過(guò)程中進(jìn)行一些實(shí)踐項(xiàng)目是很有幫助的。你可以嘗試使用開(kāi)發(fā)板或模擬器進(jìn)行簡(jiǎn)單的嵌入式開(kāi)發(fā)
    發(fā)表于 10-11 10:42

    入門?畢設(shè)?競(jìng)賽?項(xiàng)目練手?STM32/嵌入式/物聯(lián)網(wǎng)學(xué)習(xí),有這幾款開(kāi)發(fā)板就夠了!

    針對(duì)STM32單片機(jī)、嵌入式Linux、物聯(lián)網(wǎng)初學(xué)者,我們精心梳理了從“入門到項(xiàng)目進(jìn)階”完整學(xué)習(xí)路徑,并配有詳細(xì)的教程、視頻講解、源代碼以及豐富的實(shí)戰(zhàn)案例資料??蓮V泛用于高校教學(xué)、學(xué)生畢設(shè)、個(gè)人學(xué)習(xí)
    的頭像 發(fā)表于 10-10 16:31 ?362次閱讀
    入門?畢設(shè)?競(jìng)賽?項(xiàng)目練手?<b class='flag-5'>STM32</b>/嵌入式/物聯(lián)網(wǎng)<b class='flag-5'>學(xué)習(xí)</b>,有這幾款開(kāi)發(fā)板就夠了!

    如何幫助孩子高效學(xué)習(xí)Python:開(kāi)源硬件實(shí)踐是最優(yōu)選擇

    家長(zhǎng)們常常擔(dān)心孩子在學(xué)習(xí)Python時(shí)所面臨的挑戰(zhàn),如復(fù)雜性、興趣保持、學(xué)習(xí)進(jìn)度和可用資源。對(duì)于希望有效教授孩子Python的家長(zhǎng)而言,了解硬件的作用至關(guān)重要,因?yàn)榻Y(jié)合硬件項(xiàng)目的Python學(xué)習(xí)能夠
    的頭像 發(fā)表于 09-06 09:49 ?346次閱讀

    初學(xué)STM32的常見(jiàn)誤區(qū)與解決方法

    對(duì)于初學(xué)者來(lái)說(shuō),STM32是一種功能強(qiáng)大但也相對(duì)復(fù)雜的微控制器平臺(tái)。許多人在學(xué)習(xí)了幾天后,常常會(huì)感到困惑和迷茫。這種情況并不罕見(jiàn),尤其是在缺乏扎實(shí)基礎(chǔ)的情況下直接接觸這樣復(fù)雜的芯片。這篇文章旨在
    的頭像 發(fā)表于 09-05 08:00 ?606次閱讀
    初學(xué)<b class='flag-5'>STM32</b>的常見(jiàn)誤區(qū)與解決方法

    深度學(xué)習(xí)中的無(wú)監(jiān)督學(xué)習(xí)方法綜述

    深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)領(lǐng)域的一個(gè)重要分支,近年來(lái)在多個(gè)領(lǐng)域取得了顯著的成果,特別是在圖像識(shí)別、語(yǔ)音識(shí)別、自然語(yǔ)言處理等領(lǐng)域。然而,深度學(xué)習(xí)模型的強(qiáng)大性能往往依賴于大量有標(biāo)簽的數(shù)據(jù)進(jìn)行訓(xùn)練,這在實(shí)際
    的頭像 發(fā)表于 07-09 10:50 ?846次閱讀

    嵌入式開(kāi)發(fā)學(xué)習(xí)

    在學(xué)校專注于學(xué)這一門,感覺(jué)特別受用,所以想深入學(xué)習(xí)一些關(guān)于嵌入式的一些知識(shí)
    發(fā)表于 07-09 08:24

    按照這樣學(xué)習(xí)C語(yǔ)言,成為卷王不是夢(mèng)!

    一些學(xué)習(xí)C語(yǔ)言的建議,讓你在學(xué)習(xí)之路上更加游刃有余,成為C語(yǔ)言的高手。按照這樣學(xué)習(xí)C語(yǔ)言,成為卷王不是夢(mèng)要想成為C語(yǔ)言的“卷王”,首先要打好理論基礎(chǔ)。理解C語(yǔ)言的
    的頭像 發(fā)表于 07-06 08:04 ?335次閱讀
    按照這樣<b class='flag-5'>學(xué)習(xí)</b>C語(yǔ)言,成為卷王不是夢(mèng)!

    深度學(xué)習(xí)與傳統(tǒng)機(jī)器學(xué)習(xí)的對(duì)比

    在人工智能的浪潮中,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)無(wú)疑是兩大核心驅(qū)動(dòng)力。它們各自以其獨(dú)特的方式推動(dòng)著技術(shù)的進(jìn)步,為眾多領(lǐng)域帶來(lái)了革命性的變化。然而,盡管它們都屬于機(jī)器學(xué)習(xí)的范疇,但深度學(xué)習(xí)和傳統(tǒng)機(jī)
    的頭像 發(fā)表于 07-01 11:40 ?1466次閱讀

    stm32單片機(jī)學(xué)習(xí)路線

    第一步 編程及硬件基礎(chǔ)知識(shí) 1.掌握C語(yǔ)言基礎(chǔ) 作為STM32的主要編程語(yǔ)言,C語(yǔ)言的基礎(chǔ)知識(shí)是必不可少的。建議通過(guò)書(shū)籍、在線課程或者教學(xué)視頻系統(tǒng)地學(xué)習(xí)C語(yǔ)言的基礎(chǔ)知識(shí),包括語(yǔ)法、數(shù)據(jù)類型
    發(fā)表于 05-10 15:34

    STM32高手進(jìn)階之路與實(shí)用學(xué)習(xí)步驟

    CPU是相通的,相信大部分的同學(xué)都學(xué)習(xí)過(guò)單片機(jī),是有一定基礎(chǔ)的。如果你碰到問(wèn)題,去嘗試了,自己把問(wèn)題解決了,你會(huì)很有成就感!
    的頭像 發(fā)表于 03-13 09:38 ?635次閱讀

    為什么深度學(xué)習(xí)的效果更好?

    導(dǎo)讀深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)子集,已成為人工智能領(lǐng)域的一項(xiàng)變革性技術(shù),在從計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理到自動(dòng)駕駛汽車等廣泛的應(yīng)用中取得了顯著的成功。深度學(xué)習(xí)的有效性并非偶然,而是植根于幾個(gè)基本原則和進(jìn)步
    的頭像 發(fā)表于 03-09 08:26 ?651次閱讀
    為什么深度<b class='flag-5'>學(xué)習(xí)</b>的效果更好?