日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c2000 汇编语言指令,C2000系CMD文件的配置理解

發布時間:2023/12/4 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c2000 汇编语言指令,C2000系CMD文件的配置理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x

推薦CMD的專業名稱叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡稱為命令文件,其中比較關鍵的就是MEMORY和SECTIONS兩個偽指令的使用,常常令人困惑,系統出現的問題也經常與它們的不當使用有關。CCS是dsp軟件對DOS系統繼承的開發環境,CCS的命令文件經過DOS命令文件長時間的引申發展,已經變得非常簡潔(不知道TI文檔有沒有詳細CMD配置說明)。我學CMD是從DOS里的東西開始的,所以也從DOS環境下的CMD說起:

1命令文件的組成

命令文件的開頭部分是要鏈接的各個子目標文件的名字,這樣鏈接器就可以根據子目標文件名,將相應的目標文件鏈接成一個文件;接下來就是鏈接器的操作指令,這些指令用來配置鏈接器,接下來就是MEMORY和SECTIONS兩個偽指令的相關語句,必須大寫。MEMORY,用來配置目標存儲器,SECTIONS用來指定段的存放位置。結合下面的典型DOS環境的命令文件link.cmd來做一下說明:

file.obj? ?? ?? ?? ?//子目標文件名1

file2.obj? ?? ???//子目標文件名2

file3.obj? ?? ???//子目標文件名3

- o prog.out??//連接器操作指令,用來指定輸出文件

- m prog.m? ? //用來指定MAP文件

MEMORY

{ 略 }

SECTIONS

{ 略 }

otherlink.cmd

本命令文件link.cmd要調用的otherlink.cmd等其他命令文件,則文件的名字要放到本命令文件最后一行,因為放開頭的話,鏈接器是不會從被調用的其他命令文件中返回到本命令文件。

2 MEMORY偽指令

MEMORY用來建立目標存儲器的模型,SECTIONS指令就可以根據這個模型來安排各個段的位置,MEMORY指令可以定義目標系統的各種類型的存儲器及容量。MEMORY的語法如下:

MEMORY

{

PAGE 0 : name1[(attr)] : origin = constant,length = constant

name1n[(attr)] : origin = constant,length = constant

PAGE 1 : name2[(attr)] : origin = constant,length = constant

name2n[(attr)] : origin = constant,length = constant

PAGE n : namen[(attr)] : origin = constant,length = constant

namenn[(attr)] : origin = constant,length = constant

}

PAGE關鍵詞對獨立的存儲空間進行標記,頁號n的最大值為255,實際應用中一般分為兩頁,PAGE0程序存儲器和PAGE1數據存儲器。

name存儲區間的名字,不超過8個字符,不同的PAGE上可以出現相同的名字(最好不用,免的搞混),一個PAGE內不許有相同的name。

attr的屬性標識,為R表示可讀;W可寫X表示區間可以裝入可執行代碼;I表示存儲器可以進行初始話,什么屬性代碼也不寫,表示存儲區間具有上述的四種屬性,基本上我們都選擇這種寫法。

origin:略。

length:略。

下面是經常用的2407的簡單寫法大家參考,程序從0x060開始,要避開加密位,不從0x0044開始更可靠一點,此例中的同名的頁可以只寫第一個,其后省略,但寫上至少安全一點:

MEMORY

{

PAGE 0: VECS: origin = 0x0000,??length 0x40

PAGE 0: PROG: origin = 0x0060,??length 0x6000

PAGE 1: B0??: origin = 0x200,??length 0x100

PAGE 1: B1??: origin = 0x300,??length 0x100

PAGE 1: DATA: origin = 0x0860,??length 0x0780

}

3 SECTIONS偽指令

SECTIONS指令的語法如下:

SECTIONS

{

.text:??{所有.text輸入段名}??load=加載地址??run =運行地址

.data:??{所有.data輸入段名}??load=加載地址??run =運行地址

.bss:??{所有.bss輸入段名}? ? load=加載地址??run =運行地址

.other: {所有.other輸入段名}??load=加載地址??run =運行地址

}

SECTIONS必須用大寫字母,其后的大括號里是輸出段的說明性語句,每一個輸出段的說明都是從段名開始,段名之后是如何對輸入段進行組織和給段分配存儲器的參數說明:

以.text段的屬性語句為例,“{所有.text輸入段名}”這段內容用來說明連接器輸出段的.text段由哪些子目標文件的段組成,舉例如下

SECTIONS

{

.text:{??file1.obj(.text) file2(.text) file3(.text,cinit)}略

}

