C語言程序設計與混合編程_第1頁
C語言程序設計與混合編程_第2頁
C語言程序設計與混合編程_第3頁
C語言程序設計與混合編程_第4頁
C語言程序設計與混合編程_第5頁
已閱讀5頁,還剩46頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第6章 C語言程序設計與混合編程 2022-3-241第6章 C語言程序設計與混合編程 6.1 C語言程序設計 6.2 用用C語言和匯編語言混合編程語言和匯編語言混合編程 本章小結本章小結 習習 題題 第6章 C語言程序設計與混合編程 2022-3-242 (1) 用匯編語言開發。此方式代碼效率高,程序執行速度快,可以充分合理地利用芯片提供的硬件資源。但程序編寫比較煩瑣,可讀性較差,可移植性較差,軟件的修改和升級困難。 (2) 用C語言開發。CCS平臺包括優化ANSI C編譯器,從而可以在C源程序級進行開發調試,增強軟件的可讀性,提高了軟件的開發速度,方便軟件的修改和移植。然而,C編譯器無法實

2、現在任何情況下都能夠合理地利用DSP芯片的各種資源。C54x DSP軟件設計的方法通常有三種: (3) C語言和匯編語言混合編程開發。采用混合編程的方法能更好地達到設計要求,完成設計任務。 第6章 C語言程序設計與混合編程 2022-3-243 1. C語言特點語言特點 C語言是國際上廣泛流行的、很有發展前途的計算機高級語言。它適合于作為系統描述語言,既可以用來編寫系統軟件,也可以用來編寫應用軟件。 匯編語言依賴于計算機硬件,程序的可讀性和可移植性比較差。而高級語言具有很好的可移植性,但是難以實現匯編語言的某些功能。因為C語言仍然需要通過編譯、連接才能得到可執行目標程序,所以是一種高級語言。但

3、C語言允許訪問物理地址,能進行位操作,能實現匯編語言的大部分功能,能直接對硬件進行操作。C語言正是一種既可以訪問物理地址又可以進行位操作的高級語言,這也是其與別的高級語言不同的地方。 6.1 C語言程序設計語言程序設計第6章 C語言程序設計與混合編程 2022-3-244C語言具有如下基本特點:(1) 語言簡潔、緊湊,使用方便、靈活。(2) 運算符豐富,表達式類型多樣化。(3) 數據結構類型豐富,具有現代化語言的各種數據結構。(4) 具有結構化的控制語句。(5) 語法限制不太嚴格,程序設計自由度大。 (6) C語言允許訪問物理地址,能進行位操作,能實現匯編語言的大部分功能,能直接對硬件進行操作

4、。 第6章 C語言程序設計與混合編程 2022-3-245 (1) 限定詞 可由字母、數字和下劃線組成。限定詞必須以字母或下劃線開頭。區分大小寫。 (2) 常量 常量包括整型常量(八進制、十進制、十六進制、長整型),字符常量,實型常量(小數形式、指數形式),字符串常量,表達式,算術表達式(整型表達式、實型表達式),邏輯表達式,字位表達式,強制類型轉換表達式,逗號表達式(順序表達式),賦值表達式,條件表達式,指針表達式。 (3) 數據定義 數據類型(int、short、long、unsigned、char、float、double、struct、union、enum)用ty-pedef定義的類型

5、名,存儲類型(auto、static、register、extem)變量的定義形式為: 存儲類別 數據類型 變量列表; 例如:static float a,b,c;2. C語言基本語法概述語言基本語法概述第6章 C語言程序設計與混合編程 2022-3-246 (4) 函數定義 函數的定義形式為: 存儲類別 數據類型 函數名(形參表別) 函數體 (5) 語句 語句包括表達式語句、函數調用語句、控制語句、復合語句、空語句。其中控制語句包括if語句、while語句、for語句和switch語句以及break語句、continue語句、return語句、goto語句。 (6) 預處理命令 預處理命令主

