




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用主講人:李巖哈爾濱理工大學(xué)計(jì)算機(jī)學(xué)院基于s3c44B0X嵌入式uCLinux系1本章主要內(nèi)容:(1)GCC編譯過(guò)程(2)C/C++交叉編譯器arm-elf-gcc(3)交叉匯編器arm-elf-as(4)交叉連接器arm-elf-ld(5)工程管理器make(6)匯編語(yǔ)言編程(7)混合編程本章主要內(nèi)容:(1)GCC編譯過(guò)程2
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介3
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介43.1GNUGCC簡(jiǎn)介
GNU集成編譯環(huán)境GCC(GNUCompilerCollection)是一種面向嵌入式領(lǐng)域、支持多種編程語(yǔ)言、支持多種CPU的交叉編譯工具。
輸出預(yù)處理后的C/C++源程序(展開(kāi)頭文件和替換宏)輸出C/C++源程序的匯編代碼輸出二進(jìn)制目標(biāo)文件生成靜態(tài)庫(kù)生成可執(zhí)行程序轉(zhuǎn)換文件格式GNUGCC的基本功能3.1GNUGCC簡(jiǎn)介GNU集成編譯環(huán)境53.1GNUGCC簡(jiǎn)介GCC組成--------------C/C++交叉編譯器arm-elf-gccarm-elf-gcc是編譯的前端程序,它通過(guò)調(diào)用其他程序來(lái)實(shí)現(xiàn)將程序源文件編譯成目標(biāo)文件的功能。
arm-elf-gcc具有豐富的命令選項(xiàng),可以控制編譯的各個(gè)階段,滿足用戶的各種編譯需求。3.1GNUGCC簡(jiǎn)介GCC組成------------63.1GNUGCC簡(jiǎn)介GCC組成--------------匯編器arm-elf-as
arm-elf-as將匯編語(yǔ)言程序轉(zhuǎn)換為ELF(ExecutableandLinkingFormat,執(zhí)行時(shí)鏈接文件格式)格式的可重定位目標(biāo)代碼,這些目標(biāo)代碼同其它目標(biāo)模塊或函數(shù)庫(kù)易于定位和鏈接。說(shuō)明:arm-elf-as產(chǎn)生一個(gè)交叉參考表和一個(gè)標(biāo)準(zhǔn)的符號(hào)表,產(chǎn)生的代碼和數(shù)據(jù)能夠放在多個(gè)區(qū)(Section)中。3.1GNUGCC簡(jiǎn)介GCC組成------------73.1GNUGCC簡(jiǎn)介GCC組成--------------連接器arm-elf-ld
arm-elf-gcc是編譯的前端程序,arm-elf-ld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目標(biāo)模塊鏈接成一個(gè)單一的、絕對(duì)定位的目標(biāo)程序。3.1GNUGCC簡(jiǎn)介GCC組成------------83.1GNUGCC簡(jiǎn)介GCC組成--------------庫(kù)管理器arm-elf-ar
arm-elf-ar將多個(gè)可重定位的目標(biāo)模塊歸檔為一個(gè)函數(shù)庫(kù)文件。3.1GNUGCC簡(jiǎn)介GCC組成------------93.1GNUGCC簡(jiǎn)介GCC組成--------------工程管理器MAKE
arm-elf-gccMake是用于自動(dòng)編譯、鏈接程序的實(shí)用工具,使用make后就不需要手工的編譯每個(gè)程序文件。要使用make,首先要編寫(xiě)makefile。
Makefile描述程序文件之間的依賴(lài)關(guān)系,并提供更新文件的命令。3.1GNUGCC簡(jiǎn)介GCC組成------------103.1GNUGCC簡(jiǎn)介GCC組成-------------其他實(shí)用程序
arm-elf-objcopy目標(biāo)文件格式轉(zhuǎn)換工具等;3.1GNUGCC簡(jiǎn)介GCC組成------------113.1GNUGCC簡(jiǎn)介GCC編譯程序的基本過(guò)程
arm-elf-gcc根據(jù)輸入文件的后綴來(lái)確定文件的類(lèi)型,然后根據(jù)用戶的編譯選項(xiàng)(包括優(yōu)化選項(xiàng)、調(diào)試信息選項(xiàng)等)將其編譯成相應(yīng)的匯編臨時(shí)文件(后綴為.s);
arm-elf-as將該匯編文件編譯成目標(biāo)文件(后綴為.o);
arm-elf-ld根據(jù)用戶的鏈接選項(xiàng)(包括指定鏈接命令文件等)將目標(biāo)文件和各種庫(kù)鏈接起來(lái)生成可執(zhí)行文件。程序的編譯過(guò)程3.1GNUGCC簡(jiǎn)介GCC編譯程序的基本過(guò)程12C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-elf-as目標(biāo)文件源文件列表生成庫(kù)連接命令文件可重定位模塊Arm-eif-ldArm-elf-ar用戶庫(kù)庫(kù)列表可執(zhí)行程序C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-13
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介14概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令格式
arm-elf-gcc[options]file…在命令arm-elf-gcc后面跟一個(gè)或多個(gè)選項(xiàng),選項(xiàng)間用空格隔開(kāi),然后跟一個(gè)或多個(gè)目標(biāo)文件。例如,將test.c編譯成目標(biāo)文件test.o并且生成調(diào)試信息:arm-elf-gcc–g–c–otest.otest.c概述3.2C/C++交叉編譯器arm-elf-gcc---15概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-c 將輸入的源文件編譯成目標(biāo)文件-S 將C/C++文件生成匯編文件-ofile將輸出內(nèi)容存于文件file-pipe在編譯的不同階段之間采用管道通訊方式-v 打印出編譯過(guò)程中執(zhí)行的命令-xlanguage 說(shuō)明文件的輸入類(lèi)型為language輸出控制選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---16概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-ansi支持所有ANSIC程序C語(yǔ)言選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---17概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-w關(guān)閉所有警告-Wall打開(kāi)所有警告-Wimplicit如果有隱含申明,顯示警告信息-Wno-implicit不顯示對(duì)隱含申明的警告警告選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---18概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-g在文件中產(chǎn)生調(diào)試信息(調(diào)試信息的文件格式有stabs、COFF、XCOFF、DWARF)調(diào)試選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---19概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-O0不優(yōu)化-O1一級(jí)優(yōu)化-O2二級(jí)優(yōu)化-O3三級(jí)優(yōu)化優(yōu)化選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---20概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-E運(yùn)行C的預(yù)處理器-C在運(yùn)用-E進(jìn)行預(yù)處理時(shí)不去掉注釋-Dmacro定義宏macro為1-Dmacro=defn定義宏macro為defn預(yù)處理選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---21概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-Wa,option將選項(xiàng)option傳遞給匯編器匯編選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---22概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-Idir設(shè)置搜索路徑為dir-I-指定只對(duì)#include“file”,有效的頭文件搜索目錄搜索路徑選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---23概述3.2C/C++交叉編譯器arm-elf-gcc------------------源文件類(lèi)型的識(shí)別*.c ——C源文件*.i ——經(jīng)過(guò)預(yù)處理后的C源文件*.h ——C頭文件*.ii ——經(jīng)過(guò)預(yù)處理后的C++源文件*.cc ——C++源文件*.cxx ——C++源文件*.cpp ——C++源文件*.C ——C++源文件*.s ——不需要預(yù)處理的匯編文件*.S ——需要預(yù)處理的匯編文件arm-elf-gcc能夠自動(dòng)根據(jù)文件名后綴識(shí)別文件類(lèi)型.概述3.2C/C++交叉編譯器arm-elf-gcc---24命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,將test.c編譯成匯編程序并存放于文件test.txt:arm-elf-gcc–S–otest.txttest.c-ofile將輸出內(nèi)容存于文件file,僅適用于只有一個(gè)輸出文件時(shí)。-----------輸出文件名的指定命令使用3.2C/C++交叉編譯器arm-elf-gcc例25命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,
將test.c編譯成test.o:arm-elf-gcc–c–otest.otest.c-c將輸入的源文件編譯成目標(biāo)文件。-----------目標(biāo)文件的生成命令使用3.2C/C++交叉編譯器arm-elf-gcc例26命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,將test.c編譯生成匯編文件test.s:arm-elf-gcc–S–otest.stest.c-S將C/C++文件生成匯編文件。---------將C/C++文件生成匯編文件命令使用3.2C/C++交叉編譯器arm-elf-gcc例27命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,對(duì)test.c進(jìn)行預(yù)處理并將結(jié)果輸出到屏幕:arm-elf-gcc–Etest.c-E只對(duì)源文件進(jìn)行預(yù)處理并且缺省輸出到標(biāo)準(zhǔn)輸出。---------預(yù)處理文件的生成命令使用3.2C/C++交叉編譯器arm-elf-gcc例28命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當(dāng)前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir將目錄dir添加到頭文件搜索目錄列表的第一項(xiàng)。-I--I-以前用-I指定的頭文件搜索目錄只對(duì)#include“file”有效,對(duì)#include<file>無(wú)效;-I-以后指定的頭文件搜索目錄對(duì)以上兩種形式的頭文件都有效。---------設(shè)置頭文件搜索路徑命令使用3.2C/C++交叉編譯器arm-elf-gcc頭29命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當(dāng)前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir-I----------設(shè)置頭文件搜索路徑例如,編譯test.c,在當(dāng)前目錄和/include中搜索test.c所包含的頭文件:arm-elf-gcc–I./–I/include–ctest.c命令使用3.2C/C++交叉編譯器arm-elf-gcc頭30命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,如果有隱含申明,顯示警告信息:arm-elf-gcc–c–Wimplicittest.c不顯示對(duì)隱含申明的警告:arm-elf-gcc–c–Wno–implicittest.c常用的警告選項(xiàng)有:-w關(guān)閉所有警告信息。-Wall打開(kāi)所有警告信息。可以使用以-W開(kāi)頭的不同選項(xiàng)對(duì)特定警告進(jìn)行設(shè)定。對(duì)于每種警告類(lèi)型都有相應(yīng)以-Wno-開(kāi)始的選項(xiàng)關(guān)閉警告。---------控制警告產(chǎn)生命令使用3.2C/C++交叉編譯器arm-elf-gcc例31命令使用3.2C/C++交叉編譯器arm-elf-gcc-O1可以部分減小代碼尺寸,對(duì)運(yùn)行速度有一定的提高。較多地使用了寄存器變量,提高指令的并行度。-O2除了解循環(huán)、函數(shù)插裝和靜態(tài)變量?jī)?yōu)化,幾乎包含arm-elf-gcc所有優(yōu)化選項(xiàng)。一般在生成固化代碼時(shí)使用該選項(xiàng)較為適宜。-O3包含-O2的所有優(yōu)化,并且還包含了解循環(huán)、函數(shù)插裝和靜態(tài)變量?jī)?yōu)化。通常情況下,該級(jí)優(yōu)化生成的代碼執(zhí)行速度最快,但是代碼尺寸比-O2大一些。
arm-elf-gcc支持多種優(yōu)化選項(xiàng),總體上劃分為三級(jí)優(yōu)化:---------實(shí)現(xiàn)優(yōu)化命令使用3.2C/C++交叉編譯器arm-elf-gcc-32命令使用3.2C/C++交叉編譯器arm-elf-gcc例如:編譯test.c并且預(yù)定義宏RUN_CACHE值為1:arm-elf-gcc–c–DRUN_CACHEtest.c編譯test.c并且預(yù)定義宏RUN_CACHE值為0:arm-elf-gcc–c–DRUN_CACHE=0test.c-Dmacro 定義宏macro為1。-Dmacro=defn 定義宏macro為defn。---------在命令行定義命令使用3.2C/C++交叉編譯器arm-elf-gcc例33
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld
★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介34概述3.2交叉連接器arm-elf-ld
---------命令格式arm-elf-ld[option]file…命令行后跟選項(xiàng)和可重定位的目標(biāo)文件名。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接的庫(kù)為libxxx.a,生成內(nèi)存映象文件map.txt,鏈接定位文件為linkcmds,則命令如下:arm-elf-ld-Mapmap.txt-Tlinkcmds-L./lib–odemo.elfdemo.o–lxxx概述3.2交叉連接器arm-elf-ld--------35概述3.2交叉連接器arm-elf-ld
---------命令選項(xiàng)列表-eentry 指定程序入口-M 輸出鏈接信息-lar 指定鏈接庫(kù)-Ldir 添加搜索路徑-o 設(shè)置輸出文件名-Tcommandfile 指定鏈接命令文件-v 顯示版本信息-Map 制定輸出映像文件概述3.2交叉連接器arm-elf-ld--------36命令使用3.2交叉連接器arm-elf-ld
---------程序入口地址-eentry以符號(hào)entry作為程序執(zhí)行的入口地址,而不從默認(rèn)的入口地址開(kāi)始。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,將入口地址設(shè)為_(kāi)start,命令如下:arm-elf-ld–Tlinkcmds–e_start–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----37命令使用3.2交叉連接器arm-elf-ld
---------輸出鏈接信息-M在標(biāo)準(zhǔn)端口打印出符號(hào)映象表和內(nèi)存分布信息。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,在標(biāo)準(zhǔn)端口打印出符號(hào)映象表和內(nèi)存分布信息,命令如下:arm-elf-ld–M–odemo.elfdemo.o如果標(biāo)準(zhǔn)輸出設(shè)置為顯示器,運(yùn)行命令后將在顯示器上顯示內(nèi)存映象信息和符號(hào)映象表。
命令使用3.2交叉連接器arm-elf-ld-----38命令使用3.2交叉連接器arm-elf-ld
---------輸出鏈接信息-Mapmapfile將鏈接的符號(hào)映象表和內(nèi)存分布信息輸出到文件mapfile里。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將鏈接的符號(hào)映象表和內(nèi)存分布信息輸出到文件map.txt里,命令如下:arm-elf-ld–Mapmap.txt–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----39命令使用3.2交叉連接器arm-elf-ld
---------指定鏈接的庫(kù)出-lar指定庫(kù)文件libar.a為鏈接的庫(kù)。可以重復(fù)使用-l來(lái)指定多個(gè)鏈接的庫(kù)。例如:鏈接的輸入文件為demo.o,指定libxxx.a為鏈接的庫(kù),輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o–lxxx命令使用3.2交叉連接器arm-elf-ld-----40命令使用3.2交叉連接器arm-elf-ld
---------添加庫(kù)和腳本文件的搜索路徑-Ldir將dir添加到搜索路徑。例如:例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將/lib添加到庫(kù)的搜索路徑,命令如下:arm-elf-ld-L./lib–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----41命令使用3.2交叉連接器arm-elf-ld
---------設(shè)置輸出文件的名字-ooutput將輸出文件名字設(shè)定為output。如果不指定輸出文件名,arm-elf-ld生成文件名默認(rèn)為a.out。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----42linkcmds連接命令文件3.2交叉連接器arm-elf-ld
-----調(diào)用linkcmds首先寫(xiě)一個(gè)鏈接命令文件linkcmds,然后在arm-elf-ld的命令中使用-Tlinkcmds參數(shù),就能在鏈接時(shí)自動(dòng)調(diào)用linkcmds文件.例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,則命令如下:arm-elf-ld–Tlinkcmds–odemo.elfdemo.olinkcmds連接命令文件3.2交叉連接器arm-elf43linkcmds連接命令文件3.2交叉連接器arm-elf-ld
-----編寫(xiě)linkcmds
arm-elf-ld的命令語(yǔ)言是一種描述性的腳本語(yǔ)言,它主要應(yīng)用于控制:有哪些輸入文件、文件的格式怎樣、輸出文件中的模塊怎樣布局、分段的地址空間怎樣分布、以及未初始化的數(shù)據(jù)段怎樣處理等。
用命令語(yǔ)言寫(xiě)成的文件(通常稱(chēng)為linkcmds)具有可重用性,不必每次在命令行輸入一大堆命令選項(xiàng).并且對(duì)于不同的應(yīng)用,只需對(duì)linkcmds進(jìn)行簡(jiǎn)單的修改就可以使用。linkcmds連接命令文件3.2交叉連接器arm-elf44linkcmds連接命令文件3.2交叉連接器arm-elf-ld
-----編寫(xiě)linkcmds(1)arm-elf-ld命令語(yǔ)言(2)表達(dá)式(3)linkcmds的結(jié)構(gòu)(4)對(duì)程序入口的說(shuō)明(5)對(duì)程序頭的說(shuō)明(6)對(duì)內(nèi)存布局的說(shuō)明(7)對(duì)分段的說(shuō)明(8)注釋linkcmds連接命令文件3.2交叉連接器arm-elf45
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介463.3工程管理器make
概述---------命令格式
make[-fmakefile][option][target]… make命令后跟-f選項(xiàng),指定makefile的名字為makefile;option表示make的一些選項(xiàng);target是make指定的目標(biāo),在3.4.3將詳細(xì)說(shuō)明。例如:makefile的名字是my_hello_make: make–fmy_hello_make3.3工程管理器make概述---------命令格式473.3工程管理器make
概述---------命令選項(xiàng)列表-f 指定makefile-e 使環(huán)境變量?jī)?yōu)先于makefile的變量-Idir 設(shè)定搜索目錄-i 忽略make過(guò)程中所有錯(cuò)誤-n 只顯示執(zhí)行過(guò)程,而不真正執(zhí)行-r 使隱含規(guī)則無(wú)效-w 顯示工作目錄-Cdir 讀取makefile設(shè)置的工作目錄-s 不顯示執(zhí)行的命令
3.3工程管理器make概述---------命令選項(xiàng)483.3工程管理器make
命令使用---------指定makefile-fmakefile用該選項(xiàng)指定makefile的名字為makefile。如果make中多次使用-f指定多個(gè)makefile,則所有makefile將鏈接起來(lái)作為最后的makefile。如果不指定makefile,make默認(rèn)的makefile依次為“makefile”、“Makefile”。例如:make–fmy_hello_make3.3工程管理器make命令使用---------指定493.3工程管理器make
命令使用---------指定環(huán)境變量?jī)?yōu)先于makefile文件中的變量-e使環(huán)境變量?jī)?yōu)先于makefile文件中的變量。例如:
make–e3.3工程管理器make命令使用---------指定503.3工程管理器make
命令使用---------指定包含文件的搜索路徑-Idir指定在解析makefile文件中的.include時(shí)的搜索路徑為dir。如果有多個(gè)路徑,將按輸入順序依次查找。例如:
make–I/include/mk3.3工程管理器make命令使用---------指定513.3工程管理器make
命令使用---------忽略錯(cuò)誤-i忽略make執(zhí)行過(guò)程中的所有錯(cuò)誤。例如:
make–i3.3工程管理器make命令使用---------忽略523.3工程管理器make
命令使用---------顯示命令的執(zhí)行過(guò)程-n只顯示命令的執(zhí)行過(guò)程而不真正執(zhí)行。例如:
make–n3.3工程管理器make命令使用---------顯示533.3工程管理器make
命令使用---------使隱含規(guī)則無(wú)效-r使make的隱含規(guī)則無(wú)效,清除后綴名規(guī)則中默認(rèn)的后綴清單。例如:
make–r3.3工程管理器make命令使用---------使隱543.3工程管理器make
命令使用---------顯示執(zhí)行過(guò)程中的工作目錄-w顯示make執(zhí)行過(guò)程中的工作目錄。例如:
make–w3.3工程管理器make命令使用---------顯示553.3工程管理器make
命令使用---------讀取makefile文件前設(shè)置工作目錄-Cdir在讀取makefile文件以前將工作目錄改變?yōu)閐ir,完成make后改回原來(lái)的目錄。例如:
make–Cbsp3.3工程管理器make命令使用---------讀取563.3工程管理器make
命令使用---------不顯示所執(zhí)行的命令-s運(yùn)行make時(shí)用選項(xiàng)-s可以不顯示執(zhí)行的命令,只顯示生成的結(jié)果文件。例如:
make–s3.3工程管理器make命令使用---------不顯573.3工程管理器make
編寫(xiě)一個(gè)makefile---------makefile的結(jié)構(gòu)makefile文件包含:顯式規(guī)則隱含規(guī)則變量定義指令注釋3.3工程管理器make編寫(xiě)一個(gè)makefile--583.3工程管理器make
編寫(xiě)一個(gè)makefile---------編寫(xiě)makefile中的規(guī)則targets:dependencies command … 或者 targets:dependencies;command command …指定目標(biāo)名,通常是一個(gè)程序產(chǎn)生的目標(biāo)文件名,也可能是執(zhí)行一個(gè)動(dòng)作的名字,名字之間用空格隔開(kāi)。描述產(chǎn)生target所需的文件,一個(gè)target通常依賴(lài)于多個(gè)dependency。用于指定該規(guī)則的命令。3.3工程管理器make編寫(xiě)一個(gè)makefile--593.3工程管理器make
編寫(xiě)一個(gè)makefile例如:smcinit:smc.oconfig.oarm-elf-ar–ruvs–osmcinit.asmc.oconfig.osmc.o:smc.cinclude.harm-elf-gcc–c–osmc.osmc.cconfig.o:config.cinclude.harm-elf-gcc–c–oconfig.oconfig.cclean:rm*.o表示目標(biāo)名的有smcinit、smc.o、config.o。smcinit依賴(lài)于smc.o和config.o,而smc.o又依賴(lài)于smc.c和include.h,config.o依賴(lài)于config.o和include.h.各目標(biāo)分別由命令arm-elf-ar–ruvs–osmcinit.asmc.oconfig.o;arm-elf-gcc–c–osmc.osmc.c;arm-elf-gcc–c–oconfig.oconfig.c來(lái)生成。clean為一動(dòng)作名,刪除所有后綴為.o的文件。
---------編寫(xiě)makefile中的規(guī)則3.3工程管理器make編寫(xiě)一個(gè)makefile例如603.3工程管理器make
編寫(xiě)一個(gè)makefile---------makef調(diào)用makefile中的規(guī)則在默認(rèn)情況下,make運(yùn)行不是以“.”開(kāi)頭的第一條規(guī)則。在上面的例子中,make默認(rèn)執(zhí)行的是規(guī)則smcinit,此時(shí)只需要輸入命令:makemake將讀入makefile,然后執(zhí)行第一條規(guī)則,例子中該規(guī)則是鏈接目標(biāo)文件生成庫(kù),因此必須執(zhí)行規(guī)則smcinit依賴(lài)的規(guī)則smc.o和config.o。在執(zhí)行過(guò)程中將自動(dòng)更新他們所依賴(lài)的文件。有些規(guī)則不是被依賴(lài)的規(guī)則,需要make指定才能被運(yùn)行,如上面的例子中的clean規(guī)則可以這樣執(zhí)行:makeclean這兩種方式的結(jié)果一樣。只是第一種方式?jīng)]指明目標(biāo)名,第二種方式指明了目標(biāo)名。3.3工程管理器make編寫(xiě)一個(gè)makefile--613.3工程管理器make
編寫(xiě)一個(gè)makefile--------設(shè)置makefile中文件的搜索路徑在makefile中,可以通過(guò)給VPATH賦值來(lái)設(shè)置規(guī)則中目標(biāo)文件和依賴(lài)文件的搜索目錄。make首先搜索當(dāng)前目錄,如果未找到依賴(lài)的文件,make將按照VPATH中給的目錄依次搜索。3.3工程管理器make編寫(xiě)一個(gè)makefile--623.3工程管理器make
編寫(xiě)一個(gè)makefile--------如何定義變量在makefile中變量可以被這樣定義: CC=arm-elf-gcc AS:=arm-elf-as AR=arm-elf-ar LIBPATH:=./lib從上面的定義中可以看出,有兩種定義變量的形式:變量名=值變量名:=值為了簡(jiǎn)化makefile以及減少不必要的錯(cuò)誤,可以用變量的形式來(lái)代表目標(biāo)文件名或字符串,在需要使用時(shí)直接調(diào)用變量。3.3工程管理器make編寫(xiě)一個(gè)makefile--633.3工程管理器make
編寫(xiě)一個(gè)makefile--------引用變量有兩種方式:${VarName}$(VarName)
兩種方式的效果一樣。VarName表示變量名。3.3工程管理器make編寫(xiě)一個(gè)makefile--643.3工程管理器make
編寫(xiě)一個(gè)makefile--------make提供的常用變量例如:demo.o:demo.cdemo.h${CC}${CFLAGS}$<-o$@$<的值為demo.c,$@的值為demo.o,而$^的值為demo.cdemo.h。
$@——表示目標(biāo)名$^——表示所有的依賴(lài)文件$<——第一個(gè)依賴(lài)文件3.3工程管理器make編寫(xiě)一個(gè)makefile--653.3工程管理器make
編寫(xiě)一個(gè)makefile--------make里的常用函數(shù)常用的函數(shù)有:(1)$(substfrom,to,text)將字text中的from子串替換為to子串。(2)$(patsubstpattern,replacement,text)按模式pattern替換text中的字串。函數(shù)的使用方式有兩種:$(functionarguments)${functionarguments}
3.3工程管理器make編寫(xiě)一個(gè)makefile--663.3工程管理器make
編寫(xiě)一個(gè)makefile--------隱含規(guī)則實(shí)際上使用的隱含規(guī)則如下所示:對(duì)*.c-->*.o的隱含規(guī)則為:%.o:%.c${CC}${CFLAGS}$<-o$@對(duì)于*.s-->*.o的隱含規(guī)則為:%.o:%.s${AS}${ASFLAGS}$<-o$@隱含規(guī)則是指由make自定義的規(guī)則,常用的有:由*.c的文件生成*.o的文件由*.s的文件生成*.o的文件3.3工程管理器make編寫(xiě)一個(gè)makefile--67
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介683.5交叉匯編器arm-elf-as概述---------命令格式arm-elf-as[option…][asmfile…]在命令arm-elf-as后面跟一個(gè)或多個(gè)選項(xiàng),以及該選項(xiàng)的子選項(xiàng),選項(xiàng)間用空格隔開(kāi),然后跟匯編源文件名。例如:將demo.s編譯成目標(biāo)文件,并且設(shè)置頭文件的搜索目錄為C:\demo\include:arm-elf-as–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as概述--------693.5交叉匯編器arm-elf-as概述---------命令選項(xiàng)列表-a[dhlns] 顯示arm-elf-as信息-f 不進(jìn)行預(yù)處理-Ipath 設(shè)置頭文件搜索路徑-o 設(shè)定輸出文件名-v 顯示版本信息-W 不顯示警告提示-Z 不顯示錯(cuò)誤提示3.5交叉匯編器arm-elf-as概述--------703.5交叉匯編器arm-elf-as命令使用---------生成目標(biāo)文件每次運(yùn)行arm-elf-as只輸出一個(gè)目標(biāo)文件,默認(rèn)狀態(tài)下名字為a.out。可以通過(guò)-o選項(xiàng)指定輸出文件名字,通常都以.o為后綴。例如:編譯demo.s輸出目標(biāo)文件demo.o: arm-elf-as–odemo.odemo.s3.5交叉匯編器arm-elf-as命令使用------713.5交叉匯編器arm-elf-as命令使用---------設(shè)置頭文件搜索路徑-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個(gè)目錄,當(dāng)前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時(shí)指定兩個(gè)搜索目錄,當(dāng)前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------723.5交叉匯編器arm-elf-as命令使用---------顯示arm-elf-as信息內(nèi)容-a[dhlns]打開(kāi)arm-elf-as信息顯示。dhlns為其子選項(xiàng),分別表示:d ——不顯示調(diào)試信息h ——顯示源碼信息l ——顯示匯編列表n ——不進(jìn)行格式處理s ——顯示符號(hào)列表3.5交叉匯編器arm-elf-as命令使用------733.5交叉匯編器arm-elf-as命令使用---------設(shè)置目標(biāo)文件名字-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個(gè)目錄,當(dāng)前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時(shí)指定兩個(gè)搜索目錄,當(dāng)前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------743.5交叉匯編器arm-elf-as命令使用---------如何取消警告內(nèi)容-W加選項(xiàng)-W以后,運(yùn)行arm-elf-as就不輸出警告信息。例如:編譯demo.s輸出目標(biāo)文件demo.o,不輸出警告信息:arm-elf-as–W–odemo.odemo.s
3.5交叉匯編器arm-elf-as命令使用------753.5交叉匯編器arm-elf-as命令使用---------設(shè)置是否進(jìn)行預(yù)處理arm-elf-as內(nèi)部的預(yù)處理程序,完成以下工作:調(diào)整并刪除多余空格,刪除注釋?zhuān)瑢⒆址A扛某蓪?duì)應(yīng)的數(shù)值。例如:編譯demo.s輸出目標(biāo)文件demo.o,并且編譯時(shí)不進(jìn)行預(yù)處理,則命令如下:arm-elf-as–f–odemo.odemo.s
3.5交叉匯編器arm-elf-as命令使用------76
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介773.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(1)字符集匯編中使用下列字符組成源程序的各種語(yǔ)法元素:大寫(xiě)字母A~Z;小寫(xiě)字母a~z;數(shù)字0~9;符號(hào)+-*/=[]();,.:‘@$<>{}%_“\-|^?!。其中大小寫(xiě)字母作用不同。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(1)783.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(2)約定的名字包括寄存器名、指令名字和偽操作符。每一個(gè)偽操作符表示一定功能的操作。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(2)793.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(2)約定的名字偽操作符可以分為六類(lèi):數(shù)據(jù)定義偽操作符符號(hào)定義偽操作符程序結(jié)構(gòu)偽操作符條件匯編偽操作符宏偽操作符其他偽操作符3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(2)803.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)定義的名字匯編程序中的標(biāo)號(hào)、分段名、宏定義名都是用戶可以定義的名字。①標(biāo)號(hào)標(biāo)號(hào)只能由a~z、A~Z、0~9、.、_等字符組成,標(biāo)號(hào)的長(zhǎng)度不受限制,大小寫(xiě)字母有區(qū)別。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)813.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)定義的名字匯編程序中的標(biāo)號(hào)、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預(yù)定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語(yǔ)法如下: .sectionsection_nameattribute3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)823.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)定義的名字匯編程序中的標(biāo)號(hào)、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預(yù)定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語(yǔ)法如下: .sectionsection_nameattribute例如:定義一個(gè)可以執(zhí)行的代碼段.mytext .section".mytext","ax" mycode …3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)833.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)定義的名字匯編程序中的標(biāo)號(hào)、分段名、宏定義名都是用戶可以定義的名字。③宏定義名宏定義的語(yǔ)法如下:.macromacro_nameparm1…parmNmacrobody.endm3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(3)843.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(4)常數(shù)二進(jìn)制數(shù)由0b或者0B開(kāi)頭,如:0b1000101、0B1001110;十六進(jìn)制數(shù)以0x或者0X開(kāi)頭,如:0x4567、0X10089;八進(jìn)制數(shù)由0開(kāi)頭,如:0345、09870;十進(jìn)制數(shù)以非零數(shù)開(kāi)頭,如:345、129803.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(4)853.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(5)當(dāng)前地址數(shù)當(dāng)前的地址數(shù)用點(diǎn)號(hào)“.”表示,在匯編程序中可以直接使用該符號(hào)。(6)表達(dá)式在匯編程序中可以使用表達(dá)式,在表達(dá)式中可以使用常數(shù)和數(shù)值。可以使用的運(yùn)算符有: ①前綴運(yùn)算符號(hào) -——取負(fù)數(shù) ~——取補(bǔ)數(shù) ②中綴運(yùn)算符號(hào) */%<<<>>>|&^!+-3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(5)863.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(7)注釋符號(hào)
不同芯片的匯編程序中,注釋的符號(hào)有所不同,ARM以“@”開(kāi)頭的程序行是注釋行。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------基本元素(7)873.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(1)語(yǔ)句類(lèi)型注釋符號(hào)匯編語(yǔ)句按其作用和編譯的情況分為兩大類(lèi):執(zhí)行性語(yǔ)句和說(shuō)明性語(yǔ)句。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(1)語(yǔ)句883.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(2)數(shù)據(jù)語(yǔ)句一字節(jié)數(shù)據(jù)定義語(yǔ)句兩字節(jié)數(shù)據(jù)定義語(yǔ)句四字節(jié)數(shù)據(jù)定義語(yǔ)句八字節(jié)數(shù)據(jù)定義單個(gè)字串定義多個(gè)字串1多個(gè)字串2重復(fù)數(shù)據(jù)定義3.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(2)數(shù)據(jù)893.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(3)列表控制語(yǔ)句①.title“heading” 在匯編列表中將“heading“作為標(biāo)題。②.list 系統(tǒng)遇此語(yǔ)句就輸出列表文件。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(3)列表903.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(4)一般執(zhí)行語(yǔ)句不同的芯片有不同指令集,見(jiàn)相關(guān)的指令手冊(cè)。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------語(yǔ)句(4)一般913.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(1)程序結(jié)構(gòu)語(yǔ)句程序結(jié)構(gòu)語(yǔ)句是偽操作符定義的說(shuō)明語(yǔ)句,用于說(shuō)明程序段的開(kāi)始、結(jié)束以及源程序的結(jié)束等。3.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(1)923.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(1)程序結(jié)構(gòu)語(yǔ)句程序結(jié)構(gòu)語(yǔ)句是偽操作符定義的說(shuō)明語(yǔ)句,用于說(shuō)明程序段的開(kāi)始、結(jié)束以及源程序的結(jié)束等。代碼段的開(kāi)始.text②數(shù)據(jù)段的開(kāi)始.data③源程序的結(jié)束.end3.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(1)933.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(2)過(guò)程(函數(shù))的定義過(guò)程的結(jié)構(gòu)如下: 過(guò)程名: 過(guò)程體 返回語(yǔ)句例如:.align2 .globluart1_sendch .typeuart1_sendch,@function uart1_sendch: ldr r2,=SYSFLG1: ldr r1,[r2] tst r1,#UTXFF1 bne 1b ldr r2,=UARTDR1 strb r0,[r2] mov pc,lr 一般情況下,.type和.align聲明可以缺省。
3.6匯編語(yǔ)言編程匯編語(yǔ)言---------程序結(jié)構(gòu)(2)943.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------等價(jià)語(yǔ)句(1).equ語(yǔ)句語(yǔ)法:.equsymbol,expression 例子:.equPPC_PC,32*4 應(yīng)用:stw r4,PPC_PC(r1)
(2).set語(yǔ)句 與.equ的功能相同。
3.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------等價(jià)語(yǔ)953.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------宏定義與宏調(diào)用宏定義:.macromacro_nameparam1,param2,…..paramN .macrobody.endm例如:(使用ARM的匯編指令集說(shuō)明) .macroROMSEC_patovaTTPA,pa_start,va_start,tmp,ic
ldr \tmp,=APFIELD_ROM add \TTPA,\TTPA,\va_start,LSR#18 add \tmp,\tmp,\pa_start20: str \tmp,[\TTPA],#4 add \tmp,\tmp,#0x10000 subs \ic,\ic,#1 bne 20b
.endm3.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------宏定義963.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------重復(fù)塊和源文件的嵌入(1)重復(fù)塊定義: .reptcount contents .endr例如: .rept2 .long0x12908 .endr等價(jià)于: .long0x12908 .long0x12908(2)源文件的嵌入在一個(gè)匯編文件中可以嵌入其它匯編文件,例如匯編頭文件等。方法如下:.include“filename”3.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------重復(fù)塊973.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------條件編譯.ifexpression表達(dá)式為非零則編譯后面的語(yǔ)句,否則后面的語(yǔ)句被忽略。.ifdefsymbol如果符號(hào)被定義則編譯后面的語(yǔ)句,否則后面的語(yǔ)句被忽略。.ifndefsymbol如果符號(hào)未被定義則編譯后面的語(yǔ)句,否則后面的語(yǔ)句被忽略。.else表示與前面的if語(yǔ)句的條件相反。.endif表示條件判斷結(jié)束。3.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------條件編983.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------條件編譯例如: .macrosumfrom=0,to=5 .long\from .if\to-\from sum“(\from+1)”,\to .endif .endm應(yīng)用: sum,5等價(jià)于 .long0 …… .long5 條件判斷可以嵌套使用,if-else-endif遵循最近匹配的原則。3.6匯編語(yǔ)言編程宏語(yǔ)句與條件編程---------條件編993.6匯編語(yǔ)言編程模塊化程序設(shè)計(jì)---------全局符號(hào)在模塊中定義的、要被別的模塊使用的符號(hào)(包括變量名和函數(shù)名)都必須被聲明為全局符號(hào)。方法如下:
.globalsymbol在本模塊中要使用其他模塊中的全局符號(hào),可以用.externsymbol的方式聲明,但也可以不用聲明在匯編時(shí)自動(dòng)認(rèn)為它是其它模塊中的全局符號(hào)。3.6匯編語(yǔ)言編程模塊化程序設(shè)計(jì)---------全局符1003.6匯編語(yǔ)言編程模塊化程序設(shè)計(jì)---------模塊間的符號(hào)互用
(1)匯編模塊與匯編模塊間的調(diào)用(2)匯編模塊調(diào)用C語(yǔ)言模塊中的函數(shù)(3)匯編模塊使用C語(yǔ)言模塊中的變量(4)C語(yǔ)言模塊調(diào)用匯編模塊中的函數(shù)(5)C語(yǔ)言模塊使用匯編模塊中的變量3.6匯編語(yǔ)言編程模塊化程序設(shè)計(jì)---------模塊間1013.6匯編語(yǔ)言編程內(nèi)存模式
在uClinux
環(huán)境下,內(nèi)存模式為平模式,即整個(gè)內(nèi)存空間最大為4GB。 所有任務(wù)共享這4GB的空間,而不是每個(gè)任務(wù)有單獨(dú)的4G虛擬空間。 所有的尋址都是32位地址的方式,因此程序模塊間可以很容易的共享變量和數(shù)據(jù)。3.6匯編語(yǔ)言編程內(nèi)存模式 在uClinux環(huán)境下,1023.6匯編語(yǔ)言編程StrongARM&ARM7---------寄存器名字類(lèi)型說(shuō)明r0~r14通用寄存器f0~f7浮點(diǎn)寄存器pc指令指針ps機(jī)器狀態(tài)寄存器fps浮點(diǎn)狀態(tài)寄存器3.6匯編語(yǔ)言編程StrongARM&ARM7-----1033.6匯編語(yǔ)言編程StrongARM&ARM7---------如何在匯編模塊中調(diào)用C語(yǔ)言模塊中的函數(shù)
在調(diào)用C函數(shù)之前,必須在當(dāng)前棧中空出至少8個(gè)字節(jié)的空間,然后才調(diào)用C函數(shù)。C函數(shù)的第一個(gè)參數(shù)(最左邊的參數(shù))用r0傳遞,后面的參數(shù)依次用r1、r2等來(lái)傳遞。例如:假定C函數(shù)為intget_sum(intvar1,intvar2),則在匯編程序中首先將參數(shù)送到r0、r1中,然后將棧指針減8,最后調(diào)用get_sum。注意:C函數(shù)名在匯編中使用時(shí)不用加下劃線3.6匯編語(yǔ)言編程StrongARM&ARM7-----1043.6匯編語(yǔ)言編程StrongARM&ARM7---------注釋符號(hào)以“@”開(kāi)頭的程序行是注釋行。3.6匯編語(yǔ)言編程StrongARM&ARM7-----1053.6匯編語(yǔ)言編程StrongARM&ARM7---------一般程序.title“example”.data.globalvar1var1:.long0x897678,0x2378789.byte89,56,23.string“hello”.bss.globalzero_varzero_var:.short0,0,0.long0,0,0,03.6匯編語(yǔ)言編程StrongARM&ARM7-----1063.6匯編語(yǔ)言編程StrongARM&ARM7---------一般程序.textUART1INIT_TEST:ldrr3,=SYSCON1ldrr0,[r3]tstr0,#UART1ENbeq2f1:ldrr1,[r3]tstr1,#UTXFF1bne1b2:bicr0,r0,#UART1ENstrr0,[r3]bicr0,r0,#SIREN3.6匯編語(yǔ)言編程StrongARM&ARM7-----1073.6匯編語(yǔ)言編程StrongARM&ARM7---------一般程序strr0,[r3]orrr0,r0,#UART1ENstrr0,[r3]ldrr3,=SYSFLG2ldrr0,[r3]andr0,r0,#0x40movpc,lr.section“.mytext”,“ax”.globalu1b_setu1b_set:ldrr3,=UBLCR1strr0,[r3]movpc,lr.end3.6匯編語(yǔ)言編程StrongARM&ARM7-----108
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介1093.7簡(jiǎn)單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-1用ARM指令實(shí)現(xiàn)的C賦值語(yǔ)句:x=(a+b)-c可以用r0表示a、rl表示b、r2表示c和r3表示x,用r4作為間接尋址寄存器。ADRr4,a ;讀取變量a的地址LDRr0,[r4] ;讀a的內(nèi)容到r0ADRr4,b ;讀取變量b的地址LDRrl,[r4];讀b內(nèi)容到r1ADDr3,r0,rl ;a+b的結(jié)果保存在r3ADRr4,c ;讀取變量c的地址LDRr2,[r4] ;讀c的內(nèi)容到r2SUBr3,r3,r2 ;(a+b)-c結(jié)果保存到r3ADRr4,x ;讀x的地址STRr3,[r4] ;保存變量x3.7簡(jiǎn)單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-1用ARM指令實(shí)現(xiàn)的1103.7簡(jiǎn)單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-2
用ARM指令實(shí)現(xiàn)的C賦值語(yǔ)句:z=(a<<2)|(b&15)可以使用r0表示a和z,r1表示b,r4表示地址進(jìn)行編碼
ADRr4,a;讀取變量a的地址到r4LDRr0,[r4];讀a的內(nèi)容到r0MOVr0,r0,LSL2;實(shí)現(xiàn)a<<2操作,結(jié)果保存在r0ADRr4,b;讀取變量b的地址到r4LDRrl,[r4];讀b的內(nèi)容到r1ANDr1,r1,#15;實(shí)現(xiàn)b&15操作,結(jié)果保存在r1中ORRrl,r0,rl;計(jì)算z的結(jié)果ADRr4,z;讀取變量z的地址到r4STRrl,[r4];保存變量z
3.7簡(jiǎn)單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-2用ARM指令實(shí)現(xiàn)的1113.7簡(jiǎn)單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-3在ARM中實(shí)現(xiàn)下面if語(yǔ)句:if(a<b){x=5;y=c+d:}elsex=c-d;
實(shí)現(xiàn)上述指令的第一種方法比較傳統(tǒng)并且和其他微處理器相似。下列指令使用條件分支和無(wú)條件數(shù)據(jù)操作:3.7簡(jiǎn)單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-3在ARM中實(shí)現(xiàn)下面i1123.7簡(jiǎn)單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-4在ARM中實(shí)現(xiàn)C的switch語(yǔ)句C中的switch語(yǔ)句采用下列形式:switch(test){case0:...break;case1:...break;}
上述語(yǔ)句也可以像if語(yǔ)句那樣編碼,首先測(cè)試test=A,然后測(cè)試test=B,依此類(lèi)推.3.7簡(jiǎn)單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-4在ARM中實(shí)現(xiàn)C的s1133.7簡(jiǎn)單程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)例3-5用ARM指令實(shí)現(xiàn)FIR過(guò)濾器FIR(finiteimpulserresponse)過(guò)濾器是一種處理信號(hào)的常用方法;FIR過(guò)濾器是簡(jiǎn)單的對(duì)積求和:∑cixi1≤i≤n作為過(guò)濾器使用時(shí),xi假定為周期性采集的數(shù)據(jù)樣品,ci是系數(shù)。3.7簡(jiǎn)單程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)例3-5用ARM指令實(shí)現(xiàn)FI114這種表示假定樣品是周期性采集而來(lái)的,每次一個(gè)新的樣品到來(lái)都要重新計(jì)算一次FIR過(guò)濾器的輸出。△方框表示存儲(chǔ)剛剛到來(lái)的樣品產(chǎn)生xi時(shí)延元素。延遲的樣品分別單獨(dú)與c相乘,然后求和得到過(guò)濾器的輸出fΔΔΔΔΣc1c2c3c4x1x2x3x4這種表示假定樣品是周期性采集而來(lái)的,每次一個(gè)1153.7簡(jiǎn)單程序設(shè)計(jì)子程序設(shè)計(jì)
每個(gè)C函數(shù)返回一個(gè)值(除非它的返回類(lèi)型是void);一般把不返回值的結(jié)構(gòu)稱(chēng)為子例程或過(guò)程。3.7簡(jiǎn)單程序設(shè)計(jì)子程序設(shè)計(jì)每個(gè)C函數(shù)返回一個(gè)116
第3章目錄★1GNUGCC簡(jiǎn)介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語(yǔ)言編程★7簡(jiǎn)單程序設(shè)計(jì)★8混合語(yǔ)言編程第3章目錄★1GNUGCC簡(jiǎn)介1173.8混合語(yǔ)言編程
匯編語(yǔ)言與C/C++的混合編程通常有以下幾種方式:在C/C++代碼中嵌入?yún)R編指令;在匯編程序和C/C++的程序之間進(jìn)行變量的互訪;匯編程序、C/C++程序間的相互調(diào)用。3.8混合語(yǔ)言編程 匯編語(yǔ)言與C/C++的混合編程通常有以下118如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的語(yǔ)法__asm {指令[;指令]/*注釋*/ …… [指令] }
如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------119如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的語(yǔ)法例3-6使能/禁能IRQ中斷__inlinevoidenable_IRQ(void){inttmp;__asm//嵌入?yún)R編代碼{MRStmp,CPSR//讀取CPSR的值BICtmp,tmp,#0x80MSR CPSR_c,tmp}}如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------120如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的語(yǔ)法例3-6使能/禁能IRQ中斷__inlinevoiddisable_IRQ(vold)inttmp;__asm{MRStmp,CPSRORRtmp,tmp,#0x80MSRCPSR_c,tmp}}如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------121如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的指令用法(1)操作數(shù)內(nèi)嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C表達(dá)式。(2)物理寄存器內(nèi)嵌匯編中使用物理寄存器有以下限制:不能直接向PC寄存器賦值使用物理寄存器的指令中,不要使用過(guò)于復(fù)雜的C表達(dá)式。編譯器可能會(huì)使用R12或R13存放編譯的中間結(jié)果通常內(nèi)嵌的匯編指令中不要指定物理寄存器,如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------122如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的指令用法(3)常量。在內(nèi)嵌匯編指令中,常量前面的“#”可以省略。(4)指令展開(kāi)。內(nèi)嵌的匯編指令中,如果包含常量操作數(shù),則該指令有可能被內(nèi)嵌匯編器展開(kāi)成幾條指令。(5)標(biāo)號(hào)。C程序中的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用。但是只有指令B可以使用C程序中的標(biāo)號(hào),而指令BL則不能使用。如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------123如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的指令用法(6)內(nèi)存單元的分配。所有的內(nèi)存分配均由C編譯器完成,分配的內(nèi)存單元通過(guò)變量供內(nèi)嵌匯編器使用。內(nèi)嵌匯編器不支持內(nèi)嵌匯編程序中用于內(nèi)存分配的偽指令。如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------124如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編的指令用法(7)SWI和BL指令。在內(nèi)嵌的SWI和BL指令中,除了正常的操作數(shù)域外,還必須增加以下3個(gè)可選的寄存器列表:
第1個(gè)寄存器列表中的寄存器用于輸入的參數(shù)。第2個(gè)寄存器列表中的寄存器用于存儲(chǔ)返回的結(jié)果。第3個(gè)寄存器列表中的寄存器的內(nèi)容可能被被調(diào)用的子程序破壞,即這些寄存器是供被調(diào)用的子程序作為工作寄存器。如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------125如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程-----------內(nèi)嵌匯編器與armasm匯編器的差異內(nèi)嵌匯編器不支持通過(guò)“.”指示符或PC獲取當(dāng)前指令地址不支持“LDRRn,=expr”偽指令,而使用“MOVRn,expr”指令向寄存器賦值;不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令;不支持BX指令;不能向PC賦值。使用0x前綴代替“&”,表示十六進(jìn)制數(shù)。當(dāng)使用8位移位常數(shù)導(dǎo)致CPSR的ALU標(biāo)志更新時(shí),N、Z、C和V標(biāo)志中的C不具有真實(shí)意義。如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言3.8混合語(yǔ)言編程--------1263.8混合語(yǔ)言編程如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(1)必須小心使用物理寄存器.如R0~R3、PC、LR和CPSR中的N、Z、C和V標(biāo)志位,因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時(shí),可能會(huì)使用這些物理寄存器,并會(huì)修改N、Z、C和V標(biāo)志位。例如: __asm {MOVvar,x ADDy,var,x/y } 計(jì)算x/y時(shí)R0會(huì)被修改。內(nèi)嵌匯編器探測(cè)到隱含的寄存器沖突就會(huì)報(bào)錯(cuò)。3.8混合語(yǔ)言編程如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言--------1273.8混合語(yǔ)言編程如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(2)不要使用寄存器代替變量。例如: intbad_f(intx)//
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥劑學(xué)實(shí)驗(yàn)技能試題及答案
- 財(cái)務(wù)與稅務(wù)的協(xié)同管理試題及答案
- 難點(diǎn)突破計(jì)算機(jī)二級(jí)考試試題及答案
- 高級(jí)健身試題庫(kù)及答案大全
- 高一美術(shù)鑒賞試題及答案
- 計(jì)算機(jī)二級(jí)考試信息技術(shù)應(yīng)用試題及答案
- 預(yù)測(cè)2025年公共衛(wèi)生執(zhí)業(yè)醫(yī)師考試試題及答案趨勢(shì)
- 藥劑E-learning學(xué)習(xí)方式試題及答案
- 黑龍江省佳木斯市建三江一中2025年高考適應(yīng)性考試物理試卷含解析
- 安全法律法規(guī)試題試卷及答案解析
- 《古羅馬人的數(shù)字》課件
- 2022-2023學(xué)年上海市徐匯區(qū)世界外國(guó)語(yǔ)中學(xué)八年級(jí)(下)期中物理試卷
- 注塑工藝培訓(xùn)-課件
- 羅馬書(shū)1-3講-羅馬書(shū)的背景原因引言-唐崇榮牧師
- 釣魚(yú)中各種氨基酸誘食劑說(shuō)明書(shū)及使用方法
- 會(huì)計(jì)事務(wù)所內(nèi)控審計(jì)所需資料清單
- 【電氣專(zhuān)業(yè)】15D501建筑物防雷設(shè)施安裝
- 2023年考研考博-考博英語(yǔ)-西安電子科技大學(xué)考試歷年真題摘選含答案解析
- Excel水力計(jì)算展示-棱柱體渠道水面線計(jì)算演示
- 林則徐課件完整版
- UPS蓄電池安裝施工方案(完整版無(wú)需過(guò)多修改)
評(píng)論
0/150
提交評(píng)論