




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第六章第六章 匯編語言程序設計匯編語言程序設計 匯編語言匯編語言DSPDSP的靈魂的靈魂 有一位長期從事單片機開發(fā)的工程師說:有一位長期從事單片機開發(fā)的工程師說: “每一條匯編指令都執(zhí)行了一個硬件操作。每一條匯編指令都執(zhí)行了一個硬件操作?!?“單片機本質(zhì)上是一條條匯編語言。把一條條單片機本質(zhì)上是一條條匯編語言。把一條條匯編指令搞清楚了,也就把單片機徹底掌握匯編指令搞清楚了,也就把單片機徹底掌握了。了?!钡诹碌诹?匯編語言程序設計匯編語言程序設計 使用匯編語言編寫程序的好處:使用匯編語言編寫程序的好處: 匯編速度快、效率高、實時性好;匯編速度快、效率高、實時性好; 對匯編語言的理解和掌握能使
2、程序員寫出更好對匯編語言的理解和掌握能使程序員寫出更好的的C C語言代碼;語言代碼; 對匯編語言編程可精確控制對匯編語言編程可精確控制DSPDSP的時間特性;的時間特性; C C語言存在無法控制的盲區(qū)(寄存器)語言存在無法控制的盲區(qū)(寄存器)第六章第六章 匯編語言程序設計匯編語言程序設計匯編語言包括匯編指令、偽指令和宏指令。匯編語言包括匯編指令、偽指令和宏指令。 匯編指令匯編指令即為即為DSP指令系統(tǒng),該類指令在匯編時將產(chǎn)生一一對應的指令系統(tǒng),該類指令在匯編時將產(chǎn)生一一對應的目標代碼目標代碼; 偽指令偽指令僅在匯編和連接時提供控制信息和數(shù)據(jù),并不產(chǎn)生目標代碼僅在匯編和連接時提供控制信息和數(shù)據(jù),
3、并不產(chǎn)生目標代碼; 宏指令宏指令則是用戶自己創(chuàng)建的則是用戶自己創(chuàng)建的“指令指令”,在匯編時將其展開并匯編為,在匯編時將其展開并匯編為對應的目標代碼對應的目標代碼 匯編語言源程序經(jīng)過匯編器匯編生成機器語言目標程序匯編語言源程序經(jīng)過匯編器匯編生成機器語言目標程序;再由連接器將多個目標程序連接成一個單一的可執(zhí)行程序再由連接器將多個目標程序連接成一個單一的可執(zhí)行程序匯編語言程序的編輯、匯編、鏈接過程匯編語言程序的編輯、匯編、鏈接過程編輯Edit匯編dspa鏈接dsplnk仿真SimulatorEmulator.asm匯編源程序.obj目標文件.out輸出文件.cmd連接命令文件.lst列表文件-l.m
4、ap內(nèi)存映像文件-m6.1 匯編語言格式匯編語言格式 一、語言格式一、語言格式TMS320匯編語言源程序由源語句組成。匯編語言源程序由源語句組成。源語句包括匯編指令、偽指令、宏指令。源語句包括匯編指令、偽指令、宏指令。源語句的格式源語句的格式 標號: 助記符 操作數(shù)1,操作數(shù)2,;注釋標號域 助記符域 操作數(shù)域 注釋域 例: SYMl .set 2 ;符號SYM1等于2 BEGIN: LDP #SYMl ;將2裝入DP .word 016h ;初始化一個字為16h標號域標號域標號域是任選域,若使用必須從源語句的標號域是任選域,若使用必須從源語句的第一列第一列開始書寫。開始書寫。標號包含標號包含
5、1-32個字母、數(shù)字、字符,可識別符號的大小寫,且規(guī)定個字母、數(shù)字、字符,可識別符號的大小寫,且規(guī)定第一個字符不能是數(shù)字;第一個字符不能是數(shù)字;標號后可加或不加冒號標號后可加或不加冒號(:) ;如果不使用標號,則第一個字必須是空格或分號或星號。如果不使用標號,則第一個字必須是空格或分號或星號。當選用標號時,其值為段程序計數(shù)器當選用標號時,其值為段程序計數(shù)器(SPC)的當前值,標號指向與的當前值,標號指向與它們相關聯(lián)的語句。它們相關聯(lián)的語句。 例:行號SPC 目標代碼 源語句100040000A START: .word0Ah, 3, 700030007標號START的值為40h,它指向字0Ah
6、。2. 助記符域助記符域助記符是源語句中的關鍵部分,不能缺省,它表示本指令的助記符是源語句中的關鍵部分,不能缺省,它表示本指令的操作類型。操作類型。助記符不能從源語句的第一列開始,如果從第一列開始,將助記符不能從源語句的第一列開始,如果從第一列開始,將被解釋為標號。被解釋為標號。助記符包括下列操作碼之一助記符包括下列操作碼之一 匯編指令匯編指令 一般用大寫一般用大寫 (例如例如ABS,MPY SPH); 偽指令偽指令 用用“ . ”開始,且為小寫開始,且為小寫 (例如例如 .data, .list .set): 宏指令宏指令 同偽指令同偽指令 (例如例如 .macro .endm)。3. 操作
7、數(shù)域操作數(shù)域操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。如果多于兩個操作數(shù),則用逗號隔開。如果多于兩個操作數(shù),則用逗號隔開。操作數(shù)可以是常數(shù)、符號和表達式。操作數(shù)可以是常數(shù)、符號和表達式。4. 注釋域注釋域注釋域可以從源語句行的任一列開始并直至本行的末尾注釋域可以從源語句行的任一列開始并直至本行的末尾;如果它從第一列開始則可以用分號如果它從第一列開始則可以用分號(;)或星號或星號(*)開始開始,在在行的其他地方開始的注釋,必須以分號行的其他地方開始的注釋,必須以分號(;)開始。開始。二、二、 常數(shù)、字符串和符號常數(shù)、字符串和符號1常數(shù)常數(shù)匯編
8、器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進制整數(shù)二進制整數(shù) 八進制整數(shù)八進制整數(shù) 十進制整數(shù)十進制整數(shù) 十六進制整數(shù)十六進制整數(shù) 字符常數(shù)字符常數(shù) 匯編時間常數(shù)匯編時間常數(shù)以字母以字母B(或或b)結尾,結尾,由二進制數(shù)字由二進制數(shù)字(0,1)組成的數(shù)字串。組成的數(shù)字串。長度最大為長度最大為16位位例:例:00101000b10001111B二、二、 常數(shù)、字符串和符號常數(shù)、字符串和符號1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進制整數(shù)二進制整數(shù) 八進制整數(shù)八進制整數(shù) 十進制整數(shù)十進制整數(shù) 十六進制整數(shù)十六進制整數(shù) 字符常數(shù)字符常數(shù) 匯編時間常數(shù)匯編時間常數(shù)以字母以字
9、母Q(或或q)結尾結尾 ;由八進制數(shù)寧由八進制數(shù)寧(0-7)組成的數(shù)字串。組成的數(shù)字串。長度最大為長度最大為6位位例:例:103010q300000Q二、二、 常數(shù)、字符串和符號常數(shù)、字符串和符號1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進制整數(shù)二進制整數(shù) 八進制整數(shù)八進制整數(shù) 十進制整數(shù)十進制整數(shù) 十六進制整數(shù)十六進制整數(shù) 字符常數(shù)字符常數(shù) 匯編時間常數(shù)匯編時間常數(shù)以字母以字母H(或或h)結尾結尾;由十六進制數(shù)字。由十六進制數(shù)字。0-9和和A-F(或或a-f)組成的數(shù)字串。組成的數(shù)字串。長度最大為長度最大為4位位例:例:032Fh1A03H二、二、 常數(shù)、字符串和符號常數(shù)
10、、字符串和符號1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進制整數(shù)二進制整數(shù) 八進制整數(shù)八進制整數(shù) 十進制整數(shù)十進制整數(shù) 十六進制整數(shù)十六進制整數(shù) 字符常數(shù)字符常數(shù) 匯編時間常數(shù)匯編時間常數(shù)包含在單引號中的一個或兩個字包含在單引號中的一個或兩個字 符的串。符的串。每個字符表示為每個字符表示為8位位ASCII碼碼例:例: a 定義字符定義字符 a其值為其值為61H二、二、 常數(shù)、字符串和符號常數(shù)、字符串和符號1常數(shù)常數(shù)匯編器支持匯編器支持6種類型的常數(shù)種類型的常數(shù); 二進制整數(shù)二進制整數(shù) 八進制整數(shù)八進制整數(shù) 十進制整數(shù)十進制整數(shù) 十六進制整數(shù)十六進制整數(shù) 字符常數(shù)字符常數(shù) 匯
11、編時間常數(shù)匯編時間常數(shù)用用.set偽指令對符號進行賦值偽指令對符號進行賦值例:例:SHIFT .set 3即即 SHIFT = 32字符串字符串字符串是包含在雙引號內(nèi)的一串字符;字符串是包含在雙引號內(nèi)的一串字符;字符在內(nèi)部被表示為字符在內(nèi)部被表示為8位位ASCII碼碼字符中用于下列場合:字符中用于下列場合:.copy “filename ”中的文件名;中的文件名;.sect “section name”中的段名;中的段名;.byte “charstring ”中數(shù)據(jù)初始化偽指令中數(shù)據(jù)初始化偽指令.string 偽指令的操作數(shù)。偽指令的操作數(shù)。3符號符號符號被用做標號、常數(shù)及替代符號;符號被用做
12、標號、常數(shù)及替代符號;符號名最多可由符號名最多可由32個字母和數(shù)字混合組成;個字母和數(shù)字混合組成;符號的第一個字符不能是數(shù)字,符號內(nèi)不能有空格符號的第一個字符不能是數(shù)字,符號內(nèi)不能有空格;由戶定義的符號分大小寫由戶定義的符號分大小寫 例如匯編時例如匯編時ABc、Abc、 abc被識別為被識別為3個不同的符號。個不同的符號。 用匯編器選項用匯編器選項(-C)可消除對大小寫的識別??上龑Υ笮懙淖R別。6.2 偽指令偽指令偽指令僅在匯編和連接時提供控制信息和數(shù)據(jù),并不產(chǎn)生目標代碼偽指令僅在匯編和連接時提供控制信息和數(shù)據(jù),并不產(chǎn)生目標代碼;TMS320C2000的匯編偽指令的功能:的匯編偽指令的功能
13、: 匯編代碼和數(shù)據(jù)到指定的段;匯編代碼和數(shù)據(jù)到指定的段; 為未定義的變量保存空間;為未定義的變量保存空間; 控制列表文件;控制列表文件; 分配存儲器;分配存儲器; 匯編條件塊;匯編條件塊; 定義全局變量;定義全局變量; 指定匯編器能得到的宏;指定匯編器能得到的宏; 檢查符號調(diào)試信息。檢查符號調(diào)試信息。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯
14、編時的符號偽指令8)其他偽指令)其他偽指令 共有五條偽指令共有五條偽指令 .bss data .text .sect usect 把匯編語句程序的各部分與適把匯編語句程序的各部分與適當?shù)亩温?lián)系起來當?shù)亩温?lián)系起來 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 這類偽指令為當前段匯編數(shù)值。這類偽指令為當前段匯
15、編數(shù)值。例例 .int.word.long.byte.string 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 可使段程序計數(shù)器可使段程序計數(shù)器SPC指向預指向預定的位置定的位置共有兩條偽指令共有兩條偽指令 .align.even 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)
16、偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 該類偽指令控制列表文件的格該類偽指令控制列表文件的格式。式。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7
17、)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 該類偽指令為文件提供信息或該類偽指令為文件提供信息或提供這些文件的信息。提供這些文件的信息。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 這類偽指令使匯編器根據(jù)表這類偽指令使匯編器根據(jù)表達式求值結果的真或假來匯達式求值結果的真或假來匯編
18、代碼的某些段。編代碼的某些段。 偽指令分為偽指令分為8類。類。1)段定義偽指令)段定義偽指令2)初始化常數(shù)偽指令)初始化常數(shù)偽指令 3)段程序計數(shù)器排列偽指令)段程序計數(shù)器排列偽指令4)輸出列表格式偽指令)輸出列表格式偽指令5)引用其他文件偽指令)引用其他文件偽指令6)條件匯編偽指令)條件匯編偽指令 7)匯編時的符號偽指令)匯編時的符號偽指令8)其他偽指令)其他偽指令 該類偽指令使定義的符號名該類偽指令使定義的符號名等同于常數(shù)值或字符串等同于常數(shù)值或字符串 例例 .set.equ.struct.endstruct 常用的偽指令常用的偽指令 終止源程序匯編偽指令終止源程序匯編偽指令 .end 賦
19、值偽指令賦值偽指令 .set 和和 .equ 句法:句法: 符號符號 .set 數(shù)值數(shù)值 符號符號 .equ 數(shù)值數(shù)值 例:例: DAC0 .set 0001h ;DAC0 = 0001h 存儲存儲16位字偽指令位字偽指令 .int 和和 .word 句法;句法; .int 數(shù)值數(shù)值1,數(shù)值,數(shù)值n .word 數(shù)值數(shù)值1,數(shù)值,數(shù)值n 例:例: .word 11h,22h,33h 定義標題偽指令定義標題偽指令 .title 句法:句法: .title “字符串字符串” 例:例:.title “example 定義代碼段偽指令定義代碼段偽指令 .text 創(chuàng)建一個可執(zhí)行的代碼段。創(chuàng)建一個可執(zhí)行
20、的代碼段。 (即為匯編程序正文,通常稱為(即為匯編程序正文,通常稱為.text段)段) 定義數(shù)據(jù)段偽指令定義數(shù)據(jù)段偽指令 .data 創(chuàng)建一個已初始化數(shù)據(jù)段。(通常稱為創(chuàng)建一個已初始化數(shù)據(jù)段。(通常稱為.data段)段) 在存儲器中為變量保留空間偽指令在存儲器中為變量保留空間偽指令 .bss 創(chuàng)建一個未初始化數(shù)據(jù)段。創(chuàng)建一個未初始化數(shù)據(jù)段。(即保留一個數(shù)據(jù)空間,通常稱(即保留一個數(shù)據(jù)空間,通常稱.bss段)段) 定義初始化命名段偽指令定義初始化命名段偽指令 .sect 創(chuàng)建一個可定義段名的已初始化數(shù)據(jù)段。創(chuàng)建一個可定義段名的已初始化數(shù)據(jù)段。 句法:句法: .sect “段名段名” 為未命名段中
21、的變量保留空間偽指令為未命名段中的變量保留空間偽指令 .usect 創(chuàng)建一個可定義段名的未初始化數(shù)據(jù)段創(chuàng)建一個可定義段名的未初始化數(shù)據(jù)段 句法:句法: .usect “段名段名”, 長度長度* exmple.asm* .datacoeff.word011h, 022h, 033h.bssvar1, 1 ; reserve space.bssbuffer, 10 ; for two variablesptr.word1234h.textadd:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.dataivals.word0AAh, 0BBhvar2.usec
22、t“newvars”, 1inbuf.usect“newvars”, 7.textADD#0FFh6.3 宏指令宏指令為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復書寫程序的重復書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例(1 1)宏定義)宏定義格式格式: :宏名宏名 .macro .macro 形式參數(shù)形式參數(shù)1,
23、1, 形式參數(shù)形式參數(shù)2, 2, 形式參數(shù)形式參數(shù)33 宏體宏體 .endm .endm 6.3 宏指令宏指令為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復書寫程序的重復書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例(2 2)宏調(diào)用)宏調(diào)用格式格式: :宏名宏名 實參數(shù)實參數(shù)1, 1, 實參數(shù)實參數(shù)2, 2, 實參數(shù)實參
24、數(shù)33 6.3 宏指令宏指令為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏為了簡化匯編語言程序的書寫,常把一些頻繁出現(xiàn)的程序段定義為宏指令指令當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句當程序需要執(zhí)行這一段程序段時只要一條宏調(diào)用語句 ,減少減少匯編語言匯編語言程序的重復書寫程序的重復書寫TMS320系列系列DSP匯編器支持宏指令匯編器支持宏指令(1)宏定義宏定義(2 2)宏調(diào)用)宏調(diào)用舉例舉例例例1 1宏定義:宏定義:parmsparms.macro.macrox, y, zx, y, zLACCLACCx xADD yADD yADDC zADDC z.endm.endm宏調(diào)
25、用宏調(diào)用: :parmsparms55,66,7755,66,77例例2: 宏定義:宏定義:KICK_DOG.macro;看門狗復位宏定義看門狗復位宏定義LDP#00E0h ;DP7000h707FhSPLK#055h, WDKEY;WDCNTR由下一步復位被使能由下一步復位被使能SPLK#0AAh, WDKEY ;WDCNTR 被復位被復位.endm宏調(diào)用宏調(diào)用: KICK_DOG例例3: 宏定義宏定義:DELAY_S .macrodelay_value;延時延時 = 0.05 s delay_valueRPT #delay_valueNOP .endm宏調(diào)用宏調(diào)用: DELAY_S 20
26、;延時延時 = 1 s6.3 宏指令宏調(diào)用與子程序的區(qū)別宏調(diào)用與子程序的區(qū)別: :1 1)宏調(diào)用與子程序都可以被多次調(diào)用,但在程序匯編)宏調(diào)用與子程序都可以被多次調(diào)用,但在程序匯編時,子程序只在一個地方形成目標代碼,而宏調(diào)用時,子程序只在一個地方形成目標代碼,而宏調(diào)用在每個調(diào)用的地方都形成相應的目標代碼(即只省在每個調(diào)用的地方都形成相應的目標代碼(即只省匯編指令,不省目標代碼)匯編指令,不省目標代碼)2 2)宏調(diào)用使用參數(shù),而子程序不使用參數(shù))宏調(diào)用使用參數(shù),而子程序不使用參數(shù) 6.4 公共目標文件格式公共目標文件格式COFF TMS320系列系列DSP的目標文件格式為公共目標文件格式的目標文
27、件格式為公共目標文件格式(COFF: Common Object File Format)采用這種目標文件格式的優(yōu)點:采用這種目標文件格式的優(yōu)點:將指令和數(shù)據(jù)將指令和數(shù)據(jù)按照段的概念按照段的概念進行組織和存儲;進行組織和存儲;程序可讀性大大增強程序可讀性大大增強;編寫程序更容易;編寫程序更容易;便于程序的移植;便于程序的移植;有利于進行模塊化的程序設計;有利于進行模塊化的程序設計;為管理代碼段及系統(tǒng)存儲器提供了靈活的方法和手段。為管理代碼段及系統(tǒng)存儲器提供了靈活的方法和手段。 COFF鼓勵用戶在編寫匯編語言程序時使用鼓勵用戶在編寫匯編語言程序時使用代碼塊代碼塊和和數(shù)據(jù)塊數(shù)據(jù)塊,這些塊被稱為這些
28、塊被稱為段段一、段一、段段是目標文件中的最小單位。段是目標文件中的最小單位。 在存儲器中占據(jù)在存儲器中占據(jù)連續(xù)空間連續(xù)空間的一塊代碼的一塊代碼和數(shù)據(jù)。和數(shù)據(jù)。每個段都是相互獨立分開的。每個段都是相互獨立分開的。COFF目標文件包含三個默認的段:目標文件包含三個默認的段: 文本段:文本段:用用.text 偽指令來定義,該段通常包含可執(zhí)行代碼偽指令來定義,該段通常包含可執(zhí)行代碼 數(shù)據(jù)段:數(shù)據(jù)段:用用.data 偽指令來定義,該段通常包含巳初始化數(shù)據(jù)偽指令來定義,該段通常包含巳初始化數(shù)據(jù)預留段:預留段:用用.bss偽指令來定義,該段是為未初始化的數(shù)據(jù)保留空間偽指令來定義,該段是為未初始化的數(shù)據(jù)保留空
29、間 另外還有兩個自定義段:另外還有兩個自定義段:用用 .sect 偽指令來定義一個偽指令來定義一個自定義數(shù)據(jù)段自定義數(shù)據(jù)段 用用 .usect 偽指令來定義一個偽指令來定義一個自定義預留段自定義預留段 COFF目標文件的段分為兩大類:目標文件的段分為兩大類:已初始化段已初始化段 未初始化段。未初始化段。 有明確內(nèi)容存儲在目標文件中;有明確內(nèi)容存儲在目標文件中; 該段的值是不可修改的該段的值是不可修改的 是建立在是建立在程序存儲器程序存儲器中中 通常包含通常包含程序代碼、常數(shù)表格和數(shù)據(jù)程序代碼、常數(shù)表格和數(shù)據(jù)已初始化段包括:已初始化段包括:.text段(文本段)段(文本段).data段(數(shù)據(jù)段)
30、段(數(shù)據(jù)段)用用.sect創(chuàng)建的自定義段創(chuàng)建的自定義段 COFF目標文件的段分為兩大類:目標文件的段分為兩大類:已初始化段已初始化段 未初始化段。未初始化段。 在在存儲器中保留空間存儲器中保留空間; 在目標文件中沒有實際內(nèi)容;在目標文件中沒有實際內(nèi)容; 運行程序時用于運行程序時用于存儲變量存儲變量 建立在片內(nèi)或片外建立在片內(nèi)或片外RAM中中 未初始化段包括:未初始化段包括:.bss段段用用.usect創(chuàng)建的自定義段創(chuàng)建的自定義段各段在存儲器中的定位各段在存儲器中的定位.text.data.bss.sect自定義段.usect自定義段ROMRAM二、匯編器對段的處理二、匯編器對段的處理 匯編器根
31、據(jù)定義段的偽指令來識別匯編程序中的各個部分:匯編器根據(jù)定義段的偽指令來識別匯編程序中的各個部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect格式:格式: .bss 符號,字數(shù)符號,字數(shù)符號符號保留存儲器空間第一個字的變保留存儲器空間第一個字的變量名;量名;字數(shù)字數(shù)保留存儲器空間的字長保留存儲器空間的字長例:例:.bssvar1, 5 在存儲器中保留在存儲器中保留5個字的空間,第一個個字的空間,第一個字的變量名為字的變量名為var1二、匯編器對段的處理二、匯編器對段的處理 匯編器根據(jù)定義段的偽指令來識別匯編程序中的各個部分:匯編器根據(jù)定義段的
32、偽指令來識別匯編程序中的各個部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect格式:格式: 符號符號 .usect “段名段名”,字數(shù),字數(shù)符號符號保留存儲器空間第一個字的變保留存儲器空間第一個字的變量名;量名;字數(shù)字數(shù)保留存儲器空間的字長保留存儲器空間的字長段名段名用戶為自定義段起的名字用戶為自定義段起的名字例:例:var2 .usect “newvars”, 7 在存儲器中保留在存儲器中保留7個字的空間,段名為個字的空間,段名為newvars,第一個字的變量名為,第一個字的變量名為var2二、匯編器對段的處理二、匯編器對段的處理 匯編器
33、根據(jù)定義段的偽指令來識別匯編程序中的各個部分:匯編器根據(jù)定義段的偽指令來識別匯編程序中的各個部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect .text 段包含可執(zhí)行代碼段包含可執(zhí)行代碼 .data 和和.sect(自定義段)包含已初(自定義段)包含已初始化數(shù)據(jù)始化數(shù)據(jù) 已初始化段的內(nèi)容在目標程序中,并定已初始化段的內(nèi)容在目標程序中,并定位到位到ROM中中 每個初始化段可重新定位每個初始化段可重新定位(實際地址不實際地址不確定)確定) 每個初始化段的編寫可以是不連續(xù)的,每個初始化段的編寫可以是不連續(xù)的,通過匯編器可以把相同的段匯編在一起。
34、通過匯編器可以把相同的段匯編在一起。二、匯編器對段的處理二、匯編器對段的處理 匯編器根據(jù)定義段的偽指令來識別匯編程序中的各個部分:匯編器根據(jù)定義段的偽指令來識別匯編程序中的各個部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect段程序計數(shù)器(段程序計數(shù)器(SPC):): 匯編器為每個段設立獨立的程序計數(shù)器,即段程序計數(shù)器匯編器為每個段設立獨立的程序計數(shù)器,即段程序計數(shù)器 SPC即為文本段或數(shù)據(jù)段的當前地址。起始值為即為文本段或數(shù)據(jù)段的當前地址。起始值為0* exmple.asm* .datacoeff.word011h, 022h, 033h
35、;創(chuàng)建;創(chuàng)建.data 段段.bssvar1, 1 ;在;在.bss段中為兩個段中為兩個.bssbuffer, 10;變量保留空間;變量保留空間ptr.word1234h;繼續(xù)建;繼續(xù)建.data 段段.text;創(chuàng)建;創(chuàng)建.text 段段add:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.data;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.data 段段ivals.word0AAh, 0BBhvar2.usect“newvars”, 1 ;創(chuàng)建自定義段;創(chuàng)建自定義段newvarsinbuf.usect“newvars”, 7 ;為兩個變量保留空間;為兩個變量保留空間.t
36、ext;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.text 段段ADD#0FFh* exmple.asm* SPC代碼代碼0000.data00000011coeff.word011h, 022h, 033h;創(chuàng)建;創(chuàng)建.data 段段0001 0022000200330000.bssvar1, 1 ;在;在.bss段中為兩個段中為兩個0001.bssbuffer, 10 ;變量保留空間;變量保留空間00030123ptr.word0123h ;繼續(xù)建;繼續(xù)建.data 段段0000.text ;創(chuàng)建;創(chuàng)建.text 段段0000100fadd:LACC 0Fh0001bfa0aloop:SUB#1h0002000
37、10003e3ccBCNDaloop,LEQ0004000100059000SACLvar1, 0004.data;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.data 段段000400aaivals.word0AAh, 0BBh000500bb0000var2.usect“newvars”, 1 ;創(chuàng)建自定義段;創(chuàng)建自定義段newvars0001inbuf.usect“newvars”, 7 ;為兩個變量保留空間;為兩個變量保留空間0006.text ;繼續(xù)創(chuàng)建;繼續(xù)創(chuàng)建.text 段段0006b8ffADD#0FFh例中:創(chuàng)建了四個段例中:創(chuàng)建了四個段1) .text段段7個字的目標代碼個字的目標代碼2) .da
38、ta段段 6個字的數(shù)據(jù)個字的數(shù)據(jù)3) .bss 段段 在存儲器中保留在存儲器中保留11個字個字4) newvars段段自定義段,在存儲器中保留自定義段,在存儲器中保留8個字個字100fbfa00001e3cc00019000b8ff.text001100220033123400AA00BB.data保留11個字.bss保留8個字newvars三、鏈接器對段的處理三、鏈接器對段的處理 鏈接器對段的處理要完成兩個功能:鏈接器對段的處理要完成兩個功能:把一個或多個目標文件把一個或多個目標文件(文件名文件名.obj)的各個段作為鏈接的輸入段,的各個段作為鏈接的輸入段,經(jīng)連接產(chǎn)生可執(zhí)行的經(jīng)連接產(chǎn)生可執(zhí)行
39、的COFF輸出文件輸出文件(文件名文件名.out),在其中建立各,在其中建立各個輸出段。個輸出段。為輸出文件的各個輸出段確定存儲器地址為輸出文件的各個輸出段確定存儲器地址鏈接器使用兩個命令來支持上述任務:鏈接器使用兩個命令來支持上述任務:MEMORY 來定義目標系統(tǒng)的存儲器配置來定義目標系統(tǒng)的存儲器配置 SECTIONS 告訴連接器怎樣組合輸入段以及輸出段放在存儲器告訴連接器怎樣組合輸入段以及輸出段放在存儲器的位置的位置.text.data.bsstable_1初始化段u_vars未初始化段file1.objtable_1初始化段.text.data.bsstable_1初始化段u_vars未
40、初始化段file2.objtable_1初始化段FFT初始化段file1 .textfile2 .textfile1 .datafile2 .datafile1 table_1file2 table_1file2 FFTunusedfile1 .bssfile2 .bssfile1 u_varsfile2 u_varsunusedRAMROM 文件的鏈接 重定位重定位連接器在處理每一個段時,原來的段地址都是從地址連接器在處理每一個段時,原來的段地址都是從地址0000開始,所有開始,所有可重定位符號(標號)均相對于它們的段內(nèi)地址??芍囟ㄎ环枺颂枺┚鄬τ谒鼈兊亩蝺?nèi)地址。連接器通過下列措施來重
41、定位段連接器通過下列措施來重定位段1)把各段定位到存儲器內(nèi),從適當?shù)牡刂烽_始;)把各段定位到存儲器內(nèi),從適當?shù)牡刂烽_始;2)調(diào)整符號(標號)值對應于新的段地址;)調(diào)整符號(標號)值對應于新的段地址;3)調(diào)整對已重定位符號的引用,以便反映調(diào)整后的符號值)調(diào)整對已重定位符號的引用,以便反映調(diào)整后的符號值匯編器在需要引用重新定位的符號處留了重定位的入口;匯編器在需要引用重新定位的符號處留了重定位的入口;連接器在符號重定位時,利用這些入口修正對符號的引用;連接器在符號重定位時,利用這些入口修正對符號的引用;例:重定位前 重定位后SPC代碼 PC代碼.refX0000.text00007980BY020
42、0798000010004020102040002bf80LACCX0202bf800003 0000! 020300100004be22Y:IDLE0204be22說明:說明:1)X,Y都是需重定位的,都是需重定位的, Y在本模塊定義,在本模塊定義,X在另一個模塊定義;在另一個模塊定義;2)程序進行匯編時,)程序進行匯編時, X值為值為0(外部引用),(外部引用),Y值為值為0004(段內(nèi)地址)(段內(nèi)地址)3)形成兩個重定位入口:)形成兩個重定位入口:X, Y.text段對段對X的引用是外部引用(列表文件中用的引用是外部引用(列表文件中用“ !”表示)表示) 對對Y的引用是內(nèi)部引用(列表文件
43、中用的引用是內(nèi)部引用(列表文件中用“ ”表示)表示) 4)假設:)假設:X被重定位到地址被重定位到地址 10h .text段被重定位后從地址段被重定位后從地址 0200h開始開始四、外部符號的定義與引用四、外部符號的定義與引用所謂外部符號是在一個模塊定義,在另一個模塊引用的符號所謂外部符號是在一個模塊定義,在另一個模塊引用的符號外部符號定義與引用的偽指令:外部符號定義與引用的偽指令:.def 在當前模塊中定義,并可在別的模塊中使用的符號在當前模塊中定義,并可在別的模塊中使用的符號.ref 在當前模塊中使用,但在別的模塊中定義的符號在當前模塊中使用,但在別的模塊中定義的符號.global 全局符
44、號全局符號例:.defX; 定義 X.refY; 引用 YX:ADD056hMPYY6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機器語言目標的機器語言目標文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標文件(將匯編語言源程序匯編成可重定位的目標文件(.obj文件)文件) 如果需要的話,可生成一個列表文件(如果需要的話,可生成一個列表文件(.lst文件)文件) 將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器(SPC)來管
45、理)來管理 定義和引用符號,需要的話可形成一張交叉引用表定義和引用符號,需要的話可形成一張交叉引用表匯編程序(匯編器)的運行匯編程序(匯編器)的運行dspainput file object file listing file -options dspa 匯編程序名 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機器語言目標的機器語言目標文件文件匯編器的功能匯編器的功能: 將匯編語言源程序匯編成可重定位的目標文件(將匯編語言源程序匯編成可重定位的目標文件(.obj文件)文件) 如果需要的話,可生成一個列表文件(如果需要
46、的話,可生成一個列表文件(.lst文件)文件) 將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器(SPC)來管理)來管理 定義和引用符號,需要的話可形成一張交叉引用表定義和引用符號,需要的話可形成一張交叉引用表匯編程序(匯編器)的運行匯編程序(匯編器)的運行dspainput file object file listing file -options input file 輸入?yún)R編語言源程序文件名 (.asm 文件)(擴展名可省缺) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)
47、是將匯編語言源程序轉(zhuǎn)換成COFF的機器語言目標的機器語言目標文件文件匯編器的功能匯編器的功能: 將匯編語言源程序匯編成可重定位的目標文件(將匯編語言源程序匯編成可重定位的目標文件(.obj文件)文件) 如果需要的話,可生成一個列表文件(如果需要的話,可生成一個列表文件(.lst文件)文件) 將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器(SPC)來管理)來管理 定義和引用符號,需要的話可形成一張交叉引用表定義和引用符號,需要的話可形成一張交叉引用表匯編程序(匯編器)的運行匯編程序(匯編器)的運行dspainput fil
48、e object file listing file -options object file 命名創(chuàng)建的目標文件名 (.obj 文件)(若不提供文件名,則以 “ 輸入文件名.obj ”來命名) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成COFF的機器語言目標的機器語言目標文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標文件(將匯編語言源程序匯編成可重定位的目標文件(.obj文件)文件) 如果需要的話,可生成一個列表文件(如果需要的話,可生成一個列表文件(.lst文件)文件) 將程序代碼分成若干個段
49、,每個段的目標代碼都有一個段程序計數(shù)器將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器(SPC)來管理)來管理 定義和引用符號,需要的話可形成一張交叉引用表定義和引用符號,需要的話可形成一張交叉引用表匯編程序(匯編器)的運行匯編程序(匯編器)的運行dspainput file object file listing file -options listing file 命名產(chǎn)生的列表文件名 (.lst 文件)(若不提供文件名,則以 “ 輸入文件名.lst ”來命名) 6.5 程序的匯編程序的匯編匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成匯編程序(匯編器)是將匯編語言源程序轉(zhuǎn)換成CO
50、FF的機器語言目標的機器語言目標文件文件匯編器的功能:匯編器的功能: 將匯編語言源程序匯編成可重定位的目標文件(將匯編語言源程序匯編成可重定位的目標文件(.obj文件)文件) 如果需要的話,可生成一個列表文件(如果需要的話,可生成一個列表文件(.lst文件)文件) 將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器將程序代碼分成若干個段,每個段的目標代碼都有一個段程序計數(shù)器(SPC)來管理)來管理 定義和引用符號,需要的話可形成一張交叉引用表定義和引用符號,需要的話可形成一張交叉引用表匯編程序(匯編器)的運行匯編程序(匯編器)的運行dspainput file object file
51、 listing file -options -options 選項例: -l 產(chǎn)生列表文件-x產(chǎn)生交叉引用表列表文件:10000.data200010011coeff.word011h, 022h, 033h;創(chuàng)建.data 段0002 00220003003330000.bssvar1, 1 ;在.bss段中為兩個40001.bssbuffer, 10 ;變量保留空間500030123ptr.word0123h ;繼續(xù)建.data 段60000.text ;創(chuàng)建.text 段70000200fadd:LAC 0Fh80001d003aloop:SBLK#10002000180003f280
52、BLEZaloop00040001900056000SACLvar1, 0100004.data;繼續(xù)創(chuàng)建.data 段11000400aaivals.word0AAh, 0BBh000500bb 行號SPC 目標代碼 源程序語句6.6 程序的鏈接程序的鏈接鏈接器的主要任務:鏈接器的主要任務:根據(jù)鏈接命令或鏈接命令文件(根據(jù)鏈接命令或鏈接命令文件(.cmd文件)把文件)把1個或多個目個或多個目標文件標文件(文件名文件名obj)鏈接起來,生成可執(zhí)行的輸出文件鏈接起來,生成可執(zhí)行的輸出文件(文件文件名名.out)和存儲器映像文件(和存儲器映像文件(.map文件)文件)鏈接器所做工作:鏈接器所做工作
53、:把各個段配置到目標系統(tǒng)的存儲器把各個段配置到目標系統(tǒng)的存儲器對段和符號進行重定位,給它們指定一個最終的地址對段和符號進行重定位,給它們指定一個最終的地址解決輸入文件之間未定義的外部引用解決輸入文件之間未定義的外部引用鏈接器的運行:鏈接器的運行:dsplnk file1.obj file2.obj -o file.out或dsplnk linker.cmd 鏈接命令文件鏈接命令文件鏈接命令文件的擴展名為鏈接命令文件的擴展名為 .cmd,包含以下內(nèi)容:,包含以下內(nèi)容:1)輸入文件名:要鏈接的目標文件、歸檔庫文件或其他命令文件)輸入文件名:要鏈接的目標文件、歸檔庫文件或其他命令文件2)鏈接器選項)
54、鏈接器選項3)MEMORY 和和 SECTIONS 鏈接器偽指令鏈接器偽指令4)賦值語句:定義并賦值給全局符號)賦值語句:定義并賦值給全局符號5)注釋:用)注釋:用/*和和*/定界符加注釋定界符加注釋鏈接命令文件(鏈接命令文件(.cmd文件)舉例:文件)舉例:a.Obj b.obj c.obj /* input filename */-o prog.out -m prog.map /* options */MEMORYRAM:origin = 0100h length = 0100hROM:origin = 0200h length = 0100hSECTIONS.text ROM.data
55、ROM.bss RAM MEMORY偽指令MEMORY偽指令用于規(guī)定目標存儲器的模型,定義用戶系統(tǒng)所包含的存儲器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號不同,其存儲器的配置是不相同的。通過MEMORY偽指令可以進行不同型號芯片存儲器的配置MEMORY偽指令的一般句法:MEMORY (大寫) PAGE0: name1(attr): origin = constant, length = constant;PAGEn: name1(attr): origin = constant, length = constant;PAGE : 定義一個存儲器空間,最多可定義255頁 通常 P
56、AGE0 定義為程序存儲器 PAGE1 定義為數(shù)據(jù)存儲器 PAGE2 定義為I/O空間不使用PAGE選項,則鏈接器默認為PAGE0 一個PAGE代表一個完全獨立的地址空間。 PAGE0上配置的存儲器可以和PAGE1上已配置的存儲器交疊 MEMORY偽指令MEMORY偽指令用于規(guī)定目標存儲器的模型,定義用戶系統(tǒng)所包含的存儲器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號不同,其存儲器的配置是不相同的。通過MEMORY偽指令可以進行不同型號芯片存儲器的配置MEMORY偽指令的一般句法: MEMORY (大寫) PAGE0: name1(attr): origin = constant,
57、 length = constant; PAGEn: name1(attr): origin = constant, length = constant;name : 對存儲器區(qū)域取名,有1-8個字符組成 名字對鏈接器沒有特殊意義,僅標識通常 存儲器的區(qū)域范圍不同PAGE上的存儲器范圍可以取相同的名字,但同一PAGE內(nèi)的存儲器范圍不能有相同的名字,且不能重疊 MEMORY偽指令MEMORY偽指令用于規(guī)定目標存儲器的模型,定義用戶系統(tǒng)所包含的存儲器的形式,以及占據(jù)的地址范圍TMS320C2000芯片的型號不同,其存儲器的配置是不相同的。通過MEMORY偽指令可以進行不同型號芯片存儲器的配置MEM
58、ORY偽指令的一般句法: MEMORY (大寫) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;attr (屬性) : (可選項)為已命名的存儲器區(qū)間規(guī)定1-4個屬性R 規(guī)定對存儲器可讀;W規(guī)定對存儲器可寫;X 規(guī)定存儲器可裝入可執(zhí)行代碼;I 規(guī)定存儲器可進行初始化任何沒有規(guī)定屬性的存儲器都具有全部四項屬性 MEMORY偽指令MEMORY偽指令用于規(guī)定目標存儲器的模型,定義用戶系統(tǒng)所包含的存儲器的形式,以及占據(jù)的
59、地址范圍TMS320C2000芯片的型號不同,其存儲器的配置是不相同的。通過MEMORY偽指令可以進行不同型號芯片存儲器的配置MEMORY偽指令的一般句法: MEMORY (大寫) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;origin : 指定一個存儲器區(qū)域的起始地址也可寫成 org 或 o MEMORY偽指令MEMORY偽指令用于規(guī)定目標存儲器的模型,定義用戶系統(tǒng)所包含的存儲器的形式,以及占據(jù)的地址范圍T
60、MS320C2000芯片的型號不同,其存儲器的配置是不相同的。通過MEMORY偽指令可以進行不同型號芯片存儲器的配置MEMORY偽指令的一般句法: MEMORY (大寫) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;length : 指定一個存儲器區(qū)域的長度也可寫成 len 或 l例:所定義的存儲器映像VECSPROG未定義PAGE00000h003Fh0040hFF3FhFF40hFFFFhMMRS未定義PA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國閥門鑄件市場運行狀況及前景趨勢分析報告
- 2025-2030年中國鐵路設備行業(yè)發(fā)展狀況及營銷戰(zhàn)略研究報告
- 2025-2030年中國調(diào)節(jié)閥產(chǎn)業(yè)運行態(tài)勢及發(fā)展前景分析報告
- 2025-2030年中國蘋果汁市場發(fā)展規(guī)模及前景預測分析報告
- 中如何制作電子印章
- 2025-2030年中國福建燃氣市場運行狀況與前景趨勢分析報告
- 新疆工業(yè)職業(yè)技術學院《酒店服務技能實訓》2023-2024學年第二學期期末試卷
- 齊齊哈爾工程學院《空竹》2023-2024學年第二學期期末試卷
- 廣東技術師范大學《文字與版式設計》2023-2024學年第二學期期末試卷
- 吉林師范大學《城市公用事業(yè)管理理論與實踐》2023-2024學年第二學期期末試卷
- 2025廣東珠海高新區(qū)科技產(chǎn)業(yè)局招聘專員1人歷年高頻重點提升(共500題)附帶答案詳解
- 數(shù)學-福建省泉州市2024-2025學年高三上學期質(zhì)量監(jiān)測(二)試卷和答案(泉州二模)
- 員工行為守則及職業(yè)道德規(guī)范
- 3學會反思 第一課時 (說課稿) -2023-2024學年道德與法治六年級下冊統(tǒng)編版
- 2024年國土個人工作總結樣本(3篇)
- 無人機法律法規(guī)與安全飛行 第2版民用航空人員管理
- 2025陜西省建筑安全員B證考試題庫及答案
- (完整版)python學習課件
- DB31-T 451-2021 凈水廠用煤質(zhì)顆?;钚蕴窟x擇、使用及更換技術規(guī)范
- 做賬實操-光伏發(fā)電能源儲存企業(yè)賬務處理示例
- 2025年部門預算支出經(jīng)濟分類科目說明表
評論
0/150
提交評論