6、要是指define和include語句。 第6章 C語言程序設計與混合編程 2022-3-247 C系統的堆??梢酝瓿傻闹饕δ苋缦拢?* 分配局部變量;* 傳遞函數參數;* 保存所調用函數的返回地址;* 保存臨時結果。 運行堆棧的增長方向是從高地址到低地址, 即入棧則地址減少,出棧則地址增加。堆棧的管理者是堆棧指針SP。堆棧的容量由鏈接器(Linker)設定。 如:在鏈接命令文件(.cmd文件)中加入選項 -stack 0 x1000 則堆棧的容量被設為1000H個字。第6章 C語言程序設計與混合編程 2022-3-248 1. 存儲器模式存儲器模式 C54x DSP定點處理器有兩種類型的存

7、儲器模式:程序存儲器和數據存儲器。前者主要用于裝載可執行代碼,后者主要用于裝載外部變量、靜態變量、系統堆棧以及一些中間運算結果。 C54x DSP的程序代碼或數據以段的形式裝載于存儲器中。C語言程序經C編譯器編譯后,生成七個可重定位的段,其中四個被稱為已初始化段,三個被稱為未初始化段。 四個已初始化段分別是:* .text段 包括可執行代碼、字符串和編譯器產生的常量。* .cinit段 包括初始化變量和常量表。* .const段 包括字符串常量和以const關鍵字定義的常量。* .switch段 為.const語句建立的表格。 第6章 C語言程序設計與混合編程 2022-3-249 三個未初始

8、化段分別是: * .stack段 為C的系統堆棧分配存儲空間,用于變量的傳遞。 * .sysmem段 為動態存儲器函數malloc、calloc、realloc分配存儲器空間。若C程序未用到此類函數,則C編譯器不產生該段。 在編寫鏈接命令文件(.cmd文件)時, .text、.cinit、.switch段通常可以鏈接到系統的ROM或者RAM中去,但是必須放在程序段(page0);.const段通常可以鏈接到系統的ROM或者RAM中去,但是必須放在數據段(pagel);而.bss、.stack和.sysmem段必須鏈接到系統的RAM中去,并且必須放在數據段(pagel)。由實驗程序所建的某工程的

9、鏈接命令文件(.cmd文件),如例6.1所示。第6章 C語言程序設計與混合編程 2022-3-2410【例【例6.1】某工程的鏈接命令文件】某工程的鏈接命令文件(.cmd文件文件) MEMORY /* TMS320C54x DSP存儲器分配 */ PAGE 0 :HPIRAM: origin = 0 x100, length = 0 x200 PROG: origin = 0 x2000, length = 0 x1000 PAGE 1 : DARAM1: origin = 0 x03000, length = 0 x1000 PAGE 2 : FLASHRAM: origin = 0 x80

10、00, length = 0 x7fff 第6章 C語言程序設計與混合編程 2022-3-2411SECTIONS /* 由C 定義 */.vectors : load = PROG page 0 /*中斷向量表*/.text : load = PROG page 0 /*可執行代碼*/.cinit : load = PROG page 0 /*初始化變量和常數表*/.switch : load = PROG page 0/*為.constant語句建立的表格*/.stack : load = DARAM1 page 1 /*C 系統堆棧*/.const : load = DARAM1 pag

11、e 1 /*字符串常量和以const關鍵字定義的常量*/.bss : load = DARAM1 page 1 /*全局和靜態變量空間*/.dbuffer1024: DARAM1 page 1, align (1024).coeffs1024 : DARAM1 page 1, align (1024).hpibuffer : load = HPIRAM page 0 /*由匯編定義*/ .data : DARAM1 page 1 /*匯編定義的數據段*/ 第6章 C語言程序設計與混合編程 2022-3-2412 2存儲器分配存儲器分配 C編譯器提供的運行支持函數中包含有幾個允許在運行時為變量分

