日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年09月22日(星期日)

正在發(fā)生

2020年09月22日 | STM8S匯編代碼分析

發(fā)布者:快樂(lè)飛翔 來(lái)源: eefocus關(guān)鍵字:STM8S  匯編代碼 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

這里寫圖片描述

 
其中.asm文件是匯編代碼的源文件,.inc文件是包含文件,類似于C語(yǔ)言當(dāng)在的.c文件和.h文件。接下來(lái)讓我們來(lái)分析一下這三個(gè)文件。(分析匯編代碼最好也要對(duì)STM8單片機(jī)的啟動(dòng)流程有所了解,可以看我的另一篇博文http://blog.csdn.net/u010093140/article/details/49982879
首先是看mapping.inc文件:


;------------------------------------------------------

; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY STVD

; SHOULD NOT BE MANUALLY MODIFIED.

; CHANGES WILL BE LOST WHEN FILE IS REGENERATED.

;------------------------------------------------------

#define RAM0 1

#define ram0_segment_start 0

#define ram0_segment_end FF

#define RAM1 1

#define ram1_segment_start 100

#define ram1_segment_end 5FF

#define stack_segment_start 600

#define stack_segment_end 7FF


這一段代碼應(yīng)該不難看懂,就是定義了一些常量。需要注意的是,分號(hào)”;”是匯編代碼中用于寫注釋的符號(hào)。所以分號(hào)后面跟的是注釋。 

接下來(lái)就是看一下mapping.asm文件



stm8/

    ;------------------------------------------------------

    ; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY STVD

    ; SHOULD NOT BE MANUALLY MODIFIED.

    ; CHANGES WILL BE LOST WHEN FILE IS REGENERATED.

    ;------------------------------------------------------

    #include "mapping.inc"


    BYTES           ; The following addresses are 8 bits long

    segment byte at ram0_segment_start-ram0_segment_end 'ram0'


    WORDS           ; The following addresses are 16 bits long

    segment byte at ram1_segment_start-ram1_segment_end 'ram1'


    WORDS           ; The following addresses are 16 bits long

    segment byte at stack_segment_start-stack_segment_end 'stack'


    WORDS           ; The following addresses are 16 bits long

    segment byte at 4000-43FF 'eeprom'


    WORDS           ; The following addresses are 16 bits long

    segment byte at 8080-FFFF 'rom'


    WORDS           ; The following addresses are 16 bits long

    segment byte at 8000-807F 'vectit'


        END


上面的代碼第一行以stm8/開(kāi)頭,很多人不知道為什么要這樣子。其實(shí)是因?yàn)槲覀兯玫膮R編連接器Assembler Linker不僅支持STM8匯編代碼而且還支持ST公司的另一款芯片ST7的匯編代碼,如果你用的是ST7芯片的話,就要以st7/開(kāi)頭了。結(jié)論就是使用stm8/開(kāi)頭是為了表明代碼的目標(biāo)芯片是stm8芯片。

分號(hào)后面的注釋不算入代碼里面,剩下來(lái)的代碼就定義了芯片上的內(nèi)存段,比如說(shuō)segment byte at ram0_segment_start-ram0_segment_end ‘ram0’的意思就是,從ram0_segment_start到ram0_segment_end的這一段內(nèi)存起個(gè)名字叫做“ram0”,segment byte at ram1_segment_start-ram1_segment_end ‘ram1’的意思就是,從ram1_segment_start到ram1_segment_end的這一段內(nèi)存起個(gè)名字叫做“ram1”,其它的也是一樣的道理。那么,你也會(huì)注意到,每一句這樣的代碼之前都有一句”Bytes”或者”Words”,這是什么意思呢?按代碼注釋里的意思就是,Bytes代表內(nèi)存段里內(nèi)存的地址是8位的,而Words代表內(nèi)存段里內(nèi)存的地址是16位的。通過(guò)查Assembler Linker PDF,發(fā)現(xiàn)Bytes和Words用于指定跟在它下面的的標(biāo)號(hào)的默認(rèn)長(zhǎng)度,什么意思?可以看以下的例子:


   Bytes

label1 

;下面這條語(yǔ)句是編譯通過(guò)的。因?yàn)锳是8位的,label1也是8位的。

   LD A,#label1  

   Words

 label2

 ;下面這條語(yǔ)句是編譯不通過(guò)的。因?yàn)锳是8位的,而label2是16位的,通過(guò)賦值給A。

   LD A,#label2  

   Words

 label3.b

 ;而下面這條語(yǔ)句是可以編譯通過(guò)的,因?yàn)槲绎@式地指定了label3為byte的長(zhǎng)度(.b),是8位的。


