




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章匯編語言程序開發工具內容提要
可編程DSP芯片開發需要一套完整的軟、硬件開發工具。通常可分成代碼生成工具和代碼調試工具兩大類。代碼生成工具是指將高級語言或匯編語言編寫的DSP程序轉換成可執行的DSP芯片目標代碼的工具程序,主要包括匯編器、鏈接器和C編譯器以及一些輔助工具程序等。
代碼調試工具包括C/匯編語言源碼調試器、仿真器等。
本章主要介紹代碼生成工具,包括’C54x軟件開發流程、匯編語言程序的編寫、編輯、匯編和鏈接過程、COFF段的一般概念、匯編器和鏈接器處理段的方法以及程序的重定位等。
2023/7/281DSP原理及應用第3章匯編語言程序開發工具3.1TMS320C54x軟件開發過程
3.2
匯編語言程序的編輯、匯編和鏈接過程3.3COFF的一般概念3.4DSP的C語言程序設計2023/7/282DSP原理及應用第3章匯編語言程序開發工具3.1TMS320C54x軟件開發過程
’C54x的應用軟件開發主要完成以下工作:(1)
選擇編程語言編寫源程序
’C54x提供2種編程語言,即匯編語言和C/C++語言。對于完成一般功能的代碼,這兩種語言都可使用,但對于一些運算量很大的關鍵代碼,最好采用匯編語言來完成,以提高程序的運算效率。(2)
選擇開發工具和環境
’C54x提供了兩種開發環境。即非集成開發環境和集成開發環境CCS。
2023/7/283DSP原理及應用第3章匯編語言程序開發工具3.1TMS320C54x軟件開發過程
1.
’C54x應用軟件開發流程
’C54x應用軟件的開發可在TI公司提供的開發環境中進行,用戶可以用C/C++語言或匯編語言編寫源文件,經C編譯器、匯編器生成COFF格式的目標文件,再用鏈接器進行鏈接,生成在’C54x上可執行的目標代碼,然后利用調試工具對可執行的目標代碼進行仿真和調試。
當調試完成后,通過Hex代碼轉換工具,將調試后的可執行目標代碼轉換成EPROM編程器能接受的代碼,并將該代碼固化到EPROM中或加載到用戶的應用系統中,以便DSP目標系統脫離計算機單獨運行。
2023/7/284DSP原理及應用第3章匯編語言程序開發工具1.
’C54x應用軟件開發流程開發過程的目的是產生一個可以由’C54x目標系統執行的模塊。C源文件C編譯器匯編源文件匯編器匯編源文件COFF目標文件鏈接器可執行的COFF文件宏源文件存檔器宏庫存檔器目標文件庫建庫工具運行時支持庫EPROM編程器交叉引用列表器調試工具TMS320C54x絕對地址列表器HEX代碼轉換工具2023/7/285DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具
TI公司提供的DSP開發環境和工具主要包括以下三個部分:
代碼生成工具代碼調試工具
實時操作系統2023/7/286DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具(1)代碼生成工具:C編譯器:用來將C/C++語言源程序自動編譯為’C54x的匯編語言源程序。
匯編器:用來將匯編語言源文件匯編成機器語言COFF目標文件。
鏈接器:將匯編生成的、可重新定位的COFF目標模塊組合成一個可執行的COFF目標模塊。
文檔管理器:允許用戶將一組文件(源文件或目標文件)集中為一個文檔文件庫。
2023/7/287DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具助記符指令—代數式指令翻譯器:用來將包含助記符指令的匯編語言源文件轉換成包含代數式指令的匯編語言源文件。
建庫實用程序:用來建立用戶自己使用的、并用C/C++語言編寫的支持運行的庫函數。
十六進制轉換程序:可以很方便地將COFF目標文件轉換成TI、Intel、Motorola等公司的目標文件格式。(1)代碼生成工具:2023/7/288DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具(1)代碼生成工具:絕對制表程序:將鏈接后的目標文件作為輸入,生成.abs輸出文件。
交叉引用制表程序:利用目標文件生成一個交叉引用清單,列出鏈接的源文件中的符號以及它們的定義和引用情況。2023/7/289DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具(2)代碼調試工具:
(書111)C/匯編語言源碼調試器:與軟件仿真器、評價模塊、軟件開發系統、軟件仿真器等配合使用。
軟件仿真器:是一種模擬DSP芯片各種功能并在非實時條件下進行軟件調試的調試工具,它不需目標硬件支持,只需在計算機上運行。初學者工具DSK:是TI公司提供給初學者進行DSP編程練習的一套廉價的實時軟件調試工具。
2023/7/2810DSP原理及應用第3章匯編語言程序開發工具2.
’C54x的開發工具(2)代碼調試工具:
軟件開發系統SWDS:是一塊PC插卡,可提供低成本的評價和實時軟件開發,還可用來進行軟件調試,程序可在DSP芯片上實時運行。
可擴展的開發系統仿真器(XDS510):可用來進行系統級的集成調試,是進行DSP芯片軟硬件開發的最佳工具。評價模塊EVM板:是一種低成本的開發板,可進行DSP芯片評價、性能評估和有限的系統調試。
2023/7/2811DSP原理及應用第3章匯編語言程序開發工具3.2匯編語言程序的編輯、匯編和鏈接過程
匯編語言源程序可以在任何一種文本編輯器中進行。如筆記本、WORD、EDIT、TC等。
當匯編語言源程序編寫完成后,還必須經過匯編和鏈接后才能運行。
2023/7/2812DSP原理及應用第3章匯編語言程序開發工具3.2匯編語言程序的編輯、匯編和鏈接過程示意圖匯編器調試程序鏈接器文本編輯器.asm源文件.obj目標文件.out輸出文件.cmd鏈接命令文件.lst列表文件.map存儲器映像文件十六進制轉換程序HEX500-
o-
m-
l2023/7/2813DSP原理及應用第3章匯編語言程序開發工具3.2匯編語言程序的編輯、匯編和鏈接過程1.
編輯
利用各種文本編輯器,如筆記本、WORD、EDIT和TC等,可編寫匯編語言源程序。
2.
匯編當匯編語言源程序編寫好以后,可利用’C54x的匯編器ASM500,對一個或多個源程序分別進行匯編,并生成列表文件(.lst)和目標文件(.obj)。
2023/7/2814DSP原理及應用第3章匯編語言程序開發工具3.2匯編語言程序的編輯、匯編和鏈接過程2.
匯編常用的匯編命令:
asm500%1-s-1-x調用匯編器命令
源文件名
將程序所有定義的符號放在目標文件的符號表中
生成一個列表文件.lst
生成一個交叉匯編表
2023/7/2815DSP原理及應用第3章匯編語言程序開發工具3.2匯編語言程序的編輯、匯編和鏈接過程3.
鏈接所謂鏈接,就是利用’C54x的鏈接器LNK500,根據鏈接器命令文件(.cmd)對已匯編過的一個或多個目標文件(.obj)進行鏈接,生成輸出文件(.out)和存儲器映像文件(.map)
。
常用的匯編器命令:
lnk500%1.cmd
lnk500:
調用鏈接器命令
%1.cmd:
鏈接命令文件名,該文件須指明目標文件、輸入文件、輸出文件、鏈接選項和存儲器配置要求等。2023/7/2816DSP原理及應用第3章匯編語言程序開發工具3.3
COFF的一般概念(如何管理存儲空間?如何給學生安排宿舍)
匯編器和鏈接器生成的目標文件,是一個可以由’C54x器件執行的文件。這些目標文件的格式稱之為公共目標文件格式(COFF)。
在編寫匯編語言程序時,COFF采用代碼段和數據段的形式,以便于模塊化的編程,使編程和管理變得更加方便。
這些代碼段和數據段簡稱為段。匯編器和鏈接器提供一些偽指令來建立和管理各種各樣的段。給學生安排宿舍,學生是寫好的程序,宿舍是存儲空間2023/7/2817DSP原理及應用第3章匯編語言程序開發工具3.3
COFF的一般概念
3.3.1
COFF文件的基本單元
COFF文件有3種類型:COFF0、COFF1、COFF2。
每種類型的COFF文件,其標題格式都有所不同,但數據部分是相同的。
鏈接器能夠讀/寫所有類型的COFF文件,默認時鏈接器生成的是COFF2文件,采用-vn鏈接選項可以選擇不同類型的COFF文件。
’C54x匯編器和C編譯器產生的是COFF2文件。
2023/7/2818DSP原理及應用第3章匯編語言程序開發工具3.3.1
COFF文件的基本單元
1.
段(sections)
(如同男女生,班級)是COFF文件中最重要的概念。每個目標文件都分成若干段。
段——是存儲器中占據相鄰空間的代碼或數據塊。一個目標文件中的每個段都是分開的和各不相同的。
COFF目標文件都包含以下3種形式的段:
.text
段(文本段),通常包含可執行代碼;.data
段(數據段),通常包含初始化數據;.bss
段(保留空間段),通常為未初始化變量保留存儲空間。2023/7/2819DSP原理及應用第3章匯編語言程序開發工具3.3.1
COFF文件的基本單元
2.
段的基本類型
COFF目標文件中的段有兩種基本類型。
初始化段
未初始化段(1)
初始化段初始化段中包含有數據或程序代碼。主要有:
.text段——已初始化段;
.data段——已初始化段;.sect段——已初始化段,由匯編器偽指令建立的自定義段。
2023/7/2820DSP原理及應用第3章匯編語言程序開發工具3.3.1
COFF文件的基本單元
(2)
未初始化段
在存儲空間中,為未初始化數據保留存儲空間。它包括:
.bss段——未初始化段;.usect段——未初始化段,由匯編命令建立的命名段(自定義段)。2023/7/2821DSP原理及應用第3章匯編語言程序開發工具3.3.1
COFF文件的基本單元
3.
段與目標存儲器的對應關系
匯編器的任務:在匯編過程中,根據匯編命令用適當的段將各部分程序代碼和數據連在一起,構成目標文件。
鏈接器的任務:就是分配存儲單元,將目標文件中的段重新定位到目標系統的存儲器中,這一過程稱為定位或分配。
2023/7/2822DSP原理及應用第3章匯編語言程序開發工具3.
段與目標存儲器的對應關系目標文件中的段與目標存儲器之間的關系
目標文件目標存儲器.bss.data.textRAME2PROMROM2023/7/2823DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
匯編器對段的處理是通過段偽指令來區別各個段的,并將段名相同的語句匯編在一起。
匯編器有5條偽指令可識別匯編語言程序的各個部分:
●
.bss
●
.usect
●
.text
●
.data
●
.sect——定義未初始化段——定義未初始化段——定義已初始化段——定義已初始化段——定義已初始化段2023/7/2824DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
未初始化段就是在’C54x存儲器中保留空間,通常它們被定位在RAM區。在目標文件中,這些段中沒有確切的內容。
由這些段定義的空間僅作為臨時存儲空間,在程序運行時,可以利用這些存儲空間存放變量。
未初始化段分為默認的和命名的兩種,分別由匯編器偽指令.bss和.usect產生。
1.未初始化段
2023/7/2825DSP原理及應用第3章匯編語言程序開發工具(1).bss偽指令1.未初始化段
用于在bss段中保留若干個空間。
格式:
.bss
符號,字數符號——對應于保留的存儲空間第一個字的變量名稱。可以讓其他段引用,也可以用.global命令定義為全局符號。
字數——表示在bss段或標有名字的段中保留若干個存儲單元。
每調用一次.bss偽指令,匯編器在相應的段保留更多的空間。
2023/7/2826DSP原理及應用第3章匯編語言程序開發工具1.未初始化段
(2).usect偽指令
用于為指定的命名段保留若干個空間。
格式:符號.usect
“段名”,字數段名——程序員為未初始化的命名段定義的名字。
每調用一次.usect偽指令,匯編器在指定的命名段保留更多的空間。
2023/7/2827DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
已初始化段中包含有可執行代碼或初始化數據。
這些段中的內容都在目標文件中,當加載程序時再放到’C54x的存儲器中。每個已初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號。鏈接器在鏈接時會自動地處理段間的相互引用。
已初始化段由.text、.data和.sect三個偽指令建立。2.
已初始化段2023/7/2828DSP原理及應用第3章匯編語言程序開發工具已初始化命令的句法:
2.
已初始化段
.text[段起點]
.data[段起點]
.sect“段名”[,段起點]段起點——是任選項。若選用,它為段程序計數器SPC定義一個起始值。若默認,則SPC從0開始。
2023/7/2829DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
當匯編器遇到.text或.data或.sect命令時,將停止對當前段的匯編(相當于一條結束當前段匯編的命令),然后將緊接著的程序代碼或數據匯編到指定的段中,直到再遇到另一條.text、.data或.sect命令為止。
當匯編器遇到.bss或.usect命令時,并不結束當前段的匯編,只是暫時從當前段脫離出來,并開始對新的段進行匯編。.bss和.usect命令可以出現在一個已初始化段的任何位置,而不會對它的內容發生影響。2023/7/2830DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
命名段由用戶指定,與默認的.text,.data和.bss段的使用相同,但它們被分開匯編。假如一部分可執行代碼(例如初始化程序)不希望和.text段分配在一起,可將它們匯編進一個命名段,這樣就可定位在與.text不同的地方。也可將初始化的數據匯編到與.data段不同的地方,或者將未初始化的變量保留在與.bss段不同的位置。可用.usect和.sect兩個偽指令產生命名段。3.
命名段(自定義段)2023/7/2831DSP原理及應用第3章匯編語言程序開發工具
.usect偽指令產生類似.bss的段,為變量在RAM中保留存儲空間。.sect偽指令產生類似.text和.data的段,可以包含代碼或數據。.sect偽指令產生可重新定位地址的命名段。3.
命名段產生命名段偽指令格式:
符號
.usect“段名”,字數
.sect“段名”
可以產生多達32767個不同的命名段。段名可長達200個字符。
2023/7/2832DSP原理及應用第3章匯編語言程序開發工具
對于.sect和.usect偽指令,段名可以作為子段的參考。
每次用一個新名字調用這些偽指令時,就產生一個新的命名段。
若用已有的段名調用這些偽指令,則匯編器就將代碼或數據(或保留空間)匯編進相應名稱的段中。不同的偽指令不能使用相同的名字。即不能用.usect創建了命名段,然后又用.sect創建一個相同名字的段。3.
命名段2023/7/2833DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
子段是較大段中的小段。鏈接器可以像處理其他段一樣處理子段。
子段結構可用來對存儲器空間進行更緊湊的控制,可以使存儲器空間分配更加緊密。
4.
子段子段命名格式:基段名:子段名
子段名前為基段名,隨后為冒號,最后為子段名。
2023/7/2834DSP原理及應用第3章匯編語言程序開發工具對于子段,匯編器可以單獨為其分配存儲單元,或者在相同的基段名下與其他段組合在一起。
用.sect命令建立的段是已初始化的子段;用.usect命令建立的段是未初始化的子段。4.
子段
例如,若要在.text段內建立一個稱之為_func的子段,其命令格式:
.sect“.text:_func”
2023/7/2835DSP原理及應用第3章匯編語言程序開發工具3.3.2
匯編器對段的處理
匯編器為每個段都安排了一個單獨的程序計數器稱之為段程序計數器SPC。
SPC表示在程序代碼或數據段內當前的地址。開始時匯編器將每個SPC置0。當匯編器將程序代碼或數據加到段內時,增加相應的SPC值。若再繼續對某個段匯編,則相應的SPC就在先前的數值上繼續增加。
鏈接器在鏈接時要對每個段進行重新定位。5.
段程序計數器SPC2023/7/2836DSP原理及應用第3章匯編語言程序開發工具經匯編后,得列表文件(部分):2*******************************3
**匯編一個初始化表到.data段**4
*******************************5
0000.data6
0000
0044
coeff.word044h,055h,066h
00010055
000200667*******************************8**在.bss段中為變量保留空間**9*******************************10
0000.bssbuffer,811*******************************12**仍然在.data段中**13*******************************14
00030456
prt
.word0456h行號目標代碼段名100df0100001f8420001110af166000aF8680006004400550066045600cc00dd00ee00440088
沒有數據保留10個字50000.data600000044coeff.word044h,055h,066h100000.bssbuffer,81400030456prt
.word0456h.data
6
00446
00556
006610
.bss
沒有數據保留8個字14
0456源程序的行號
段程序計數器目標代碼匯編語言源程序2023/7/2837DSP原理及應用第3章匯編語言程序開發工具15********************************16**匯編代碼到.text段**17********************************18
0000.text19
0000
100dadd:LD0Dh,A20
0001
f010
aloop:SUB#1,A
0002
0001
21
0003
f842
BCaloop,AGEQ
0004
0001’
22
**********************************23
**匯編另一個初始化表到.data段**
24**********************************25
0004
.data
26
0004
00cc
ivals
.word0CCh,0DDh,0EEh
0005
00dd
0006
00ee27********************************28
**為更多的變量定義另一個段**29********************************30
0000var2.usect“newvars”,231
0001
inbuf
.usect“newvars”,8
行號目標代碼段名100df0100001f8420001110af166000aF868000666614004400550066045600cc00dd00ee.data00440088
10沒有數據保留8個字.bss沒有數據保留10個字.text
180000.text190000100dadd:LD0Dh,A19
100d200001f010aloop:SUB#1,A20
f01020
0001210003f842BCaloop,AGEQ21
f84221
0001250004.data26000400ccivals
.word0CCh,0DDh,0EEh.data
26
00cc26
00dd26
00ee300000var2.usect“newvars”,2newvars
30
保留2個字310001inbuf
.usect“newvars”,831
保留8個字2023/7/2838DSP原理及應用第3章匯編語言程序開發工具32
*********************************33
**匯編更多代碼到.text段**34*********************************35
0005
.text
36
0005
110a
mpy:LD0Ah,B
370006
f166
mloopMPY#0Ah,B
0007
000a
38
0008
f868BCmloop,BNOV
0009
0006’
39****************************************40
**為中斷向量.vectors定義一個自定義段**41****************************************42
0000
.sect“vectors”430000
0044
.word044h,088h0001
0088
行號目標代碼段名1920202121100df0100001f8420001110af166000aF8680006.text66614262626004400550066045600cc00dd00ee.data00440088
10沒有數據保留8個字.bss3031沒有數據保留10個字newvars350005.text.text
360005110ampy:LD0Ah,B36
110a370006f166mloopMPY#0Ah,B37
f16837
000a380008f868BCmloop,BNOV38
f86838
0006420000.sect“vectors”vectors
4300000044.word044h,088h43
004443
00882023/7/2839DSP原理及應用第3章匯編語言程序開發工具3.3.3
鏈接器對段的處理
鏈接器是開發’C54x器件必不可少的開發工具之一,它對段處理時有2個主要任務:
①
將一個或多個COFF目標文件中的各種段作為鏈接器的輸入段,經鏈接后在一個執行的COFF輸出模塊中建立各個輸出段;
②在程序裝入時對其重新定位,為各個輸出段選定存儲器地址。
2023/7/2840DSP原理及應用第3章匯編語言程序開發工具3.3.3
鏈接器對段的處理
鏈接器有2條偽指令支持上述任務:
●
MEMORY偽指令——用來定義目標系統的存儲器配置空間,包括對存儲器各部分命名,以及規定它們的起始地址和長度。
●
SECTIONS偽指令——用來指定鏈接器將輸入段組合成輸出段方式,以及輸出段在存儲器中的位置,也可用于指定子段。
若未使用偽指令,則鏈接器將使用目標處理器默認的方法將段放入存儲空間。
2023/7/2841DSP原理及應用第3章匯編語言程序開發工具3.3.3
鏈接器對段的處理
1.默認的存儲器分配
鏈接器可對多個目標文件進行鏈接。若鏈接文件中不使用MEMORY和SECTIONS命令,則為默認方式。
每個目標文件都有.text,.data、.bss段和命名段。若采用默認鏈接,鏈接器將對多個目標文件中的各個段進行組合,形成各自的對應段,并將各個段配置到所指定的存儲器中,形成可執行的目標模塊。在默認的方式下,鏈接器將從存儲器的0080h開始,對組合后的各段進行存儲器配置。2023/7/2842DSP原理及應用第3章匯編語言程序開發工具默認的存儲器分配:
①將所有.text段組合在一起,形成一個.text段,并分配到程序存儲器中;
②將多個目標文件中的.data段組合在一起,分配到緊接著.text段的程序存儲空間中;
③將.bss段組合,配置到數據存儲器中;
④組合命名段。初始化的命名段按順序分配到緊隨.data段的程序存儲器,而未初始化命名段將被配置到緊隨.bss段的數據存儲器中。
1.默認的存儲器分配2023/7/2843DSP原理及應用第3章匯編語言程序開發工具默認的存儲器分配過程:File1.obj.text1.data1.bss1table_1(初始化的命名段)u_vars1(未初始化的命名段)File2.obj.text2.data2.bss2table_2(初始化的命名段)u_vars2(未初始化的命名段)FFT(初始化的命名段)程序存儲器數據存儲器.text.text1.text2.data.data1.data2.bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT沒有使用沒有配置沒有配置沒有使用2023/7/2844DSP原理及應用第3章匯編語言程序開發工具3.3.3
鏈接器對段的處理
2.段放入存儲器空間若不希望鏈接器將所有的.text段結合在一起形成單個的.text段,就不能采用默認的方式。由于DSP硬件系統中可能配置多種類型的存儲器,若要把某一段分配到特定類型的存儲器中,或將命名段配置特定的地址,則需采用MEMORY和SECTIONS偽指令來配置。
若不采用默認的方式,通常需要建立一個鏈接命令文件,在命令文件中用MEMORY和SECTIONS偽指令定義存儲器和配置段地址。
2023/7/2845DSP原理及應用第3章匯編語言程序開發工具3.3.4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寒區渠道襯砌凍脹破壞仿真與優化設計研究
- 健康教案小班:飲食衛生啟蒙
- 醫院感染預防和控制培訓講義
- 神經源性膀胱的康復護理
- 培訓內容導圖
- 2025年四川省宜賓市中考招生考試數學真題試卷(真題+答案)
- 預防疫情班會課件
- 順利消防頭腦風暴課件
- 安全生產管理培訓方案提高應急處理能力迅速應對事故
- 音樂改革政策解讀課件
- 山東畜牧獸醫單招考試題及答案
- 商戶安全生產培訓課件
- 2025年西安高新區管委會招聘考試試卷
- 2024-2025學年成都市青羊區七年級下英語期末考試題(含答案)
- 死亡病例討論制度落實與質控優化
- 2018-2024年中國西瓜行業市場趨勢分析及投資潛力研究報告
- DB32∕T 5048-2025 全域土地綜合整治項目驗收規范
- 2025屆河北中考道德與法治真題試卷【含答案】
- 《產科危急重癥早期識別中國專家共識(2024年版)》解讀課件
- 中醫外科一般護理常規
- 電信防詐騙培訓課件
評論
0/150
提交評論