12、配存儲器的函數,如malloc、calloc和recalloc。動態分配不是C語言本身的標準,而是由運行支持函數所提供的。 為全局pool和heap分配的存儲器空間定義在.sysmem塊中。.sysmem段的大小可由鏈接器選項中的-heap項來設定,其方法是在-heap項后加一個常數。與堆棧類似,連接器也創建一個全局符號_SYSMEM_SIZE。.sysmem段的大小由_SYSMEM_SIZE的數值來確定,默認值為l K字。為了在.bss段中保留空間,對于大的數據,可以用heap為其分配空間,而不將它們說明為全局或靜態的。例如,對于原定義的: struct big table1000可以改用指

13、針并調用malloc函數來定義:struct big *tabletable=(struct big*)malloc(1000*sizeof(struct big);第6章 C語言程序設計與混合編程 2022-3-2413 (1) 靜態和全局變量的存儲器分配靜態和全局變量的存儲器分配 在C程序中,靜態變量被分配一個惟一的連續空間,該空間的地址由鏈接器決定。編譯器安排這些變量的空間被分配在若干個字的長度中,以保證每個變量按字邊界對準。全局變量分配到數據空間,在同一模塊中定義的變量分配到同一個連續的存儲空間。 (2) 域域/結構的對準結構的對準 C編譯器在為結構分配存儲空間時,它分配足夠的字以包含

14、所有的結構成員。一組結構中,每個結構開始于字邊界。所有的非域類型對準于字的邊界。對域應分配足夠多的比特。相鄰域應裝入一個字的相鄰比特,不能跨越兩個字,否則整個域會被分配到下一個字中。第6章 C語言程序設計與混合編程 2022-3-2414 1寄存器規則寄存器規則 在C環境中,定義了嚴格的寄存器規則。寄存器規則明確了編譯器如何使用寄存器,以及在函數的調用過程中如何保護寄存器。調用函數時,某些寄存器不必由調用者來保護,而由被調用函數負責保護。如果調用者需要使用沒有保護的寄存器,則調用者在調用函數前必須對這些寄存器予以保護。在編寫匯編語言和C語言的接口程序時,這些規則非常重要。如果編寫時不遵守寄存器

15、的使用規則,則C環境將會被破壞。第6章 C語言程序設計與混合編程 2022-3-2415 寄存器規則概括如下: (1) 輔助寄存器 ARl、AR6、AR7由被調用函數保護,即可以在函數執行過程中修改,但在函數返回時必須恢復。在C54x DSP中,編譯器將ARl和AR6用作寄存器變量。其中,AR1被用作第一個寄存器變量,AR6被用作第二個寄存器變量,其順序不能改變。另外五個輔助寄存器AR0、AR2、AR3、AR4、AR5則可以自由使用,即在函數執行過程中可以對它們進行修改,不必恢復。 (2) 棧指針SP 堆棧指針SP在函數調用時必須予以保護,但這種保護是自動的,即在返回時,壓入堆棧的內容都將被彈

16、出。 第6章 C語言程序設計與混合編程 2022-3-2416 (3) ARP 在函數進入和返回時,必須為0,即當前輔助寄存器必須為AR0,而函數執行時則可以是其他值。 (4) OVM 在默認情況下,編譯器總認為OVM是0。因此,若在匯編程序中將OVM置為1,則在返回C環境時,必須將其恢復為0。 (5) 其他狀態位和寄存器可以任意使用,不必恢復。第6章 C語言程序設計與混合編程 2022-3-2417 (1) 參數傳遞 在函數調用前,將參數以逆序壓入運行堆棧。所謂逆序,即最右邊的參數最先壓入棧,然后自右向左將參數依次壓入棧,直至第二個參數入棧完畢。對第一個參數,則不需壓入堆棧,而是放入累加器A

17、中,由A進行傳遞。若參數是長整型和浮點數時,則低位字先壓入棧,高位字后壓入棧。若參數中有結構,則調用函數先給結構分配空間,而該空間的地址則通過累加器A傳遞給被調用函數。 一個典型的函數調用圖如圖6.1所示。在該例中,我們可以看出,參數傳遞到函數,同時該函數使用了局部變量并調用另一個函數。第一個參數不由堆棧傳遞,而是放入累加器A中傳遞。(如圖6.1(b)、圖6.1(c)所示)。2函數調用規則函數調用規則第6章 C語言程序設計與混合編程 2022-3-2418 (2) 被調用函數的執行過程 被調用函數依次執行以下幾項任務: * 如果被調用函數修改了寄存器(如AR1、AR6、AR7),則必須將它們壓

18、棧保護。 * 當被調用函數需分配內存來建立局部變量及參數區時,SP向低地址移動一個常數(即SP減去一個常數),該常數的計算方法如下: 常數=局部變量長度+參數區中調用其他函數的參數長度 另外,從這個例子中,我們看到了函數調用時局部幀的產生過程:函數調用時,編譯器在運行堆棧中建立一個幀用以存儲信息。當前函數幀成為局部幀,C環境利用局部幀來保護調用者的有關信息、傳遞參數和為局部變量分配存儲空間。每調用一個函數,就建立一個新的局部幀。局部幀空間的一部分用于分配參數區(局部參數區),被傳遞的參數放入局部參數區,即壓入堆棧,再傳遞到其他被調用的函數中。第6章 C語言程序設計與混合編程 2022-3-24

19、19圖6.1 函數調用時堆棧的使用傳遞函數調用函數低SP局部參數區局部幀返回地址參數2參數n調用者局部變量高(c)參數1累加器A傳遞函數調用函數低SP返回地址參數2參數n調用者局部變量高(b)參數1累加器A調用前低SP調用者參數區調用者局部變量高(a)第6章 C語言程序設計與混合編程 2022-3-2420 * 被調用函數執行程序。 * 如果被調用函數修改了寄存器ARl、AR6和AR7,則必須予以恢復。將函數的返回值放入累加器A中。整數和指針在累加器A的低16位中返回,浮點數和長整型數在累加器A的32位中返回。如果函數返回一個結構體,則被調用函數將結構體的內容拷貝到累加器A所指向的存儲器空間。

20、如果函數沒有返回值,則將累加器A置0,撤銷為局部幀開辟的存儲空間。ARP在從函數返回時,必須為0,即當前輔助寄存器為AR0。參數不是由被調用函數彈出堆棧的,而是由調用函數彈出的。 * SP向高地址移動一個常數(即SP加上一個常數),該常數即為圖6.1(b)所確定的常數,這樣就又恢復了幀和參數區。 * 被調用函數恢復所有保存的寄存器。 * 函數返回。 當C程序編譯成匯編后, 上述過程如例6.2所示。第6章 C語言程序設計與混合編程 2022-3-2421【例【例6.2】 be_called: ;函數入口 pshm AR6 ;保存AR6 pshn AR7 ;保存AR7 frame # -16 ;分

21、配幀和參數區 . ;函數主體 frame #16 ;恢復原來的幀和參數區 pshm AR7 ;恢復AR7 pshm AR6 ;恢復AR6 ret ;函數返回第6章 C語言程序設計與混合編程 2022-3-2422 (3) 入參數區和局部變量區 當編譯器采用CPL=1的編譯模式時,采用直接尋址即可很容易尋址到參數區和局部變量區。例如: add *SP(6), A ;將SP+6所指單元的內容送累加器A 以上直接尋址方式的最大偏移量為127,所以當尋址超過127時,可以將SP值復制到輔助寄存器中(如AR7),以此代替SP進行長偏移尋址。例如: mvmm SP, AR7 ;將SP的值送AR7 . ad

22、d *AR7(128), A ;AR7加128后所指向的單元內容送A第6章 C語言程序設計與混合編程 2022-3-2423 (4) 分配幀及使用32位內存讀/寫指令。 * 一些C54x DSP指令提供了一次讀/寫32位的操作(如DLD和DADD),因此必須保證32位對象存放在偶地址開始的內存中。為了保證這一點,C編譯器需要初始化SP,使其為偶數值。 * 由于CALL指令使SP減1,因此SP在函數入口設置為奇數;而長調用FCALL指令使SP減2,故SP在函數入口設定為偶數。 * 使用CALL指令時,應確保PSMH指令的數目加上FRAME指令分配字的數目為奇數,這樣SP就指向一個偶地址;同樣,使

23、用長調用FCALL指令時,應保證PSMH指令的數目與FRAME指令分配字的數目和為偶數,以保證SP指向偶地址。 * 為了確保32位對象在偶地址,可通過設置SP的相對地址來實現。 * 由于中斷調用時不能確保SP為奇數還是偶數,因此,中斷分配SP指向偶數地址。第6章 C語言程序設計與混合編程 2022-3-2424 3中斷函數中斷函數 C函數可以直接處理中斷。但是在用C語言編寫中斷程序時,應注意以下幾點: (1) 中斷的使能和屏蔽由程序員自己來設置。這一點可以通過內嵌匯編語句來控制中斷的使能和屏蔽,即通過內嵌匯編語句來設置中斷屏蔽寄存器IMR及INTM,也可通過調用匯編程序函數來實現。 (2) 中

24、斷程序不能有入口參數,即使聲明,也會被忽略。 (3) 中斷子程序即使被普通的C程序調用,也是無效的,因為所有的寄存器都已經被保護了。第6章 C語言程序設計與混合編程 2022-3-2425 (4) 將一個程序與某個中斷進行關聯時,必須在相應的中斷矢量處放置一條跳轉指令。采用.sect匯編指令可以建立這樣一個跳轉指令表以實現該功能。 (5) 在匯編語言中,必須在中斷程序名前加上一個下劃線。 (6) 用C語言編寫的中斷程序必須用關鍵字interrupt說明。 (7) 中斷程序用到的所有寄存器,包括狀態寄存器都必須保護。 (8) 如果中斷程序中調用了其他的程序,則所有的寄存器都必須保護。第6章 C語

25、言程序設計與混合編程 2022-3-2426 4.表達式分析表達式分析 當C程序中需要計算整型表達式時,必須注意到以下幾點: (1) 算術上溢和下溢。TMS320C54x DSP采用16位操作數,產生40位結果,算術溢出是不能以一種可預測的方式進行處理的。 (2) 整除和取模。TMS320C54x DSP沒有直接提供整除指令,因此,所有的整除和取模運算都需要調用庫函數來實現。這些函數將運算表達式的右操作數壓入堆棧,將左操作數放入累加器的低16位。函數的計算結果在累加器中返回。第6章 C語言程序設計與混合編程 2022-3-2427 (3) 32位表達式分析。一些運算在函數調用時并不遵循標準的C

26、調用規則,其目的在于提高程序運行速度和減少程序代碼空間。這些運算包括通過變量的左移、右移、除法、取模和乘法。 (4) C代碼訪問16位乘法結果的高16位,而無需調用32位乘法的庫函數。訪問有符號數乘法結果和無符號數乘法結果的高16位,分別如下所示。第6章 C語言程序設計與混合編程 2022-3-2428有符號結果:int n1,n2,result;result=(long)n1*(long)n2)16;無符號結果:unsigned n1,n2,result;result=(unsigned long)n1*(unsigned long)n2)16;第6章 C語言程序設計與混合編程 2022-3