指明輸出段.text要鏈接file1.obj的.text和 file2的.text 還有file3的.text和.cinit。在CCS的SECTIONS里通常只寫一個中間沒有內容的“{ }”就表示所有的目標文件的相應段

接下來說明“load=加載地址??run =運行地址”鏈接器為每個輸出段都在目標存儲器里分配兩個地址:一個是加載地址,一個是運行地址。通常情況下兩個地址是相同的,可以認為輸出段只有一個地址,這時就可以不加“run =運行地址”這條語句了;但有時需要將兩個地址分開,比如將程序加載到FLASH,然后放到RAM中高速運行,這就用到了運行地址和加載地址的分別配置了,如下例所示:

.const :{略} load = PROG??run = 0x0800

常量加載在程序存儲區,配置為在RAM里調用。

“load=加載地址”的幾種寫法需要說明一下,首先“load”關鍵字可以省略,“=”可以寫成“>”, “加載地址”可以是:地址值、存儲區間的名字、PAGE關鍵詞等,所以大家見到“.text:{ } > 0x0080”這樣的語句可千萬不要奇怪。“run =運行地址”中的“ = ”可以用“>”,其它的簡化寫法就沒有了。大家不要亂用。

4 CCS中的案例

在CCS中的命令文件好像簡化了不少,少了很多東西,語句也精簡了好多,首先不用指定輸入鏈接器的目標文件,CCS會自動默認處理,其次鏈接器的配置命令也和DOS的環境不同,需要了解的請找TI文檔吧!下面是劉和平書中的例子,大家來看看是不是可以很精確的理解了呢!

-stack 40

/*-------------------------------------------------------------------------*/

/*??命令文件 – 存儲空間 F2407? ?? ?? ?? ?*/

/*-------------------------------------------------------------------------*/

MEMORY

{

PAGE 0 :??VECS??: origin =? ? 0h , length = 40h??/*??程序復位 */

PVECS : origin =??40h??, length = 70h??/* 外圍模塊中斷向量 */

PROG??: origin =??0b0h , length = 7F50h??/* 在片FLASH */

PAGE 1 :??MMRS??: origin =? ? 0h , length =??05Fh??/* MMRS? ?? ?? ?? ?*/

B2? ? : origin = 0060h , length =??020h??/* DARAM B2 塊??*/

B0? ? : origin = 0200h , length =??100h??/* DARAM B0 塊??*/

B1? ? : origin = 0300h , length =??100h??/* DARAM B1 塊??*/

SARAM : origin = 0800h , length =??0800h? ? /* SARAM 塊??*/

EXT? ?: origin = 8000h , length =??8000h??/* 外部存儲器??*/

}

/*-------------------------------------------------------------------------*/

/* SECTIONS ALLOCATION? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? */

/*-------------------------------------------------------------------------*/

SECTIONS

{

.reset? ?: { } > VECS? ?PAGE 0??/* 復位中斷向量表 */

.vectors : { } > VECS? ?PAGE 0 /* 中斷向量表 */

.pvecs? ?: { } > PVECS??PAGE 0 /* 外圍模塊中斷向量表??*/

.text? ? : { } > PROG? ?PAGE 0 /* 代碼 */

.cinit? ?: { } > PROG? ?PAGE 0

.bss? ???: { } > SARAM??PAGE 1 /* 塊 B2 */

.const? ?: { } > SARAM??PAGE 1 /* 塊 B2 */

.stack? ?: { } > B1? ???PAGE 1 /* 堆棧—40個單元 */

}

“load=加載地址? ?run =運行地址”鏈接器為每個輸出段都在目標存儲器里分配兩個地址:一個是加載地址,一個是運行地址。通常情況下兩個地址是相同的,可以認為輸出段只有一個地址,這時就可以不加“run =運行地址”這條語句了

.cinit 存放C程序中的變量初值和常量;

.const 存放C程序中的字符常量、浮點常量和用const聲明的常量;

.switch 存放C程序中switch語句的跳針表;

.text 存放C程序的代碼;

.bss 為C程序中的全局和靜態變量保留存儲空間;

.far 為C程序中用far聲明的全局和靜態變量保留空間;

.stack 為C程序系統堆棧保留存儲空間,用于保存返回地址、函數間的參數傳遞、存儲局部變量和保存中間結果;

.sysmem 用于C程序中malloc、calloc和realloc函數動態分配存儲空間。

總結

以上是生活随笔為你收集整理的c2000 汇编语言指令,C2000系CMD文件的配置理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。