我們?cè)倏椿氐絤apping.asm那個(gè)文件,mapping文件里所有的指令都是偽指令,并不產(chǎn)生實(shí)際的可執(zhí)行代碼,那么使用了bytes,words是什么作用呢?從上面bytes和words的作用來(lái)看,我個(gè)人認(rèn)為它們?cè)趍apping.asm里不起作用,只起到說(shuō)明的作用,相當(dāng)于注釋。當(dāng)然如有錯(cuò)誤,歡迎大家指出^_^。所以mapping的作用就是給芯片的存儲(chǔ)空間劃分區(qū)域并命名。我們后面我們寫的代碼可以通過(guò)這個(gè)名字,指定存到該名字所代表的存儲(chǔ)區(qū)域下。比如說(shuō)ram0區(qū),ram1區(qū),rom區(qū)等。 

接下來(lái)再來(lái)看main.asm,這個(gè)代碼有一些長(zhǎng)了,先貼出來(lái)吧。



;就如之前所說(shuō)的,stm8指明以下的代碼是用于stm8芯片的,而不是st7芯片。

stm8/

;以下代碼是把mapping.inc文件包含進(jìn)來(lái)的意思,這樣就可以直接用mapping.inc里面定義的常量了。

    #include "mapping.inc"

;以下代碼是指明往后的代碼都是放在rom存儲(chǔ)區(qū)域的意思,就如mapping.asm里所表明的,rom的地址范圍是8080-FFFF。

    segment 'rom'

;main.l是一個(gè)標(biāo)號(hào),寫在最左邊的一行,標(biāo)號(hào)不產(chǎn)生實(shí)際的指令。標(biāo)號(hào)的作用時(shí)給一個(gè)地址進(jìn)行命名,然后其它指令就可以使用這個(gè)名字來(lái)使用這個(gè)地址了。比如說(shuō)下面的main.l的地址就跟下面的ldw X,#stack_end所在的地址相等的。而.l的意思是該地址是3個(gè)字節(jié)24位的。

main.l

    ; initialize SP

    ;下面這一句的意思是把stack_end的值加載到X寄存器,#是立即數(shù)的意思。ldw的w是word的意思,表明是16位是加載指令。也有8位的加載指令,為ld.

    ldw X,#stack_end

    ;下面這一句的意思是把寄存器X的值賦給SP寄存器的意思,SP是棧指針,上下兩句的作用是讓SP指向棧頂。(STM8的棧結(jié)構(gòu)是自頂向下的,棧頂?shù)闹稻褪莝tack_end,棧中地址值最大的那個(gè)數(shù))。

    ldw SP,X

    ;偽指令,如果定義了RAM0就編譯其后的代碼,顯然這個(gè)判斷是為真的,因?yàn)樵趍apping.inc中已經(jīng)定義了RAM0和RAM1.

    #ifdef RAM0 

    ; clear RAM0

;偽指令,定義標(biāo)號(hào)ram0_start.b的值為ram0_segment_start的值,$是16進(jìn)制數(shù)的意思,ram0_end.b同理。這種直接賦值的方式跟前面的main.l標(biāo)號(hào)有所不同,下面這種是賦絕對(duì)地址,而main.l是賦相對(duì)地址。

ram0_start.b EQU $ram0_segment_start

ram0_end.b EQU $ram0_segment_end

    ;加載ram0_start的值到X

    ldw X,#ram0_start

;定義標(biāo)號(hào)clear_ram0.l

clear_ram0.l

        ;clr是清除的意思,()是間接尋址的意思,clr(X)就是以X的值為地址,清除該地址上的值的意思。

    clr (X)

    ;X加1,incw有個(gè)w是因?yàn)閄是16位的。

    incw X

    ;cpw是compare的意思,比較X和ram0_end的值,w的意思跟上面講的意思一樣。

    cpw X,#ram0_end 

    ;jrule(jump relative unsigned less than)這個(gè)意思明白了吧?就是如果小于就跳轉(zhuǎn)到clear_ram0標(biāo)號(hào)地址的意思。

    jrule clear_ram0

    ;跟前面的#ifdef RAM0相對(duì)應(yīng)。

    #endif

    ;這個(gè)面RAM1的操作跟以上對(duì)RAM0的操作一樣。整一段代碼的作用就是清零存儲(chǔ)區(qū)的作用。

    #ifdef RAM1

    ; clear RAM1