27、-2429 C語言程序編寫過程步驟:(1) 編輯器編輯C程序readdata.c; (2) 編譯程序將C程序編譯匯編成目標文件readdata.obj;(3) 編輯一個鏈接命令文件(.cmd文件);(4) 鏈接生成.out文件,用硬件仿真器進行調試。 【例【例6.3】用C語言編寫C54x DSP的IO口的讀程序,實現從IO口地址8000H連續讀入1000個數據并存入數組中。 第6章 C語言程序設計與混合編程 2022-3-2430 【例【例6.3】 C程序readdata.c:#include“portio.h” /*包含頭文件portio.h*/#define RD_PORT 0 x8000

28、 /*定義輸入I/O口*/static int indata1000; /*定義全局數組*/main()int I;for(I=0;I1000;I+)portRead(RD_PORT); /*從I/O口讀數據*/第6章 C語言程序設計與混合編程 2022-3-2431 C語言和匯編語言的混合編程有以下幾種方法:。 (1) 獨立編寫匯編程序和C程序,分開編譯或匯編,形成各自的目標代碼模塊,再用鏈接器將C模塊和匯編模塊鏈接起來。這種方法靈活性較大,但用戶必須自己維護各匯編模塊的入口和出口代碼,自己計算傳遞的參數在堆棧中的偏移量,工作量較大,但能做到對程序的絕對控制。 (2) 在C程序中使用匯編程序

