回覆列表
  • 1 # akhzs3504

    命令檔案的開頭部分是要連結的各個子目標檔案的名字,這樣連結器就可以根據子目標檔名,將相應的目標檔案連結成一個檔案;接下來就是連結器的操作指令,這些指令用來配置連結器,接下來就是MEMORY和SECTIONS兩個偽指令的相關語句,必須大寫。MEMORY,用來配置目標儲存器,SECTIONS用來指定段的存放位置。結合下面的典型DOS環境的命令檔案link.cmd來做一下說明:file.obj //子目標檔名1file2.obj //子目標檔名2file3.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,實際應用中一般分為兩頁,PAGE 0程式儲存器和PAGE 1資料儲存器。 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 =執行地址}

  • 中秋節和大豐收的關聯?
  • 高壓斷路器和低壓斷路器的觸頭形式大都採用何種方式?為什麼?