大學(xué)課件16位單片機及語音嵌入式系統(tǒng)-趙定遠-第4章 程序設(shè)計_第1頁
大學(xué)課件16位單片機及語音嵌入式系統(tǒng)-趙定遠-第4章 程序設(shè)計_第2頁
大學(xué)課件16位單片機及語音嵌入式系統(tǒng)-趙定遠-第4章 程序設(shè)計_第3頁
大學(xué)課件16位單片機及語音嵌入式系統(tǒng)-趙定遠-第4章 程序設(shè)計_第4頁
大學(xué)課件16位單片機及語音嵌入式系統(tǒng)-趙定遠-第4章 程序設(shè)計_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、1 4.1 nSP IDE的項目組織結(jié)構(gòu) 項目提供用戶程序及資源文檔的編輯和管理,并提供各項環(huán)境要素的設(shè)置途徑。 因此,用戶從編程到調(diào)程之前實際上都是圍繞著項目的操作。 新建項目包括三類文件:源文件(Source files)、頭文件(Head files)和用來存放 文檔或項目說明的文件(External Dependencies)其組織結(jié)構(gòu)如表4.1所示。這種 項目管理的方式,會把與項目相關(guān)的代碼模塊組織為一個有機的整體,便于開 發(fā)人員對其代碼以及相關(guān)文件文檔的管理 nSP IDE新建項目的結(jié)果 IDE項目文件管理的組織結(jié)構(gòu) 4.2 匯編語言程序設(shè)計 代碼流動過程圖 編程示例 /描述: 計

2、算1 to 100累加值 .RAM / 定義預(yù)定義 RAM 段 .VAR I_Sum; / 定義變量 .CODE /定義代碼段 /= / 函數(shù): main() / 描述:主函數(shù) /= .PUBLIC _main; / 對main程序段聲明 _main: /主程序開始 R1 = 0 x0001; / r1=1.100 R2 = 0 x0000; / 寄存器清零 L_SumLoop: R2 += R1; / 累計值存到寄存器r2 R1 += 1; / 下一個數(shù)值 CMP R1,100; / 判斷是否加到100 JNA L_SumLoop; / 如果 r1 = 100 跳到 L_SumLoop I_