29、中定義的變量和常量。 (3) 在C程序中直接內嵌匯編語句。用此種方法可以在C程序中實現C語言無法實現的一些硬件控制功能,如修改中斷控制寄存器,中斷標志寄存器等。6.2 用用C語言和匯編語言混合編程語言和匯編語言混合編程第6章 C語言程序設計與混合編程 2022-3-2432 (4) 將C程序編譯生成相應的匯編程序,手工修改和優化C編譯器生成的匯編代碼。采用此種方法時,可以控制C編譯器,使之產生具有交叉列表的C程序和與之對應的匯編程序,而程序員可以對其中的匯編語句進行修改。優化之后,對匯編程序進行匯編,產生目標文件。根據編者經驗,只要程序員對C和匯編均很熟悉,這種混合匯編方法的效率可以做得很高。

30、但是,由交叉列表產生的C程序對應的匯編程序往往讀起來頗費勁,因此對一般程序員不提倡使用這種方法。第6章 C語言程序設計與混合編程 2022-3-2433 1. 獨立的獨立的C和匯編模塊接口和匯編模塊接口 獨立的C和匯編模塊接口是一種常用的C和匯編語言接口方法。采用此方法在編寫C程序和匯編程序時,必須遵循有關的調用規則和寄存器規則。調用規則和寄存器規則已在前面作了詳述。如果遵循了這些規則,那么C和匯編語言之間的接口是非常方便的。C程序可以直接引用匯編程序中定義的變量和子程序,匯編程序也可以引用C程序中定義的變量和子程序。第6章 C語言程序設計與混合編程 2022-3-2434【例【例6.5】 C

