freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

dsp 課件 第六章 匯編語言-文庫吧

2024-12-21 19:13 本頁面


【正文】 實際內(nèi)容 , 只是保留空間而已 。 程序可以在運行時利用這些空間建立和存儲變量 。 未初始化數(shù)據(jù)塊是通過使用 .bss和 .usect匯編器命令來建立 。 .bss命令在 .bss塊中保留空間 , 而 .usect命令在自定義塊中保留空間 。 格式為: .bss 符號 , 字?jǐn)?shù) 符號 .usect “塊名 ” , 字?jǐn)?shù) 其中 , 符號指向由 .bss或 .usect保留的第一個字 , 它對應(yīng)于為變量保留空間的變量名 , 可以在其他任何塊中被訪問 , 也可以用 .global定義為全局符號 。 字?jǐn)?shù)表示空間的大小 , 塊名是程序員自己定義的名字 。 匯編器遇到 .text, .data, .sect和 . asect命令時立即停止匯編至當(dāng)前塊中且開始匯編至相應(yīng)塊中 。 匯編器遇到 .bss或 .usect命令并不結(jié)束當(dāng)前塊開始一個新塊 , 它們只是暫時離開當(dāng)前塊 。 ( 2)已初始化塊 已初始化塊包含可執(zhí)行代碼或已初始化數(shù)據(jù) 。 塊的內(nèi)容存儲在目標(biāo)文件中 , 當(dāng)程序裝入時存放在 DSP存儲器中 。 每個已初始化塊可以獨立地進(jìn)行重定位 , 且可訪問在其他塊中定義的符號 。 鏈接器可自動解決塊與塊之間符號訪問的問題 。 有四個命令通知匯編器將代碼或數(shù)據(jù)存放在嚴(yán)格塊中 , 格式為: .text .data .sect “塊名 ” .asect “塊名 ” , 地址 上述命令中 , .text 和 .data建立的塊名就是 .text 和 .data, 而后兩命令建立的是自定義塊 , 其中 .asect 建立的塊有絕對地址 , 一般不建議使用 。 當(dāng)匯編器遇到上述命令時 , 立即停止匯編至當(dāng)前塊中 , 且開始將隨后的代碼或數(shù)據(jù)匯編至相應(yīng)的塊中 。 塊是通過迭代過程建立的 。 如 , 當(dāng)匯編器首次遇到一個 .data命令 , .data塊是空的 , .data后面的語句被匯編到 .data塊中 , 直到遇到一個 .text, .sect或 .asect命令為止 。 如果匯編器在后面又遇到 .data命令 , 則將 .data后面的語句加到已存在于 .data塊中語句的后面 , 這樣建立的唯一的 .data塊可以在存儲器中分配一個連續(xù)的空間 。 ( 3)自定義塊 自定義塊就是程序員自己建立的塊 , 與缺省的 .text, .data和 .bss塊一樣使用 , 但它與缺省塊分開匯編 。 如 , 重復(fù)使用 .text命令在目標(biāo)文件中只建立一個 .text塊 , 鏈接后這個 .text塊也作為一個單位分配到存儲器中 。 有時候程序員想把一部分程序放至不同于 .text的存儲器中 , 則須使用自定義塊 , 對數(shù)據(jù)也可同樣處理 。 有三條指令可建立自定義塊: .usect, .sect和 .asect, 其中 .usect建立的塊用法類似于 .bss, 是在 RAM中為變量保留空間;而 .sect和 .asect建立包含代碼或數(shù)據(jù)的塊 , 用法類似于 .text和 .data。 .sect建立的塊是可重定位的 , 而 .asect建立具有絕對地址的塊 。 符號 .usect “塊名 ” , 字?jǐn)?shù) .sect “塊名 ” .asect “塊名 ” , 地址 例 此例表示如何用 .usect偽指令定義兩個未初始化的命名段 var1和 var2。 符號 ptr指向 var1段中保留的第一個字。符號 array指向 var1段中 100個字塊內(nèi)的第一個字。符號 dflag指向 var1段中 50個字塊內(nèi)的第一個字。符號 vec指向 Var2段中保留的第一個字。 0000 .text ; 匯編到 .text段 0000 2021 LAC 03h 0000 ptr .usect “var1”,1 ; 在 var1段保留 1個字 0001 array .usect “var1”,100 ; 在 var1段保留 100個字 0001 0037 ADD 037h ; 還在 .text段 0065 dflag .usect “var1”,50 ; 在 var1段保留 50個字 0002 0065 ADD dflag ; 還在 .text段 0000 vec .usect “var2”,100 ; 在 var2段保留 100個字 0003 0000 ADD vec ; 還在 .text段 .global array ; 將 array定義為外部符號名 鏈接器對塊的處理 鏈接器對塊的處理有兩個功能 。 首先 , 將 COFF目標(biāo)文件中的塊用來建立程序塊或數(shù)據(jù)塊 , 將輸入塊組合起來以建立可執(zhí)行的 COFF輸出模塊;其次 , 鏈接器為輸出塊選擇存儲器地址 。 鏈接器提供兩個命令完成上述功能: MEMORY和 SECTION。 MEMORY命令定義目標(biāo)系統(tǒng)的存儲器 , 程序員可定義每一塊存儲器 , 指定每一塊的起始地址和長度 。 SECTION命令告訴鏈接器如何組合輸入塊以及在存儲器何處存放輸出塊 。若不用這兩個命令 , 則鏈接器采用缺省的分配算法 。 若要用這兩條命令 ,則一般需要建立一個鏈接命令文件 , 擴展名為 .cmd。 程序的重定位 匯編器對每塊匯編時都假定其起始地址為 0, 每塊中所有的重定位符號 ( 標(biāo)號 ) 都是相對于 0地址而言的 。 當(dāng)然 , 實際上并不是所有塊在存儲器中都是以 0地址定位的 , 因此鏈接器必須通過下列方法對每塊進(jìn)行重定位 。 ( 1) 分配塊至存儲器 , 使各塊有合適的起始地址 。 ( 2) 調(diào)整符號值 , 使之對應(yīng)于新的塊地址 。 ( 3) 調(diào)整重定位后符號的參考值 , 以反映調(diào)整后的符號值 。 鏈接器利用重定位項來調(diào)整符號的參考值 。 匯編器每次在可重定位符號被參考時建立一個重定位項 , 鏈接器則在符號被重定位之后利用這些項來修正參考值 。 COFF目標(biāo)文件中的每一塊都有一個重定位項目表 。 表中包含了塊中每一個可重定位參考的一個重定位項 。 鏈接器在使用完重定位項后將其去除以防止對輸出塊再次重定位 。 產(chǎn)生重定位項的代碼 1 .ref X 2 0000 .text 3 0000 FF80 B X ;產(chǎn)生一個重定位項 0001 0000! 4 0002 D001 LALK Y ;產(chǎn)生一個重定位項 0003 0004 5 0004 CEIF Y: IDLE 鏈接后 , 假定 X重定位至地址 100h, 且 .text塊重定位到起始地址200h, 則 Y重定位后的地址為 204h。 鏈接器利用這兩個重定位項在目標(biāo)代碼中補上這兩個參考: FF80 B X 變?yōu)? FF80 0000 0100 D001 LALK Y 變?yōu)? D001 0004 0204 有時 , 一塊程序裝入在某塊存儲器中但需在另一塊存儲器中運行 。如 , 程序中的一段關(guān)鍵代碼裝在 ROM中 , 但需在速度更高的 RAM中運行 。 此時 , 必須進(jìn)行運行時的重定位 。 實現(xiàn)運行時的重定位的方法 , 可在鏈接器命令文件的 SECTION中將塊分配兩次:一次設(shè)定裝入地址 , 另一次則設(shè)定運行地址 。 如: .text: load=ROM, run=ROM0 COFF中的符號 COFF中包含一個存儲程序中符號信息的信息表 , 鏈接器在進(jìn)行重定位時要用到這個符號表 。 在一個模塊中定義在另一個模塊中引用的符號稱為外部符號 。 一般可用 .def、 .ref、 .global等命令來標(biāo)明某一符號為外部符號 。 在一個源模塊中 , 外部符號可以用 .def、 .ref、 .global來定義: ( 1) 定義 ( .def ) :在當(dāng)前模塊中定義 , 在其他模塊中引用 ( 2) 參考 ( .ref ) : :在當(dāng)前模塊中引用 , 在其他模塊中定義 ( 3) 全局 ( .global ) :包含上兩者 .globle X ; X在本模塊中定義 , 可在其他模塊中引用 .globle Y ; Y在其他模塊中定義 , 在本模塊中引用 X: ADD 056h ;定義 X MPY Y ;引用 Y 鏈接命令文件 鏈接器的缺省分配算法是: ( 1) 程序存儲器的起始地址是 0x1000h, 長度為 0xEFFF。 ( 2) 數(shù)據(jù)存儲器的起始地址是 0x300h, 長度為 0xFCFF。 ( 3) 將 .text分配到起始地址為 0x1000h的程序存儲器中 。 ( 4) 將 .data分配到緊跟在 .text的程序存儲器中 。 ( 5) 將 . cinit分配到緊跟在 . data的程序存儲器中 。 ( 6) 將自定義的已初始化塊分配到緊跟在 .data的存儲器中 , 若自定義塊不止 1個 , 則按自定義塊在輸入文件的先后順序存放 。 ( 7) 將 .bss分配到起始地址為 0x300h的數(shù)據(jù)存儲器中 。 ( 8) 將自定義的未初始化塊分配到緊跟在 .bss的存儲器中 , 若自定義塊不止 1個 , 則按自定義塊在輸入文件的先后順序存放 。 1 、 MEMORY偽指令 MEMORY偽指令的一般語句格式為: MEMORY { PAGE0: 存儲器名 1[( 屬性 ) ]: origin=常數(shù) , length=常數(shù) PAGEn: 存儲器名 n[( 屬性 ) ]: origin=常數(shù) , length=常數(shù) } ( 1) PAGE: 定義一個存儲器空間,用戶可以定義多達(dá) 255頁。通常 PAGE0定義程序存儲器, PAGE1定義數(shù)據(jù)存儲器。如果用戶沒有使用 PAGE選項,那么連接器把段定位到 PAGE0。 每個 PAGE代表一個完全獨立的地址空間。在PAGE0上已配置的存儲器可以和在 PAGE1上已配置的存儲器重疊。 ( 2)存儲器名:命名存儲器范圍。存儲器名由 1~ 8個字符組成,有效的字符包括 A~Z, a~z, $及 _。名字對于連接
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1