ram1_start.w EQU $ram1_segment_start

ram1_end.w EQU $ram1_segment_end   

    ldw X,#ram1_start

clear_ram1.l

    clr (X)

    incw X

    cpw X,#ram1_end 

    jrule clear_ram1

    #endif

    ;下面初始化棧區(qū)的操作也是跟前面對(duì)RAM0的操作一樣的。

    ; clear stack

stack_start.w EQU $stack_segment_start

stack_end.w EQU $stack_segment_end

    ldw X,#stack_start

clear_stack.l

    clr (X)

    incw X

    cpw X,#stack_end    

    jrule clear_stack

;下面定義了infinite_loop.l標(biāo)號(hào)。

infinite_loop.l

    ;jra是相對(duì)跳轉(zhuǎn)的意思,跳轉(zhuǎn)到上面那個(gè)標(biāo)號(hào)。所以這是一個(gè)無(wú)限循環(huán),代碼到這里就是不斷地執(zhí)行jra infinite_loop這條語(yǔ)句,相當(dāng)于C語(yǔ)言中的while(1);

    jra infinite_loop

    ;interrupt是偽指令,把NoHandleInterrupt說(shuō)明成是用于中斷的標(biāo)號(hào)。

    interrupt NonHandledInterrupt

;定義NonHandledInterrupt.l標(biāo)號(hào)

NonHandledInterrupt.l

    ;iret是中斷返回的意思。而ret是函數(shù)返回的意思。

    iret

;segment 'vectic'指令其下面的代碼是放在vectit存儲(chǔ)區(qū)的,即8000-807F所在的區(qū)域。

    segment 'vectit'

    ;dc.l的意思是申請(qǐng)一段四個(gè)字節(jié)的空間,后面加的數(shù)字就是賦予這個(gè)空間的值。什么?前面的l的用法都是3個(gè)字節(jié)的,這里dc.l里的l就成4個(gè)字節(jié)了?沒(méi)錯(cuò),就是這樣子的,有點(diǎn)亂,這也是有點(diǎn)費(fèi)解的地方,我也不明白為啥不改另一個(gè)說(shuō)法。{}的用法是在編譯時(shí)運(yùn)算里面的語(yǔ)句,而不是在代碼里演算。比如說(shuō){1+1}會(huì)在編譯后變成2.

    ;下面的所有dc.l其實(shí)就是定義了一個(gè)中斷向量表,分別對(duì)應(yīng)于不同的中斷,比如第一個(gè)就是復(fù)位中斷,芯片復(fù)位后會(huì)在這里找到main標(biāo)號(hào),然后程序跳轉(zhuǎn)到main里去。當(dāng)然如果你對(duì)main不爽,也可以改成其它的,比如說(shuō)example.但是這個(gè)改了之后,最前面的main.l標(biāo)號(hào)也要相應(yīng)的改成example.l.就相當(dāng)于這個(gè)程序里面“沒(méi)有”main函數(shù)了。是不是很神奇呢?呃。下面有注釋了trap,irq0,irq2等這些,其實(shí)就是對(duì)應(yīng)了不同的中斷,比如說(shuō)I2C的中斷就對(duì)應(yīng)了其中的irq19,所以當(dāng)你寫好I2C的中斷服務(wù)程序后,需要把它的標(biāo)號(hào)填寫到irq19那一句中,可以參考dc.l{$82000000+main}這句,如果你把I2C中斷服務(wù)程序的標(biāo)號(hào)定義I2C_Interrupt.l則irq19中那一句要改成dc.l{$82000000+I2C_Interrupt}.最后一個(gè)問(wèn)題,中斷后單片機(jī)會(huì)跳到中斷標(biāo)號(hào)里去執(zhí)行這點(diǎn)沒(méi)問(wèn)題了,那下面$82000000中的82是什么意思呢?(現(xiàn)在想找之前看到的資料已經(jīng)找不到了。。。。不過(guò)我還記得那個(gè)意思)82是STM8指令集中的一個(gè)操作碼(匯編指令是由操作碼和操作數(shù)組成的),我想用在中斷這里的意思就是表面這個(gè)地址標(biāo)號(hào)是中斷服務(wù)程序地址標(biāo)號(hào)的意思吧,芯片可以識(shí)別82這個(gè)操作碼,從而區(qū)別對(duì)待。

    dc.l{$82000000+main}                                   ; reset

    dc.l {$82000000+NonHandledInterrupt}   ; trap

    dc.l {$82000000+NonHandledInterrupt}   ; irq0

    dc.l {$82000000+NonHandledInterrupt}   ; irq1

    dc.l {$82000000+NonHandledInterrupt}   ; irq2

    dc.l {$82000000+NonHandledInterrupt}   ; irq3

    dc.l {$82000000+NonHandledInterrupt}   ; irq4

    dc.l {$82000000+NonHandledInterrupt}   ; irq5

    dc.l {$82000000+NonHandledInterrupt}   ; irq6

    dc.l {$82000000+NonHandledInterrupt}   ; irq7

    dc.l {$82000000+NonHandledInterrupt}   ; irq8

    dc.l {$82000000+NonHandledInterrupt}   ; irq9

    dc.l {$82000000+NonHandledInterrupt}   ; irq10

    dc.l {$82000000+NonHandledInterrupt}   ; irq11

    dc.l {$82000000+NonHandledInterrupt}   ; irq12

    dc.l {$82000000+NonHandledInterrupt}   ; irq13

    dc.l {$82000000+NonHandledInterrupt}   ; irq14

    dc.l {$82000000+NonHandledInterrupt}   ; irq15

    dc.l {$82000000+NonHandledInterrupt}   ; irq16

    dc.l {$82000000+NonHandledInterrupt}   ; irq17

    dc.l {$82000000+NonHandledInterrupt}   ; irq18

    dc.l {$82000000+NonHandledInterrupt}   ; irq19

    dc.l {$82000000+NonHandledInterrupt}   ; irq20

    dc.l {$82000000+NonHandledInterrupt}   ; irq21

    dc.l {$82000000+NonHandledInterrupt}   ; irq22

    dc.l {$82000000+NonHandledInterrupt}   ; irq23

    dc.l {$82000000+NonHandledInterrupt}   ; irq24

    dc.l {$82000000+NonHandledInterrupt}   ; irq25

    dc.l {$82000000+NonHandledInterrupt}   ; irq26

    dc.l {$82000000+NonHandledInterrupt}   ; irq27

    dc.l {$82000000+NonHandledInterrupt}   ; irq28

    dc.l {$82000000+NonHandledInterrupt}   ; irq29


    end