31、程序:程序:extern int asmfunc( ); /*聲明外部的匯編子程序*/*注意函數名前不要加下劃線*/int gvar; /*定義全局變量*/main( ) int i=5;i =asmfunc(i); /*進行函數調用*/第6章 C語言程序設計與混合編程 2022-3-2435匯編程序:_asmfunc: ;函數名前一定要有下劃線STL A,*(_gvar) ;i的值在累加器A中 ADD*(_gvar),A ;返回結果在累加器A中RET ;子程序返回第6章 C語言程序設計與混合編程 2022-3-2436 2. C程序中訪問匯編程序變量程序中訪問匯編程序變量 從C程序中訪問匯編

32、程序中定義的變量或常數時,根據變量和常數定義的位置和方法的不同,可分為三種情況。 (1) 訪問在.bss段中定義的變量,方法如下: * 采用.bss命令定義變量; * 用.global將變量說明為外部變量; * 在匯編變量名前加下劃線“_”; * 在C程序中將變量說明為外部變量,然后就可以像訪問普通變量一樣訪問它。 第6章 C語言程序設計與混合編程 2022-3-2437例如:例如:匯編程序:匯編程序: /*注意變量名前都有下劃線*/ .bss _var,1 .global _var; ;聲明為外部變量C程序:程序: external int var; /*外部變量*/ var l; 第6章

