




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C和ASM的混合編程jianghq2003-5
TsinghuaDEE《單片機(jī)與嵌入式系統(tǒng)》Content程序的結(jié)構(gòu)匯編程序C程序project框架如何改寫匯編程序?在C程序中如何做一些底層操作?存儲(chǔ)空間結(jié)構(gòu)程序的結(jié)構(gòu)匯編程序結(jié)構(gòu)C程序結(jié)構(gòu)M30624FGFPMemoryMap幾個(gè)主要的參數(shù)RAM區(qū)
ramTOP ramENDROM區(qū)
progTOPVvector匯編程序結(jié)構(gòu)-段類型 RAM->DATA
ROM->CODE ROMDATA匯編程序結(jié)構(gòu)-段定義 .SECTION memory,DATA;數(shù)據(jù)段 .ORG VramTOP
.SECTION prog,CODE ;代碼段 .ORG VprogTOP
.SECTION val_vect,ROMDATA;用戶自定義中斷向量段 .ORG Vintbase
.SECTION inter,ROMDATA;固定中斷向量段 .ORG Vvector+(8*4)匯編程序中幾個(gè)主要的參數(shù)VramTOP .EQU 000400HVramEND .EQU 002BFFHVIstack .EQU 002C00H-》ISPVprogTOP .EQU 0F0000H Vintbase .EQU 0FA000HVvector .EQU 0FFFDCH
SB_base .EQU 000380H-》SB關(guān)于SB和FB .SB SB_base .SBSYMrecv_nums
告訴編譯器使用該變量的指令尋址方式采用相對(duì)基址尋址方式,可以提高生成代碼的效率。關(guān)于堆棧兩種堆棧:堆棧指針I(yè)SP和USP使用何種堆棧,由堆棧指針選擇標(biāo)志位(U標(biāo)志)選取。
U=0
選取中斷堆棧指針I(yè)SPU=1
選取用戶堆棧指針USP響應(yīng)中斷后,該標(biāo)志清0,執(zhí)行中斷子程序SP指針位置如何設(shè)定:棧頂指針
Push:SP=SP–1 Pop:SP=SP+1C程序結(jié)構(gòu)RAM->DATA->data
bss
stack heapROM->CODE->
program ROMDATA->rom
vector
fvectorNC編譯器對(duì)Section的處理Section的屬性屬性:I(是否初值),N/F(擴(kuò)展區(qū))S(SB尋址區(qū)),E/O(偶地址對(duì)齊)舉例:bss_SE,bss_NE,data_FE,data_SEI
data_SE
bss_SE data_SO bss_SO
data_NE bss_NE data_NO bss_NO stack heap data_FE bss_FE data_FO data_FE
C程序中所有的section列表DATA
rom_NE rom_NO rom_FE rom_FO
data_SEI data_SOI data_NEI data_NOI
data_FEI data_FOI vector fvectorROMDATACODE program interrupt program_S根據(jù)芯片修改sect30.inc注釋掉不存在的段最重要的三個(gè)段的位置設(shè)定 .section data_SE,DATA .org 400H
.section rom_FE,ROMDATA .org 0C0000H
.section vector,ROMDATA .org VECTOR_ADR VECTOR_ADR .equ 0FA000H其他的段就交給編譯器來(lái)處理 例子:一個(gè)Section分配的結(jié)果C程序結(jié)構(gòu)-project可能包括多個(gè)asm文件,C文件如何安排project的結(jié)構(gòu)?程序的入口首先要清楚整個(gè)程序的執(zhí)行過程從哪里開始執(zhí)行?Startup文件
sect30.inc文件;fixedvectorsection .org 0fffdch…………NMI: .lword dummy_intRESET:
.lword start.endStartup文件
ncrt0.a30文件 .glb start .section interruptstart:;---------------------------------------------------------------------;afterreset,thisprogramwillstart;--------------------------------------------------------------------- ldc #istack_top, isp ;setistackpointer
ncrt0.a30設(shè)定單片機(jī)工作模式RAM清0變量初值設(shè)定堆初始化調(diào)用全局Init子程序調(diào)用全局Main子程序exit循環(huán)啟動(dòng)過程
主C程序VoidInit(){ ……}VoidMain(){}主C文件:
init(){int1();int2();int3();……}
main(){sub1();sub4();……}Project層次框架Startup文件:ncrt0.a30系統(tǒng)提供的庫(kù)程序:#include“stdlib.h”ASM子程序:
init1();sub1()C子程序1:
init2();sub2();sub3()C子程序2:
init3();sub4();ASM子程序:
init4();sub5()一個(gè)project的層次圖程序結(jié)構(gòu)小結(jié)明白各個(gè)Section的含義根據(jù)芯片參數(shù)和自己的程序需要來(lái)修改startup程序用層次化來(lái)保持整個(gè)組織結(jié)構(gòu)的清晰如何改寫匯編程序?目標(biāo): 將他人提供的匯編程序轉(zhuǎn)為可供自己在C程序中調(diào)用的子函數(shù)。例子: 紅外接收的子程序Step1大致看懂原程序完成了一個(gè)什么樣的功能。 主要的幾個(gè)變量是什么含義。Step2分析自己的要求如果將該匯編程序獨(dú)立出來(lái)作為一個(gè)子函數(shù);那么其功能是什么?輸入?yún)?shù):有哪些返回值:有哪些我希望實(shí)現(xiàn)的功能等待接收一個(gè)字節(jié),如果收到立刻返回該字節(jié),沒收到且時(shí)間超過300ms,那么也返回,同時(shí)指示狀態(tài)為未接收。
charrecv_status=IR_RECV(charuserID,char*pByte);
指示接收狀態(tài)接收用戶碼接收字節(jié)地址Step3對(duì)原來(lái)的程序進(jìn)行裁減刪去原有的各個(gè)段定義重新定義各個(gè)Section:bss_SE,rom_FE,program定義和聲明全局子函數(shù)_IRR_INIT_IR_RECVI_timera0 涉及C和匯編子程序之間的參數(shù)傳遞(詳見下文)刪除不必要的變量和程序如果使用中斷,則將中斷向量表設(shè)置挪至sect30.inc最后以.end結(jié)束文件C和匯編子程序之間的參數(shù)傳遞參數(shù)規(guī)則(從C到匯編)參數(shù)規(guī)則(從匯編返回到C)函數(shù)名定義規(guī)則參數(shù)規(guī)則(從C到匯編)采用#pragmaPARAMETER參數(shù)規(guī)則(從匯編到C)函數(shù)名定義規(guī)則最后結(jié)果C程序部分:externcharIR_RECV(char,char*);#pragmaPARAMETERIR_RECV(R0L,A0)匯編語(yǔ)言部分: .glb_IR_RECV ;全局調(diào)用聲明_IR_RECV: mov.bR0L,N_CSTM ;參數(shù)傳遞:用戶碼
mov.wA0,SAVE_ADDR ;參數(shù)傳遞:接收結(jié)果地址…………
mov.b#1,R0L ;返回1,如果收到了數(shù)據(jù)改寫匯編程序小結(jié)看懂源程序在明白自己所需要的功能后,再進(jìn)行修改有的時(shí)候還是需要改多一些地方。該例子存放到在C程序中如何做一些底層操作特殊寄存器的操作BIT操作特殊寄存器的操作方法1:使用#pragmaADDRESS #pragmaADDRESSTA0 0386H#pragmaADDRESSTABSR 0380H……建議將所有SFR地址聲明放在一個(gè)文件里#include“mcu16c62.h”定義類型(根據(jù)其所占的內(nèi)存大小)charTA0MR,TA0IC,TABSR;unsignedintTA0;特殊寄存器的操作方法2:嵌入?yún)R編語(yǔ)句asm()
尤其是一些系統(tǒng)寄存器R0,FLG 方法3:定義成匯編子函數(shù) 另寫一個(gè)as30文件,將相關(guān)的操作封裝成函數(shù),供C程序調(diào)用 方法4:直接定義指針,并對(duì)該指針賦初值 BIT操作使用位域BIT操作使用宏#defineSET_BIT(n,byteA){byteA|=(0x01<<n);}/*SetBit=1*/ #defineCLR_BIT(n,byteA){byteA&=(~(0x01<<n));}/*SetBit=0*/ #defineTST_BIT(n,byteA)(byteA&(0x01<<n))==0/*Bit=0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢字的由來(lái)和演變
- 云南省曲靖市民族中學(xué)2024-2025學(xué)年高一上學(xué)期期中檢測(cè)化學(xué)試卷(含答案)
- 內(nèi)蒙古鄂爾多斯市西四旗2024-2025學(xué)年高一下學(xué)期7月期末考試生物試卷(含答案)
- 福建省漳州第一中學(xué)2024-2025學(xué)年高二下學(xué)期期末考試化學(xué)試題(含答案)
- 年眼科護(hù)士工作總結(jié)
- 虛擬現(xiàn)實(shí)技術(shù)在娛樂產(chǎn)業(yè)的運(yùn)用
- 餐飲連鎖經(jīng)營(yíng)模式成功案例分享
- 2025年橋梁維護(hù)養(yǎng)護(hù)合同
- 2025餐館股份轉(zhuǎn)讓協(xié)議合同樣本
- 永順縣應(yīng)急知識(shí)培訓(xùn)課件學(xué)校
- 2025年三支扶陜西試題及答案
- 2025年行政執(zhí)法證考試必刷題庫(kù)與答案
- 基孔肯雅熱防控知識(shí)考試試題含答案
- 低鉀血癥護(hù)理常規(guī)業(yè)務(wù)學(xué)習(xí)
- 2025年職業(yè)指導(dǎo)師(四級(jí))考試模擬試題匯編與模擬試題解析
- 測(cè)聽講課的課件
- 鄉(xiāng)鎮(zhèn)物業(yè)安全管理制度
- 起重作業(yè)安全考核試題及答案
- 高等教育十五五發(fā)展規(guī)劃
- 倉(cāng)管員安全培訓(xùn)課件
- 2025年江西贛州市融資擔(dān)保集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論