3、Sum = R2; / 在I_Sum中保存最終結(jié)果 L_ProgramEndLoop:/ 程序死循環(huán) JMP L_ProgramEndLoop; /* 編程說明: 1) 匯編必須有一個主函數(shù)的標(biāo)號“_main”,而且必須聲明此“_main”為全局型標(biāo)號: “.PUBLIC _main” 2) 程序代碼沒有定義實際的物理地址,而是以偽指令“.CODE”聲明此程序代碼可以 定位在任何一個程序存儲區(qū)內(nèi)。匯編代碼在程序存儲區(qū)中的定位則由IDE負(fù)責(zé)管 理。 3) 程序用偽指令“.RAM”在數(shù)據(jù)存儲區(qū)內(nèi)聲明了一個變量“R_Sum”,我們無需關(guān)心 “R_Sum”的實際物理地址,IDE將負(fù)責(zé)安排和管理數(shù)據(jù)變量

4、在數(shù)據(jù)存儲區(qū)的地 址安排。 4) 變量名R_Sum實際上代表了變量的地址,在匯編中我們對變量進行讀寫操作時, 則需要用R_Sum來表示變量中的實際內(nèi)容。此部分的詳細內(nèi)容可以閱讀第三章 中的數(shù)據(jù)尋址方式一節(jié)。 數(shù)制、數(shù)據(jù)類型與參數(shù) nSP的數(shù)制及其后綴規(guī)定 nSP匯編指令中的數(shù)據(jù)類型 nSP匯編指令中的連接運算符及修飾符 運算符的優(yōu)先次序 地址表達式與標(biāo)號 : 修飾符SEG與OFFSET常常應(yīng)用在計算表的地址 修飾符SEG:代表22位地址 修飾符OFFSET:代表16位地址 匯編語言程序中所有標(biāo)號的定義都是字母大小寫區(qū)分的 程序注釋與符號規(guī)定 : 程序注釋行必須用雙斜線(/)或分號(;)起始,它

5、可與程序指令在同一行, 或跟在指令后,亦可在指令的前一行或后一行。 nSP的匯編器規(guī)定偽指令不必區(qū)分字母的大小寫,亦即書寫偽指令時既可 全用大寫,也可全用小寫,甚至可以大小寫混用。但所有定義的標(biāo)號包括宏名、 結(jié)構(gòu)名、結(jié)構(gòu)變量名、段名及程序名則一律區(qū)分其字母的大小寫。 匯編語言的程序結(jié)構(gòu) : 程序最基本的結(jié)構(gòu)形式有順序、循環(huán)、分支、子程序四種結(jié)構(gòu) 分支程序設(shè)計 : 分支結(jié)構(gòu)可分為雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)兩種,根據(jù)不同的條件執(zhí)行不同的動作, 在某一確定的條件下,只能執(zhí)行多個分支中的一個分支。 IF( )THEN ELSE雙分支結(jié)構(gòu) CASE多分支結(jié)構(gòu)圖(a) 圖(b) 階躍函數(shù) 說明:這是一個典型的

6、雙分支結(jié)構(gòu),輸入值大于等于0時則返回1,輸入值小于0時返 回0。 入口參數(shù):R1;(有符號數(shù)) 出口參數(shù):R1 子程序名:F_Step 程序的代碼如下: .PUBLIC F_Step; .CODE F_Step: .proc CMP R1,0; /與0比較 JGE ?negtive; /大于等于0則跳轉(zhuǎn)到非負(fù)數(shù)處理 R1 = 0; /小于0則返回0 JMP ?Step_end; /跳轉(zhuǎn)到程序結(jié)束處 ?negtive: R1 = 1; /大于0,則返回1 ?Step_end: RETF; .ENDP 循環(huán)程序設(shè)計 匯編語言中沒有專用的循環(huán)指令,但是可以使用條件轉(zhuǎn)移指令通過條件判斷來控 制循環(huán)是繼

7、續(xù)還是結(jié)束。 (a)DO_UNTIL結(jié)構(gòu)(b)WHILE_DO結(jié)構(gòu) / 描述: 把內(nèi)存中地址為0 x00000 x0006中的數(shù)據(jù),移到地址為0 x00100 x0016中。 .IRAM Label: .DW 0 x0001,0 x0002,0 x0003,0 x0004,0 x0005,0 x0006,0 x0007; .VAR C_Move_To_Position=0 x0010; /定義起始地址; .CODE / 函數(shù): main() / 描述:主函數(shù) .PUBLIC _main; _main: R1=7; /設(shè)置要移動的數(shù)據(jù)的個數(shù) R2=C_Move_To_Position; BP=L

8、abel; L_Loop: R3=BP; /被移動的數(shù)據(jù)送入r3 R2=R3; / 被移動的數(shù)據(jù)送往目的地址 BP+=1; /源地址加1 R2=R2+1; /目的地址加1 R1-=1; /計數(shù)減1 JNZ L_Loop; MainLoop: jmp MainLoop; 子程序 : 在實際應(yīng)用中,經(jīng)常會遇到在同一程序中,需要多次進行一些相同的計算和操作, 例如:延時,算術(shù)運算等。如果每次使用時都再從頭開始編寫這些程序,則程序不 僅繁瑣,而且浪費內(nèi)存空間,也給程序的調(diào)試增加難度。因此,可以采用子程序的 概念,將一些重復(fù)使用的程序標(biāo)準(zhǔn)化,使之成為一個獨立的程序段,需要時調(diào)用即 可。我們就把這些程序段

9、稱作為子程序。一般來說子程序的結(jié)構(gòu)包括三個部分:1.子 程序的定義聲明和開始標(biāo)號部分;2.子程序的實體內(nèi)容部分,表明程序?qū)⑦M行怎樣的 操作;3.子程序的結(jié)束標(biāo)號部分 子程序結(jié)構(gòu) 程序的調(diào)用包括主程序調(diào)用子程序,子程序調(diào)用子程序 在程序調(diào)用的過程中,需要注意到的問題是斷點的現(xiàn)場保護。就是說,子程序?qū)?占用的資源是否與主程序沖突,子程序?qū)茐氖裁醇拇嫫鞯膬?nèi)容,而這些寄存器是 否是主程序持續(xù)使用的等等。通常的做法是用堆棧對現(xiàn)場進行保護,在子程序開始就 把子程序要破壞掉的寄存器的內(nèi)容壓棧保護,當(dāng)子程序結(jié)束的時候,再彈棧恢復(fù)現(xiàn)場。 程序調(diào)用的過程都伴隨著參數(shù)的傳遞,正確的參數(shù)傳遞要滿足入口和出口條件。

10、 入口條件指執(zhí)行子程序時所必需的有關(guān)寄存器內(nèi)容或源程序的存儲器的存儲地址等, 主程序調(diào)用子程序時必須先滿足入口條件,換句話說就是滿足子程序?qū)斎雲(yún)?shù)的約 定。出口參數(shù)就是指子程序執(zhí)行完了之后運算結(jié)果所存放的寄存器或存儲器地址等, 參數(shù)的傳遞有以下幾種情況: 1) 通過寄存器傳遞 2) 通過變量傳遞 3) 通過堆棧傳遞 下面我們針對每一種情況進行具體講解,分析 通過寄存器傳遞參數(shù) : 寄存器傳遞參數(shù),是最常用的一種參數(shù)傳遞的方式。我們常用到的傳遞參數(shù)的寄 存器有4個,分別為R1R4;在程序調(diào)用的過程中,寄存器中的值也會被帶到被調(diào)用 的子程序中供子程序使用。以主程序調(diào)用子程序為例:在調(diào)用子程序前R

11、1R4這4個 寄存器中可能暫存一些值,發(fā)生調(diào)用子程序以后,這些值仍被帶到相應(yīng)的子程序中繼 續(xù)參加子程序的運算,子程序運算結(jié)束后返回主程序,這些寄存器的新值也會被帶到 主程序中繼續(xù)參加主程序的運算。這個過程也可以用圖來表示。實線表示參數(shù)的傳遞 方向是由主程序到子程序,虛線表示參數(shù)的傳遞方向是由子程序到主程序。 范例程序,就是利用寄存器傳遞變量。 求32位有符號數(shù)的絕對值 /函數(shù): F_Abs_32() /語法:void F_Abs_32(int A,int B) /描述:求32位有符號數(shù)具對值 /參數(shù):r3有符號數(shù)低16位,r4有符號數(shù)高16位 /返回:r1絕對值結(jié)果的低16位,r2絕對值結(jié)果的

12、高16位 .CODE .PUBLIC F_Abs_32 F_Abs_32: R1 = R3; /傳送低16位 R2 = R4; /傳送高16位 JMI ?neg; /如果為負(fù)則跳轉(zhuǎn)到負(fù)數(shù)處理 RETF; /為正數(shù)則無需任何處理,返回 ?neg: /負(fù)數(shù)處理 R1 = 0 xFFFF; /低16位去反 R2 = 0 xFFFF; /高16位取反 R1 += 1; /低16位加1 R2 += 0,Carry; /高16位加進位 RETF; 通過變量傳遞參數(shù) : 通過變量進行的參數(shù)傳遞,主要是通過全局型變量實現(xiàn)的。在匯編中,一個變量 名,就代表了一個實際的寄存器的物理地址??梢灾苯訉ξ锢淼刂愤M行賦值

13、和讀取, 但這種的方法會帶來很多麻煩。用變量名去代表一個實際的物理地址,就涉及到某部 分匯編代碼是否認(rèn)識該變量名的問題。 如果在某個匯編文件中定義了一個全局變量(.PUBLIC),那么此匯編文件中的 所有匯編代碼都能夠使用這個變量。但是在其他的匯編文件中,仍不能直接使用這個 變量。在這種情況下,需要在使用這個變量的匯編文件中將該變量聲明成外部變量 (.external),既可使用這個變量,同時該變量也起到了參數(shù)傳遞的作用。 如圖所示。實線表示參數(shù)的傳遞方向是由主程序到子程序,虛線表示參數(shù)的傳遞方向 是由子程序到主程序。 通過堆棧傳遞參數(shù) : 在C函數(shù)與匯編函數(shù)的相互調(diào)用過程中,主要通過堆棧來傳

14、遞參數(shù),而在函數(shù)返 回時,則采用寄存器來傳遞返回值。在主程序把要傳遞的參數(shù)壓入堆棧,然后調(diào)用 子程序。子程序從堆棧中尋找需要的參數(shù)進行處理。當(dāng)子程序返回后,主程序需要 進行彈棧處理,以恢復(fù)參數(shù)壓入堆棧前的堆棧狀態(tài),如圖所示。事實上,IDE開發(fā)環(huán) 境中的C語言與匯編語言的相互調(diào)用,就是采用堆棧傳遞參數(shù),寄存器返回參數(shù)的方 式。SPCE061A使用BP寄存器,可以實現(xiàn)變址尋址方式,可以簡潔地實現(xiàn)堆棧傳遞 參數(shù)的過程。 嵌套與遞歸 子程序的嵌套 子程序嵌套就是指子程序調(diào)用子程序。其中嵌套的層數(shù)稱為嵌套深度。圖表示了 三重嵌套的過程。 子程序嵌套要注意以下幾個方面: 1) 寄存器的保護和恢復(fù),以避免各

15、層子程序之間發(fā)生因寄存器沖突而出錯的情況。 2) 程序中如果使用了堆棧來傳遞參數(shù),應(yīng)對堆棧小心操作,避免堆棧使用不當(dāng)造 成子程序不能正確返回的出錯情況。 3) 子程序的嵌套層數(shù)不是無限的。堆棧是在數(shù)據(jù)存儲區(qū)內(nèi)開辟的空間,而由于 SPCE061A單片機的數(shù)據(jù)存儲的空間為2k WORD。 遞歸子程序 遞歸調(diào)用是指子程序調(diào)用自身子程序。 進行遞歸調(diào)用時需注意的地方是,一個遞歸程序必須有一個能夠退出遞歸調(diào)用的測試 語句。也就是說,遞歸調(diào)用是有條件的,滿足了條件后,才可以進行遞歸調(diào)用;如果 無條件地進行遞歸調(diào)用,那么會使堆??臻g溢出,導(dǎo)致嚴(yán)重的錯誤。下面的一段代碼 沒有退出條件,運行的結(jié)果,必然是錯誤的

16、。 4.3 C語言程序設(shè)計 是否具有對高級語言HLL(High Level Language)的支持已成為衡量微控制器 性能的標(biāo)準(zhǔn)之一。顯然,在HLL平臺上要比在匯編級上編程具有諸多優(yōu)勢:代碼清 晰易讀、易維護,易形成模塊化,便于重復(fù)使用從而增加代碼的開發(fā)效率。 HLL中又因C語言的可移植性最佳而成為首選。因此,支持C語言幾乎是所有微控制 器設(shè)計的一項基本要求。nSP指令結(jié)構(gòu)的設(shè)計就著重考慮了對C語言的支持。 GCC是一種針對nSP操作平臺的ANSI-C編譯器, nSP 指令的算邏操作符 nSP對ANSI-C中基本數(shù)據(jù)類型的支持 程序調(diào)用協(xié)議 由于C編譯器產(chǎn)生的所有標(biāo)號都以下劃線(_)為前綴,

17、而C程序在調(diào)用匯編程序 時要求匯編程序名也以下劃線( _ )為前綴。 模塊代碼間的調(diào)用,是遵循nSP體系的調(diào)用協(xié)議(Calling Convention)。所謂 調(diào)用協(xié)議,是指用于標(biāo)準(zhǔn)子程序之間一個模塊與另一模塊的通訊約定;即使兩個 模塊是以不同的語言編寫而成,亦是如此。 調(diào)用協(xié)議是指這樣一套法則:它使不同的子程序代碼之間形成一種握手通訊接口, 并完成由一個子程序到另一個子程序的參數(shù)傳遞與控制,以及定義出子程序調(diào)用 與子程序返回值的常規(guī)規(guī)則。 調(diào)用協(xié)議包括以下一些相關(guān)要素: 1) 調(diào)用子程序間的參數(shù)傳遞; 2) 子程序返回值; 3) 調(diào)用子程序過程中所用堆棧; 4) 用于暫存數(shù)據(jù)的中間寄存器。

18、 nSP體系的調(diào)用協(xié)議的內(nèi)容如下: 1. 參數(shù)傳遞 參數(shù)以相反的順序(從右到左)被壓入棧中。必要時所有的參數(shù)都被轉(zhuǎn)換成其在函 數(shù)原型中被聲明過的數(shù)據(jù)類型。但如果函數(shù)的調(diào)用發(fā)生在其聲明之前,則傳遞在調(diào) 用函數(shù)里的參數(shù)是不會被進行任何數(shù)據(jù)類型轉(zhuǎn)換的。 2. 堆棧維護及排列 函數(shù)調(diào)用者應(yīng)切記在程序返回時將調(diào)用程序壓入棧中的參數(shù)彈出。 各參數(shù)和局部變量在堆棧中的排列如圖4.22所示。 3. 返回值 16位的返回值存放在寄存器R1中。32位的返回值存入寄存器對R1、R2中;其中低 字在R1中,高字在R2中。若要返回結(jié)構(gòu)則需在R1中存放一個指向結(jié)構(gòu)的指針。 4. 寄存器數(shù)據(jù)暫存方式 編譯器會產(chǎn)生prolo

19、g/epilog過程動作來暫存或恢復(fù)PC、SR及BP寄存器。匯編器則 通過CALL指令可將PC和SR自動壓入棧中,而通過RETF或RETI指令將其 自動彈出棧來。 5. 指針 編譯器所認(rèn)可的指針是16位的。函數(shù)的指針實際上并非指向函數(shù)的入口地址,而是 一個段地址向量_function_entry,在該向量里由2個連續(xù)的word的數(shù)據(jù)單元存放的值 才是函數(shù)的入口地址。 在C程序中調(diào)用匯編函數(shù) : 在C中要調(diào)用一個匯編編寫的函數(shù),需要首先在C語言中聲明此函數(shù)的函數(shù)原型。盡 管不作聲明也能通過編譯并能執(zhí)行代碼,但是會帶來很多的潛在的bug。 下面首先觀察最簡單的C調(diào)用匯編的堆棧過程: 無參數(shù)傳遞的C

20、語言調(diào)用匯編函數(shù) / 描述: 無參數(shù)傳遞的C語言調(diào)用匯編函數(shù) void F_Sub_Asm(void); /聲明要調(diào)用的函數(shù)的函數(shù)原型,此函數(shù)沒有任何參數(shù)的傳遞 / 函數(shù): main() / 描述:主函數(shù) int main(void) while(1) F_Sub_Asm(); return 0; /void F_Sub_Asm(void); / main.c 結(jié)束 匯編函數(shù)如下: /函數(shù): F_Sub_Asm() /描述:延時程序 .CODE .PUBLIC _F_Sub_Asm _F_Sub_Asm: NOP; RETF; 在IDE開發(fā)環(huán)境下運行可以看到調(diào)用過程堆棧變化十分簡單 局部變量調(diào)

21、用示意 oid F_F_Sub_Asm(void); /聲明要調(diào)用的函數(shù)的函數(shù)原型,此函數(shù)沒有任何 參數(shù)的傳遞 int main() int i = 1, j = 2, k = 3; while(1) F_F_Sub_Asm(); i = 0; i+; j = 0; j+; k = 0; k+; return 0; 匯編函數(shù)如下: .CODE /函數(shù): F_F_Sub_Asm() /語法:void F_F_Sub_Asm(void) /描述:延時子程序 /參數(shù):無 /返回:無 .PUBLIC _F_F_Sub_Asm _F_F_Sub_Asm: NOP; RETF; 的局部變量(i,j,k)在

22、堆棧中存放的位置: C向匯編函數(shù)傳遞參數(shù) : / 描述: C向匯編函數(shù)傳遞參數(shù) void F_Sub_Asm(int a,int b,int c); /聲明要調(diào)用的函數(shù)的函數(shù)原型 / 函數(shù): main() / 描述:主函數(shù) int main() int i = 1, j = 2, k = 3; while(1) F_Sub_Asm(i,j,k); i = 0; i+; j = 0; j+; k = 0; k+; return 0; /void F_Sub_Asm(int a,int b,int c); 來自于asm.asm。測試傳遞參數(shù),a,b,c所傳遞 的參數(shù),無出口參數(shù)。 / main.c

23、 結(jié)束 匯編函數(shù)如下: /函數(shù): F_Key_Scan() /語法:void F_Key_Scan(int a,int b,int c) /描述:測試傳遞參數(shù) /參數(shù):a,b,c所傳遞的參數(shù) /返回:無 .CODE .PUBLIC _F_Sub_Asm _F_Sub_Asm: NOP; RETF; C程序調(diào)用時的利用堆棧的 參數(shù)傳遞: 匯編調(diào)用C的函數(shù) : / 描述: 匯編調(diào)用C的函數(shù) .EXTERNAL _F_Sub_C .CODE .PUBLIC _main; / 函數(shù): main() / 描述:主函數(shù) _main: R1 = 1; PUSH R1 TO SP; /第3個參數(shù)入棧 R1 =

24、 2; PUSH R1 TO SP; /第2個參數(shù)入棧 R1 = 3; PUSH R1 TO SP; /第1個參數(shù)入棧 CALL _F_Sub_C; POP R1,R3 FROM SP; /彈出參數(shù)回復(fù)SP指針 GOTO _main; RETF; /void F_Sub_C(int i,int j,int k); 來自于asm.c。延時程序,入口參數(shù)i,j,k;返回i / main.asm 結(jié)束 C語言子函數(shù)如下: /函數(shù): F_Sub_C() /語法:void F_Sub_C(int i,int j,int k) /描述:延時程序 /參數(shù):i,j,k /返回:i int F_Sub_C(in

25、t i,int j,int k) i+; j+; k+; return i; C語言的嵌入式匯編 : 為了使C語言程序具有更高的效率和更多的功能,需在C語言程序里嵌入用匯 編語言編寫的子程序。一方面是為提高子程序的執(zhí)行速度和效率;另一方面,可解 決某些用C語言程序無法實現(xiàn)的機器語言操作。而C語言代碼與匯編語言代碼的接 口是任何C編譯器毋庸置疑要解決的問題。 通常,有兩種方法可將匯編語言代碼與C語言代碼聯(lián)合在一起。一種是把獨立 的匯編語言程序用C函數(shù)連接起來,通過API (Application Program Interface) 的方 式調(diào)用;另一種就是我們下面要講的在線匯編方法,即將直接插

26、入式匯編指令嵌入 到C函數(shù)中。 GCC的基本數(shù)據(jù)類型 采用GCC規(guī)定的在線匯編指令格式進行指令的輸入,是GCC實現(xiàn)將nSP匯編指 令嵌入C函數(shù)中的方法。GCC在線匯編指令格式規(guī)定如下: asm (“匯編指令模板”:輸出參數(shù):輸入?yún)?shù):clobbers參數(shù)); 若無clobber參數(shù),則在線匯編指令格式可簡化為: asm (“匯編指令模板”:輸出參數(shù):輸入?yún)?shù)); 1) 匯編指令模板 模板是在線匯編指令中的主要成分,GCC據(jù)此可在當(dāng)前位置產(chǎn)生匯編指令輸出。例 如,下面一條在線匯編指令: asm (%0 += %1 : +r (foo) : r (bar); 此處,%0 += %1就是模板。其中,

27、操作數(shù)%0、%1作為一種形式參數(shù),分別會 由第一個冒號后面實際的輸出、輸入?yún)?shù)取代。帶百分號的數(shù)字表示的是第一個冒號 后參數(shù)的序號。 如下例: asm (%0 = %1 + %2 : =r (foo) : r (bar), i (10); %0會由參數(shù)foo取代,%1會由參數(shù)bar取代,而%2則會由數(shù)值10取代。 在匯編輸出中,一個匯編指令模板里可以掛接多條匯編指令。其方法是用換行符n 來結(jié)束每一條指令,并用Tab鍵符t將同一模板產(chǎn)生在匯編輸出中的各條指令在換行 顯示時縮進到同一列,以使匯編指令顯示清晰。如下例: asm (%0 += %1nt%0 += %1 : +r (foo) : r (bar); 2) 操作數(shù) 在線匯編指令格式中,第一冒號后的參數(shù)為輸出操作數(shù),第二冒號后的參數(shù)為輸入操 作數(shù),第三冒號后跟著的則是clobber操作數(shù)。在各類操作數(shù)中,引號里的字符代表 的是其存儲類型約束符;括弧里面的字符

溫馨提示

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

評論

0/150

提交評論