寫在前面
??就我所知,STM8的開發(fā)平臺有兩種:意法官方的STVD和IAR for STM8. STVD沒嘗試過。反正IAR用的感覺還湊合,各種該有的功能都有,但界面不怎么友好。估計是低版本的緣故,由于我長時間盯著屏幕眼睛酸痛,所以沒辦法只能把編輯界面底色改成黑色,可TM怎么行號編程白色的了?根本看不清??床磺寰筒豢戳藛h,反正也沒啥用。但是就是感覺超不爽。而且字體顯示不知道怎么搞的,在縮放的時候就變得特別奇怪,跟手寫的一樣。
相關(guān)資料
??如之前所述,官方的永遠是最好的,沒有誰比創(chuàng)造者更了解他的產(chǎn)品了。
環(huán)境設(shè)置
??俗話說,站在巨人的肩膀上能看得更遠。學習匯編也是一樣,先看代碼。但是由于匯編對于不同的芯片差異很大,網(wǎng)絡(luò)上也很難找到資源。怎么辦呢?最好的辦法是去看看編譯環(huán)境是怎么把c語言轉(zhuǎn)換成匯編的。但是默認情況下,編譯結(jié)果是不會自動跑到workspace的。所以需要作如下設(shè)置:
1. workspace右鍵選’options…'或單擊Project菜單選擇’options…'打開工程選項
2. 選擇 ‘C/C++ Compiler’,在 ‘List’ 選項卡中選擇 ‘Output assembler file’,并選擇其子選項 'Include source’
??‘Output assembler file’ 是為了讓編譯器輸出匯編的編譯結(jié)果,‘Include source’ 可以把對應(yīng)的C語言標在每段匯編前,這樣有助于理解每段匯編的含義。如果想看到全部匯編信息,請將 ‘Include all call frame information’ 勾選。
3. 還是在 ‘Options…’ => ‘C/C++ Compiler’ 中,選擇 ‘Optimization’ 選項卡,優(yōu)化等級選擇 ‘Low’ 或 'None’
??選擇優(yōu)化等級的原因是,在高等級的優(yōu)化中,C語言和匯編的對應(yīng)關(guān)系不是特別明顯,有的時候會把十幾行代碼一起優(yōu)化掉,雖然結(jié)果相同,但是你很難去用自己寫的時候的思路去理解生成的代碼,而且有的時候會把你的代碼邏輯徹底變掉。之前就遇到過這種情況,初始化的時候本來想用查表法去對參數(shù)賦初值,結(jié)果發(fā)現(xiàn)改Flash里面的數(shù)據(jù)根本不會影響運行結(jié)果。把匯編打開之后,發(fā)現(xiàn)居然把從Flash取值的指令直接優(yōu)化成立即數(shù)尋址。唉,不得不感慨編譯器不懂我啊。當然還有其他更好的辦法解決,之后會講到。
??完成以上設(shè)置之后,去編譯你的工程,你會發(fā)現(xiàn)在每個c文件下多了個Output文件夾,點開后,里面有一個 ‘.s’ 文件,這個里面就是編譯得到的匯編結(jié)果。
匯編語言結(jié)構(gòu)
??做完上述設(shè)置之后,編譯完打開 ‘.s’ 文件,你會看到如下格式的代碼:
RTMODEL "__SystemLibrary", "DLib"
RTMODEL "__code_model", "small"
RTMODEL "__core", "stm8"
RTMODEL "__data_model", "medium"
RTMODEL "__rt_version", "4"
EXTERN ?b0
EXTERN ?b1
EXTERN ?w0
EXTERN ?w1
PUBLIC array
PUBLIC main
PUBLIC val
CFI Names cfiNames0
CFI StackFrame CFA SP DATA
CFI Resource A:8, XL:8, XH:8, YL:8, YH:8, SP:16, CC:8, PC:24, PCL:8
CFI Resource PCH:8, PCE:8, ?b0:8, ?b1:8, ?b2:8, ?b3:8, ?b4:8, ?b5:8
CFI Resource ?b6:8, ?b7:8, ?b8:8, ?b9:8, ?b10:8, ?b11:8, ?b12:8, ?b13:8
CFI Resource ?b14:8, ?b15:8
CFI ResourceParts PC PCE, PCH, PCL
CFI EndNames cfiNames0
CFI Common cfiCommon0 Using cfiNames0
CFI CodeAlign 1
CFI DataAlign 1
CFI ReturnAddress PC CODE
CFI CFA SP+2
CFI A Undefined
CFI XL Undefined
CFI XH Undefined
CFI YL Undefined
CFI YH Undefined
CFI CC Undefined
CFI PC Concat
CFI PCL Frame(CFA, 0)
CFI PCH Frame(CFA, -1)
CFI PCE SameValue
CFI ?b0 Undefined
CFI ?b1 Undefined
CFI ?b2 Undefined
CFI ?b3 Undefined
CFI ?b4 Undefined
CFI ?b5 Undefined
CFI ?b6 Undefined
CFI ?b7 Undefined
CFI ?b8 SameValue
CFI ?b9 SameValue
CFI ?b10 SameValue
CFI ?b11 SameValue
CFI ?b12 SameValue
CFI ?b13 SameValue
CFI ?b14 SameValue
CFI ?b15 SameValue
CFI EndCommon cfiCommon0
// E:socexample_emptymain.c
// 1 #include "Untitled1.h"
// 2 typedef enum {FALSE = 0, TRUE = !FALSE} bool;
SECTION `.near.bss`:DATA:REORDER:NOROOT(0)
// 3 int val;
val:
DS8 2
SECTION `.near.data`:DATA:REORDER:NOROOT(0)
// 4 int array[10] = {1,33,2,6,8,9,4,45,8,0};
array:
DC16 1, 33, 2, 6, 8, 9, 4, 45, 8, 0
SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
CFI Block cfiBlock0 Using cfiCommon0
CFI Function main
CODE
// 5 int main( void )
// 6 {
// 7 int i = 0;
main:
CLR S:?b1
CLR S:?b0
// 8 int buf;
// 9 bool flag = TRUE;
LD A, #0x1
JRA L:??main_0
// 10 while(1)
// 11 {
// 12 if(array[i] > array[i+1])
// 13 {
// 14 buf = array[i];
// 15 array[i] = array[i+1];
// 16 array[i+1] = buf;
// 17 flag = FALSE;
// 18 }
// 19 if(i == 9)
// 20 {
// 21 if(flag)
// 22 {
// 23 break;
// 24 }
// 25 i = 0;
??main_1:
CLR S:?b1
CLR S:?b0
??main_0:
LDW X, S:?w0
SLLW X
ADDW X, #array + 2
LDW X, (X)
LDW S:?w1, X
LDW X, S:?w0
SLLW X
ADDW X, #array
LDW Y, X
LDW X, S:?w1
CPW X, (Y)
JRSGE L:??main_2
LDW X, S:?w0
SLLW X
LDW X, (L:array,X)
LDW S:?w1, X
LDW X, S:?w0
SLLW X
ADDW X, #array + 2
LDW X, (X)
LDW Y, X
LDW X, S:?w0
SLLW X
LDW (L:array,X), Y
LDW X, S:?w0
SLLW X
LDW Y, S:?w1
ADDW X, #array + 2
LDW (X), Y
SUBW X, #array + 2
CLR A
??main_2:
LDW X, S:?w0
CPW X, #0x9
JRNE L:??main_0
TNZ A
JREQ L:??main_1
// 26 }
// 27
// 28 }
// 29 return 0;
CLRW X
RET
// 30 }
CFI EndBlock cfiBlock0
SECTION VREGS:DATA:REORDER:NOROOT(0)
END
//
// 2 bytes in section .near.bss
// 20 bytes in section .near.data
// 84 bytes in section .near_func.text
//
??具體含義簡單介紹一下:
1. 運行模型結(jié)構(gòu)(Runtime model attributes)
??這類東西基本找不到官方的翻譯,那就按字面上的意思咯。它主要是對程序整體的一些基礎(chǔ)設(shè)置,一般要保持代碼中所有匯編文件保持一致。在自己寫匯編時可加可不加。如果要加的話一定要從同工程下別處原樣復制過來,一個符號都不要改
RTMODEL "__SystemLibrary", "DLib" //基礎(chǔ)庫,包括C和C++所必需的頭文件
RTMODEL "__code_model", "small" //代碼量,代表尋址空間
//"small" ->最大16KB尋址空間
//"medium" ->最大16MB尋址空間,但函數(shù)代碼地址不允許超過64KB邊界
//"large" ->最大16MB尋址空間,函數(shù)代碼地址允許超過64KB邊界
RTMODEL "__core", "stm8" //芯片型號,只能是"stm8"
RTMODEL "__data_model", "medium" //詳見幫助文檔
RTMODEL "__rt_version", "4" //同個程序RTMODEL改變時,版本號相應(yīng)改變
2. 標號聲明(Symbol control)
上一篇:[STM8學習筆記] IAR工程搭建筆記
下一篇:STVD配置
推薦閱讀
史海拾趣
設(shè)計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測試方案
- 日產(chǎn)在歐洲推出第三代e-POWER技術(shù)
- 福特CEO更看好Waymo激光雷達方案:比特斯拉純視覺自動駕駛路線可靠
- 智元機器人兩大核心產(chǎn)品啟動規(guī)?;a(chǎn)
- 固態(tài)電池2026量產(chǎn)豪賭,真相還是泡沫?
- 100億元!湖北“下注”人形機器人產(chǎn)業(yè)
- 海外磷酸鐵鋰電池產(chǎn)能從0到1
- 基于多傳感器數(shù)據(jù)的自動駕駛仿真確定性驗證
- 國芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車新紀元
- 亞馬遜全球部署100萬臺機器人
- 將存儲芯片容量提升1000倍!三星資助的團隊研究新方法
- 突發(fā)!印度海關(guān)封禁中國貨,富士康在印度已停產(chǎn)
- 2020年深圳機器人產(chǎn)業(yè)市場現(xiàn)狀及發(fā)展趨勢分析 企業(yè)優(yōu)勢明顯(二)
- 帶您了解超算黑馬—日本Fugaku背后的故事
- 傳三星修改芯片工藝路線圖,5nm直接跳到3nm,4nm不管了?
- 5G手機2020年上半年將大規(guī)模出貨
- 面板價格持續(xù)下跌,中國面板成為大贏家
- 超高清視頻產(chǎn)業(yè)成廣東新“名片”
- 北美手機銷量創(chuàng)近5年同期新低,銷量下滑18%!
- FCC拒絕中國移動為美提供電信服務(wù)!