33、C語言程序設計與混合編程 2022-3-2438 (2) 訪問未在.bss段定義的變量,如當C程序訪問在匯編程序中定義的常數表時,則方法更復雜一些。此時,定義一個指向該變量的指針,然后在C程序中間接訪問它。在匯編程序中定義此常數表時,最好定義一個單獨的段。然后,定義一個指向該表起始地址的全局標號,可以在鏈接時將它分配至任意可用的存儲器空間。如果要在C程序中訪問它,則必須在C程序中以extern方式予以聲明,并且變量名前不必加下劃線“_”。這樣就可以像訪問其他普通變量一樣進行訪問。C程序中訪問匯編常數表如例6.6所示。第6章 C語言程序設計與混合編程 2022-3-2439【例【例6.6】C程序

34、中訪問匯編常數表程序中訪問匯編常數表 匯編程序:匯編程序: global _sine ;定義外部變量 sect sine_tab;定義一個獨立的塊裝常數表_sine ;常數表首址 word 0 word 50 word 100 word 200C程序:程序: extern int sine; /*定義外部變量*/ int *sine_ptr=sine; /*定義一個C指針*/ f=sine_ptr2; /*訪問sine_ptr*/第6章 C語言程序設計與混合編程 2022-3-2440第6章 C語言程序設計與混合編程 2022-3-2441例如:例如:匯編程序:_tab_size .set 1

35、000 .global _tab_sizeC程序:extern int _tab_size;#define TAB_SIZE (int)(&tab_size);for(i=0; i TAB_SIZE; +i) 第6章 C語言程序設計與混合編程 2022-3-2442 3. C程序中直接嵌入匯編語句程序中直接嵌入匯編語句 在C程序中直接嵌入匯編語句是一種直接的C和匯編的接口方法。此種方法可以在C程序中實現C語言無法實現的一些硬件控制功能,如修改中斷控制寄存器、中斷標志寄存器等。 嵌入匯編語句的方法比較簡單,只需在匯編語句的兩邊加上雙引號和括號,并且在括號前加上asm標識符即可。即: as

36、m(“ 匯編語句 ”);如:asm ( RSBX INTM );/*開中斷*/ asm ( SSBX XF ); /*XF置高電平*/ asm ( NOP ); 第6章 C語言程序設計與混合編程 2022-3-2443 注意:括號中引號內的匯編語句的語法和通常的匯編編程的語法一樣。不要破壞C環境,因為C編譯器并不檢查和分析嵌入的匯編語句。插入跳轉語句和標號會產生不可預測的結果。不要讓匯編語句改變C程序中變量的值。不要在匯編語句中加入匯編器選項而改變匯編環境。 修改編譯器的輸出可以控制C編譯器,從而產生具有交叉列表的匯編程序。而程序員可以對其中的匯編語句進行修改,之后再對匯編程序進行匯編,可產生

37、最終的目標文件。注意,修改匯編語句時切勿破壞C環境。第6章 C語言程序設計與混合編程 2022-3-2444【例【例6.7】 用混合編程的設計方法實現四個數碼管同時循環顯示09十個數,每次顯示的數以1遞增。 C語言設計的主程序如下:ioport unsigned port0;/控制數碼管選通的控制接口地址為0ioport unsigned port1;/向數碼管送顯示內容的數據接口地址為1 /*發光二極管的顯示代碼*/char leddisp =0 xf6,0 x77,0 x14,0 xb3,0 xb6,0 xd4,0 xe6,0 xe7,0 x34,0 xf7;void main() 第6章

38、 C語言程序設計與混合編程 2022-3-2445char ledcnt=0 ; c54_init(); /*調用5402芯片初始化函數*/ for (;) ledcnt = (ledcnt+1)%10 ; /*模10循環遞增*/port0 = 0 xf ;/*向地址為0的口送1111b:四個數碼管均選通*/port1 = leddispledcnt;/*向地址為1的口送欲顯示之數*/delay3() ; /*調用延時函數,停頓片刻*/ 第6章 C語言程序設計與混合編程 2022-3-2446用匯編程序設計對5402芯片初始化的函數如下:.title C54_INIT.ASM.mmregs .def _c54_init.text_c54_init: STM0,ST0 ;ARP=0、DP=0 ;護、符號擴展、FRCT 有效、ARP無效、 ;ASM=-1 STM 0 x7FFF,SWWSR RET .

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論