關(guān)鍵字:STM8S  匯編代碼 引用地址:STM8S匯編代碼分析

上一篇:開(kāi)發(fā)工具之IAR下載、安裝與激活
下一篇:浮點(diǎn)數(shù)轉(zhuǎn)換成字符串函數(shù)

推薦閱讀

近日,記者從中國(guó)汽車工業(yè)協(xié)會(huì)獲悉,今年1~8月,國(guó)內(nèi)新能源汽車產(chǎn)銷分別為60.7萬(wàn)輛和60.1萬(wàn)輛,同期分別增長(zhǎng)75.4%和88%,保持著穩(wěn)步增長(zhǎng)態(tài)勢(shì)。但不少業(yè)內(nèi)人士認(rèn)為,新能源汽車已走過(guò)培育期,企業(yè)間的差距將進(jìn)一步拉大,缺乏競(jìng)爭(zhēng)力的企業(yè)將被邊緣化,并購(gòu)、重組的勢(shì)力將會(huì)增加。在此基礎(chǔ)上,不少新能源汽車企業(yè)將目光瞄向了“人工智能”。9月20日,比亞迪上...
據(jù)國(guó)際機(jī)器人聯(lián)合會(huì)(R)發(fā)布的《全球機(jī)器人2019——工業(yè)機(jī)器人》報(bào)告數(shù)據(jù),2018年全球工業(yè)機(jī)器人出貨量42.2萬(wàn)臺(tái),比上年增長(zhǎng)6%;年銷售額達(dá)到165億美元,創(chuàng)下新紀(jì)錄。 IFR預(yù)測(cè),2019年的工業(yè)機(jī)器人出貨量將從2018年的創(chuàng)紀(jì)錄水平回落,但預(yù)計(jì)隨著持續(xù)的自動(dòng)化和技術(shù)改進(jìn),2020年至2022年,將實(shí)現(xiàn)兩位數(shù)的增長(zhǎng)——平均每年增長(zhǎng)12%,預(yù)計(jì)2022年將達(dá)到58....
  變頻器輔助控制方式雖然有諸多優(yōu)點(diǎn),但如果控制回路布線不合理往往會(huì)給變頻器的正常運(yùn)行帶來(lái)不利影響,甚至引發(fā)不必要的故障。今天小編就結(jié)合經(jīng)驗(yàn),歸納總結(jié)了六大關(guān)于變頻器控制回路布線的禁忌:  1、變頻器控制回路所布導(dǎo)線應(yīng)同主電路電纜(動(dòng)力線)分開(kāi),這樣可以避免變頻器主回路當(dāng)中的諧波干擾成分污染變頻器控制回路;  2、因變頻器的故障信...
案例分析:故障提前知!先進(jìn)的多功能軟件如何監(jiān)控電動(dòng)公交車隊(duì)充電站 充電設(shè)施始終處于視野中。 圖片來(lái)源:? Stadtwerke Jena / Anna Schroll本文將介紹德國(guó)耶拿公共交通系統(tǒng)是如何監(jiān)測(cè)其電動(dòng)公交車隊(duì)的充電樁,并使用先進(jìn)的診斷功能來(lái)提高其可用性并優(yōu)化維護(hù)活動(dòng)。在德國(guó)耶拿,電動(dòng)汽車以有軌電車形式出現(xiàn),并已投入使用了120年。隨著柴油動(dòng)力公交...

史海拾趣

問(wèn)答坊 | AI 解惑

MCF52233_PWM

  呵呵,我們的Freescale。終于有Freescale的版塊了,現(xiàn)在把以前寫的一些東西轉(zhuǎn)過(guò)來(lái),希望能有更多人的關(guān)注Freescale。MCF52233_PWM—Pulse-Width Modulation Module   Coldfire的PWM模塊做的真傻瓜化,用起來(lái)那是相當(dāng)?shù)姆奖悖?jiǎn)單設(shè)幾個(gè)寄存器 ...…

查看全部問(wèn)答∨

期待高手指點(diǎn),SD讀寫驅(qū)動(dòng)

   通過(guò)SPI接口發(fā)送一個(gè)字節(jié)         INT8U temp;         SPI_SPDR = byte;                            ...…

查看全部問(wèn)答∨

Max7219仿真求助

用protues仿真Max7219,可以正常跑起來(lái),但是實(shí)際連線以后卻不能正常工作了,請(qǐng)問(wèn)諸位這是為何呀^_^~ 電路圖就是按著仿真里面連接的,電源和接地都接上了.. 謝謝了先...…

查看全部問(wèn)答∨

什么是差動(dòng)保護(hù) ?

電流差動(dòng)保護(hù)是繼電保護(hù)中的一種保護(hù),forclear 說(shuō)的差動(dòng)保護(hù)和逆相序都是對(duì)的。正相序是A超前B,B超前C各是120度。反相序(即是逆相序)是 A 超前C,C超前B各是120度。有功方向變反只是電壓和電流的之間的角加上180度,就是反相功率,而不是逆相序。 ...…

查看全部問(wèn)答∨

STM32程序在外部SRAM運(yùn)行速度問(wèn)題

                                 在使用STM32F103ZE,將程序在外部SRAM運(yùn)行的速度理論比內(nèi)部FLASH要慢多少,現(xiàn)在我實(shí)際情況,好象好慢幾十倍到幾百 ...…

查看全部問(wèn)答∨

關(guān)于51單片機(jī)的P0口

感覺(jué)學(xué)單片機(jī)很多年,沒(méi)有學(xué)明白,懇請(qǐng)高手指點(diǎn)下!   問(wèn)題1:對(duì)51的3總線結(jié)構(gòu)有點(diǎn)糊涂,想知道如果ADC0809占用了51單片機(jī)的P0口,用來(lái)采集8個(gè)通道的模擬電壓量,那么DAC0832還能直接接在P0口嗎?此時(shí)adc和dac的地址如何編碼?   問(wèn) ...…

查看全部問(wèn)答∨

求助檢波電路的問(wèn)題

請(qǐng)問(wèn)各位大俠,如何利用二極管、三極管構(gòu)建一個(gè)檢波電路,當(dāng)有輸入信號(hào)時(shí)三極管的輸出電平為低電平,試了很多次都不行。…

查看全部問(wèn)答∨

今天看到了兩個(gè)不太懂的東西,特來(lái)請(qǐng)教壇友

一個(gè)是電源中的power brake, 另一個(gè)是back drive, 都不太明白是什么意思,特來(lái)請(qǐng)教大家?!?

查看全部問(wèn)答∨

最近在畫電路學(xué)到了新的東西,賴和大家分享一下。

首先是Protel99或者是AD:            從PCB文件中導(dǎo)出封裝到庫(kù)文件,   Design————Make PCB Library。            單獨(dú)PCB更新個(gè)別元件,在庫(kù) ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved