版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及運用主講人:李巖哈爾濱理工大學計算機學院.本章主要內容:(1)GCC編譯過程(2)C/C+交叉編譯器arm-elf-gcc(3)交叉匯編器 arm-elf-as (4)交叉銜接器arm-elf-l d(5)工程管理器make(6)匯編言語編程(7)混合編程. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程. 第 3 章 目錄1 GNU GCC簡介2
2、C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.1 GNU GCC簡介 GNU集成編譯環(huán)境GCC(GNU Compiler Collection)是一種面向嵌入式領域、支持多種編程言語、支持多種CPU的交叉編譯工具。 輸出預處置后的C/C+源程序展開頭文件和交換宏輸出C/C+源程序的匯編代碼輸出二進制目的文件生成靜態(tài)庫生成可執(zhí)行程序轉換文件格式GNU GCC的根本功能.3.1 GNU GCC簡介GCC組成-C/C+交叉編譯器arm-elf
3、-gcc arm-elf-gcc是編譯的前端程序,它經(jīng)過調用其他程序來實現(xiàn)將程序源文件編譯成目的文件的功能。 arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足用戶的各種編譯需求。.3.1 GNU GCC簡介GCC組成-匯編器 arm-elf-as arm-elf-as將匯編言語程序轉換為ELF (Executable and Linking Format,執(zhí)行時鏈接文件格式)格式的可重定位目的代碼,這些目的代碼同其它目的模塊或函數(shù)庫易于定位和鏈接。闡明:arm-elf-as產生一個交叉參考表和一個規(guī)范的符號表,產生的代碼和數(shù)據(jù)可以放在多個區(qū) (Section)中。.3.1
4、 GNU GCC簡介GCC組成-銜接器arm-elf-ld arm-elf-gcc是編譯的前端程序,arm-elf-ld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目的模塊鏈接成一個單一的、絕對定位的目的程序。.3.1 GNU GCC簡介GCC組成-庫管理器arm-elf-ar arm-elf-ar將多個可重定位的目標模塊歸檔為一個函數(shù)庫文件。.3.1 GNU GCC簡介GCC組成-工程管理器MAKE arm-elf-gcc Make是用于自動編譯、鏈接程序的適用工具,運用make后就不需求手工的編譯每個程序文件。要運用make,首先要編寫make
5、file。 Makefile描畫程序文件之間的依賴關系,并提供更新文件的命令。.3.1 GNU GCC簡介GCC組成-其他適用程序 arm-elf-objcopy目的文件格式轉換工具等;.3.1 GNU GCC簡介GCC編譯程序的根本過程 arm-elf-gcc根據(jù)輸入文件的后綴來確定文件的類型,然后根據(jù)用戶的編譯選項包括優(yōu)化選項、調試信息選項等將其編譯成相應的匯編暫時文件后綴為.s; arm-elf-as將該匯編文件編譯成目的文件后綴為.o; arm-elf-ld 根據(jù)用戶的鏈接選項包括指定鏈接命令文件等將目的文件和各種庫鏈接起來生成可執(zhí)行文件。程序的編譯過程.C/C+源文件Arm-elf-
6、gcc頭文件匯編文件Arm-elf-as目的文件源文件列表生成庫銜接命令文件可重定位模塊Arm-eif-ldArm-elf-ar用戶庫庫列表可執(zhí)行程序. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令格式 arm-elf-gcc options file在命令arm-elf-gcc后面跟一個或多個選項,選項間用空格隔開,然后跟一個或多個目的文
7、件。例如,將test.c 編譯成目的文件test.o 并且生成調試信息: arm-elf-gcc g c o test.o test.c .概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-c 將輸入的源文件編譯成目的文件-S 將C/C+文件生成匯編文件-o file 將輸出內容存于文件file-pipe 在編譯的不同階段之間采用管道通訊方式-v 打印出編譯過程中執(zhí)行的命令-x language闡明文件的輸入類型為language輸出控制選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-ansi 支持一切ANSI C程序C言語選項:.概述3.2 C/
8、C+交叉編譯器arm-elf-gcc-命令選項列表-w 封鎖一切警告-Wall 翻開一切警告-Wimplicit 假設有隱含聲明,顯示警告信息-Wno-implicit 不顯示對隱含聲明的警告警告選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-g 在文件中產生調試信息(調試信息的文件格式有stabs、COFF、XCOFF、DWARF)調試選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-O0 不優(yōu)化-O1 一級優(yōu)化-O2 二級優(yōu)化-O3 三級優(yōu)化優(yōu)化選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-E 運轉C的預處
9、置器-C 在運用-E進展預處置時不去掉注釋-D macro 定義宏macro為1-D macro=defn 定義宏macro為defn預處置選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-Wa,option 將選項option傳送 給匯編器匯編選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-命令選項列表-I dir 設置搜索途徑為dir-I- 指定只對 #include “file,有效的頭文件搜索目錄 搜索途徑選項:.概述3.2 C/C+交叉編譯器arm-elf-gcc-源文件類型的識別*.c C源文件*.i 經(jīng)過預處置后的C源文件*.h C頭文件*
10、.ii 經(jīng)過預處置后的C+源文件*.cc C+源文件*.cxx C+源文件*.cpp C+源文件*.CC+源文件*.s 不需求預處置的匯編文件*.S需求預處置的匯編文件arm-elf-gcc可以自動根據(jù)文件名后綴識別文件類型.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如,將test.c編譯成匯編程序并存放于文件test.txt:arm-elf-gcc S o test.txt test.c -o file將輸出內容存于文件file,僅適用于只需一個輸出文件時。-輸出文件名的指定.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如, 將test.c編譯成test.o:a
11、rm-elf-gcc c o test.o test.c -c將輸入的源文件編譯成目的文件。-目的文件的生成.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如,將test.c編譯生成匯編文件test.s:arm-elf-gcc S o test.s test.c -S將C/C+文件生成匯編文件。-將C/C+文件生成匯編文件.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如,對test.c進展預處置并將結果輸出到屏幕:arm-elf-gcc E test.c -E只對源文件進展預處置并且缺省輸出到規(guī)范輸出。-預處置文件的生成.命令運用3.2 C/C+交叉編譯器arm-el
12、f-gcc頭文件的援用有兩種方式: 一種是# include“filename, 一種是# include 。前一種方式的途徑搜索順序是:當前目錄、指定的搜索途徑;后一種方式只搜索指定途徑。-I dir 將目錄dir添加到頭文件搜索目錄列表的第一項。-I- -I-以前用-I指定的頭文件搜索目錄只對 # include“file 有效,對 # include 無效; -I-以后指定的頭文件搜索目錄對以上兩種方式的頭文件都有效。-設置頭文件搜索途徑.命令運用3.2 C/C+交叉編譯器arm-elf-gcc頭文件的援用有兩種方式: 一種是# include“filename, 一種是# includ
13、e 。前一種方式的途徑搜索順序是:當前目錄、指定的搜索途徑;后一種方式只搜索指定途徑。-I dir-I-設置頭文件搜索途徑例如,編譯test.c,在當前目錄和/include中搜索test.c所包含的頭文件: arm-elf-gcc I ./ I/include c test.c.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如,假設有隱含聲明,顯示警告信息:arm-elf-gcc c Wimplicit test.c不顯示對隱含聲明的警告:arm-elf-gcc c Wnoimplicit test.c常用的警告選項有:-w 封鎖一切警告信息。-Wall 翻開一切警告信息。 可以
14、運用以-W開頭的不同選項對特定警告進展設定。對于每種警告類型都有相應以-Wno-開場的選項封鎖警告。-控制警告產生.命令運用3.2 C/C+交叉編譯器arm-elf-gcc-O1 可以部分減小代碼尺寸,對運轉速度有一定的提高。較多地運用了存放器變量,提高指令的并行度。-O2 除了解循環(huán)、函數(shù)插裝和靜態(tài)變量優(yōu)化,幾乎包含arm-elf-gcc一切優(yōu)化選項。普通在生成固化代碼時運用該選項較為適宜。-O3 包含-O2的一切優(yōu)化,并且還包含了解循環(huán)、函數(shù)插裝和靜態(tài)變量優(yōu)化。通常情況下,該級優(yōu)化生成的代碼執(zhí)行速度最快,但是代碼尺寸比-O2大一些。 arm-elf-gcc支持多種優(yōu)化選項,總體上劃分為三級
15、優(yōu)化:-實現(xiàn)優(yōu)化.命令運用3.2 C/C+交叉編譯器arm-elf-gcc例如:編譯test.c并且預定義宏 RUN_CACHE 值為1: arm-elf-gcc c D RUN_CACHE test.c編譯test.c并且預定義宏 RUN_CACHE 值為0: arm-elf-gcc c D RUN_CACHE=0 test.c-D macro定義宏macro為1。-D macro=defn 定義宏macro為defn。-在命令行定義. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5 交叉匯編器
16、 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.概述3.2 交叉銜接器arm-elf-ld -命令格式arm-elf-ld option file命令行后跟選項和可重定位的目的文件名。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接的庫為libxxx.a,生成內存映象文件map.txt,鏈接定位文件為linkcmds,那么命令如下:arm-elf-ld -Map map.txt -T linkcmds -L./lib o demo.elf demo.o lxxx.概述3.2 交叉銜接器arm-elf-ld -命令選項列表-e entry指定程序入口-
17、M輸出鏈接信息-lar指定鏈接庫-L dir添加搜索途徑-o設置輸出文件名-Tcommandfile指定鏈接命令文件-v顯示版本信息-Map制定輸出映像文件.命令運用 3.2 交叉銜接器arm-elf-ld -程序入口地址-e entry以符號entry作為程序執(zhí)行的入口地址,而不從默許的入口地址開場。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,將入口地址設為_start,命令如下:arm-elf-ld T linkcmds e _start o demo.elf demo.o.命令運用 3.2 交叉銜接器arm-elf-ld -輸出鏈接信息
18、-M在規(guī)范端口打印出符號映象表和內存分布信息。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,在規(guī)范端口打印出符號映象表和內存分布信息,命令如下:arm-elf-ld M o demo.elf demo.o假設規(guī)范輸出設置為顯示器,運轉命令后將在顯示器上顯示內存映象信息和符號映象表。 .命令運用 3.2 交叉銜接器arm-elf-ld -輸出鏈接信息-Map mapfile將鏈接的符號映象表和內存分布信息輸出到文件mapfile里。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將鏈接的符號映象表和內存分布信息輸出到文件map.txt里,命令如下:arm-elf
19、-ld Map map.txt o demo.elf demo.o.命令運用 3.2 交叉銜接器arm-elf-ld -指定鏈接的庫出-lar指定庫文件libar.a為鏈接的庫??梢苑磸瓦\用-l來指定多個鏈接的庫。例如:鏈接的輸入文件為demo.o,指定libxxx.a為鏈接的庫,輸出文件為demo.elf,命令如下:arm-elf-ld o demo.elf demo.o lxxx.命令運用 3.2 交叉銜接器arm-elf-ld -添加庫和腳本文件的搜索途徑-Ldir將dir添加到搜索途徑。例如:例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將/lib添加到庫的搜索途徑,
20、命令如下:arm-elf-ld -L./lib o demo.elf demo.o .命令運用 3.2 交叉銜接器arm-elf-ld -設置輸出文件的名字-o output將輸出文件名字設定為output。假設不指定輸出文件名,arm-elf-ld生成文件名默以為a.out。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,命令如下:arm-elf-ld o demo.elf demo.o.linkcmds銜接命令文件3.2 交叉銜接器arm-elf-ld -調用linkcmds 首先寫一個鏈接命令文件linkcmds,然后在arm-elf-ld的命令中運用-T linkcmd
21、s參數(shù),就能在鏈接時自動調用linkcmds文件例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,那么命令如下:arm-elf-ld T linkcmds o demo.elf demo.o.linkcmds銜接命令文件3.2 交叉銜接器arm-elf-ld -編寫linkcmds arm-elf-ld的命令言語是一種描畫性的腳本言語,它主要運用于控制:有哪些輸入文件、文件的格式怎樣、輸出文件中的模塊怎樣規(guī)劃、分段的地址空間怎樣分布、以及未初始化的數(shù)據(jù)段怎樣處置等。 用命令言語寫成的文件(通常稱為linkcmds)具有可重用性,不用每次在命令行輸入
22、一大堆命令選項.并且對于不同的運用,只需對linkcmds進展簡單的修正就可以運用。.linkcmds銜接命令文件3.2 交叉銜接器arm-elf-ld -編寫linkcmds (1)arm-elf-ld命令言語2表達式3linkcmds的構造4對程序入口的闡明5對程序頭的闡明6對內存規(guī)劃的闡明7對分段的闡明8注釋. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.3工程管理器 make 概述-命令格式 make
23、 -f makefile option targetmake命令后跟-f選項,指定makefile的名字為makefile;option表示make的一些選項;target是make指定的目的,在3.4.3將詳細闡明。例如:makefile的名字是my_hello_make:make f my_hello_make.3.3工程管理器 make 概述-命令選項列表-f指定makefile-e使環(huán)境變量優(yōu)先于makefile的變量-I dir設定搜索目錄-i忽略make過程中一切錯誤-n只顯示執(zhí)行過程,而不真正執(zhí)行-r使隱含規(guī)那么無效-w顯示任務目錄-C dir讀取makefile設置的任務目錄-
24、s不顯示執(zhí)行的命令 .3.3工程管理器 make 命令運用-指定makefile-f makefile用該選項指定makefile的名字為makefile。假設make中多次運用-f指定多個makefile,那么一切makefile將鏈接起來作為最后的makefile。假設不指定makefile,make默許的makefile依次為“makefile、“Makefile。例如:make f my_hello_make.3.3工程管理器 make 命令運用-指定環(huán)境變量優(yōu)先于makefile 文件中的變量-e使環(huán)境變量優(yōu)先于makefile文件中的變量。例如: make e.3.3工程管理器 m
25、ake 命令運用-指定包含文件的搜索途徑-I dir指定在解析makefile文件中的.include時的搜索途徑為dir。假設有多個途徑,將按輸入順序依次查找。例如: make I/include/mk.3.3工程管理器 make 命令運用-忽略錯誤-i忽略make執(zhí)行過程中的一切錯誤。例如: make i.3.3工程管理器 make 命令運用-顯示命令的執(zhí)行過程-n只顯示命令的執(zhí)行過程而不真正執(zhí)行。例如: make n.3.3工程管理器 make 命令運用-使隱含規(guī)那么無效 -r使make的隱含規(guī)那么無效,去除后綴名規(guī)那么中默許的后綴清單。例如: make r.3.3工程管理器 make
26、命令運用-顯示執(zhí)行過程中的任務目錄 -w顯示make執(zhí)行過程中的任務目錄。例如: make w.3.3工程管理器 make 命令運用-讀取makefile文件前設置任務 目錄-C dir在讀取makefile文件以前將任務目錄改動為dir,完成make后改回原來的目錄。例如: make C bsp.3.3工程管理器 make 命令運用-不顯示所執(zhí)行的命令-s運轉make時用選項-s可以不顯示執(zhí)行的命令,只顯示生成的結果文件。例如: make s.3.3工程管理器 make 編寫一個makefile -makefile的構造makefile文件包含: 顯式規(guī)那么 隱含規(guī)那么 變量定義 指令 注釋
27、.3.3工程管理器 make 編寫一個makefile -編寫makefile 中的規(guī)那么targets :dependenciescommand或者targets :dependencies ;commandcommand指定目的名,通常是一個程序產生的目的文件名,也能夠是執(zhí)行一個動作的名字,名字之間用空格隔開。描畫產生target所需的文件,一個target通常依賴于多個dependency。用于指定該規(guī)那么的命令。.3.3工程管理器 make 編寫一個makefile 例如:smcinit:smc.o config.oarm-elf-ar ruvs o smcinit.a smc.o c
28、onfig.osmc.o:smc.c include.harm-elf-gcc c o smc.o smc.cconfig.o:config.c include.harm-elf-gcc c o config.o config.cclean:rm *.o 表示目的名的有smcinit、smc.o、config.o。smcinit依賴于smc.o和config.o,而smc.o又依賴于smc.c和include.h,config.o依賴于config.o和include.h. 各目的分別由命令arm-elf-ar ruvs o smcinit.a smc.o config.o;arm-elf-g
29、cc c o smc.o smc.c;arm-elf-gcc c o config.o config.c來生成。clean為一動作名,刪除一切后綴為.o的文件。 -編寫makefile 中的規(guī)那么.3.3工程管理器 make 編寫一個makefile -makef調用makefile中的規(guī)那么在默許情況下,make運轉不是以“.開頭的第一條規(guī)那么。在上面的例子中,make默許執(zhí)行的是規(guī)那么smcinit,此時只需求輸入命令: makemake將讀入makefile,然后執(zhí)行第一條規(guī)那么,例子中該規(guī)那么是鏈接目的文件生成庫,因此必需執(zhí)行規(guī)那么smcinit依賴的規(guī)那么smc.o和config.o
30、。在執(zhí)行過程中將自動更新他們所依賴的文件。有些規(guī)那么不是被依賴的規(guī)那么,需求make指定才干被運轉,如上面的例子中的clean規(guī)那么可以這樣執(zhí)行:make clean這兩種方式的結果一樣。只是第一種方式?jīng)]指明目的名,第二種方式指明了目的名。.3.3工程管理器 make 編寫一個makefile -設置makefile中文件的搜索途徑 在makefile中,可以經(jīng)過給VPATH賦值來設置規(guī)那么中目的文件和依賴文件的搜索目錄。make首先搜索當前目錄,假設未找到依賴的文件,make將按照VPATH中給的目錄依次搜索。.3.3工程管理器 make 編寫一個makefile -如何定義變量在makef
31、ile中變量可以被這樣定義:CC = arm-elf-gccAS := arm-elf -asAR = arm-elf -arLIBPATH := ./lib從上面的定義中可以看出,有兩種定義變量的方式: 變量名 = 值 變量名:= 值 為了簡化makefile以及減少不用要的錯誤,可以用變量的方式來代表目的文件名或字符串,在需求運用時直接調用變量。.3.3工程管理器 make 編寫一個makefile -援用變量有兩種方式:$VarName$(VarName)兩種方式的效果一樣。VarName表示變量名。.3.3工程管理器 make 編寫一個makefile -make提供的常用變量例如:d
32、emo.o : demo.c demo.h$CC $CFLAGS $ -o $的值為demo.c,$的值為demo.o,而$的值為demo.c demo.h。 $表示目的名$ 表示一切的依賴文件$*.o的隱含規(guī)那么為:%.o:%.c$CC $CFLAGS $*.o的隱含規(guī)那么為: %.o:%.s$AS $ASFLAGS $ -o $隱含規(guī)那么是指由make自定義的規(guī)那么,常用的有: 由*.c的文件生成*.o的文件 由*.s的文件生成*.o的文件 . 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5
33、交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.5 交叉匯編器 arm-elf-as概述-命令格式arm-elf-as option asmfile在命令arm-elf-as后面跟一個或多個選項,以及該選項的子選項,選項間用空格隔開,然后跟匯編源文件名。例如:將demo.s編譯成目的文件,并且設置頭文件的搜索目錄為C:demoinclude:arm-elf-as I/c/demo/include demo.s.3.5 交叉匯編器 arm-elf-as概述-命令選項列表-adhlns顯示arm-elf-as信息-f不進展預處置-I path設置頭文件搜索途徑
34、-o設定輸出文件名-v顯示版本信息-W不顯示警告提示-Z不顯示錯誤提示.3.5 交叉匯編器 arm-elf-as命令運用-生成目的文件 每次運轉arm-elf-as只輸出一個目的文件,默許形狀下名字為a.out。 可以經(jīng)過-o選項指定輸出文件名字,通常都以.o為后綴。例如:編譯demo.s輸出目的文件demo.o:arm-elf-as o demo.o demo.s.3.5 交叉匯編器 arm-elf-as命令運用-設置頭文件搜索途徑-I path添加途徑path到arm-elf-as的搜索途徑,搜索.include file 指示的文件。-I可以被運用多次以添加多個目錄,當前任務目錄將最先被
35、搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當前目錄和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s .3.5 交叉匯編器 arm-elf-as命令運用-顯示arm-elf-as信息內容-adhlns翻開arm-elf-as信息顯示。dhlns為其子選項,分別表示:d 不顯示調試信息h 顯示源碼信息l 顯示匯編列表n不進展格式處置s 顯示符號列表.3.5 交叉匯編器 arm-elf-as命令運用-設置目的文件名字-I path添加途徑path到arm-elf-as的搜索途徑,搜索.include
36、file 指示的文件。-I可以被運用多次以添加多個目錄,當前任務目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當前目錄和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s .3.5 交叉匯編器 arm-elf-as命令運用-如何取消警告內容-W加選項-W以后,運轉arm-elf-as就不輸出警告信息。例如:編譯demo.s輸出目的文件demo.o,不輸出警告信息:arm-elf-as W o demo.o demo.s .3.5 交叉匯編器 arm-elf-as命令運用-設置能否進展預處置
37、arm-elf-as內部的預處置程序,完成以下任務:調整并刪除多余空格,刪除注釋,將字符常量改成對應的數(shù)值。例如:編譯demo.s輸出目的文件demo.o,并且編譯時不進展預處置,那么命令如下:arm-elf-as f o demo.o demo.s . 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.6 匯編言語編程匯編言語-根本元素1字符集 匯編中運用以下字符組成源程序的各種語法元素:大寫字母 A Z;小寫字
38、母 a z;數(shù)字 0 9;符號 + - * / = ( ) ; , . : $ & # % _ “ - | ? !。 其中大小寫字母作用不同。.3.6 匯編言語編程匯編言語-根本元素2商定的名字 包括存放器名、指令名字和偽操作符。每一個偽操作符表示一定功能的操作。.3.6 匯編言語編程匯編言語-根本元素2商定的名字 偽操作符可以分為六類: 數(shù)據(jù)定義偽操作符 符號定義偽操作符 程序構造偽操作符 條件匯編偽操作符 宏偽操作符 其他偽操作符.3.6 匯編言語編程匯編言語-根本元素3定義的名字 匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。 標號標號只能由a z 、A Z、0 9、_等字符
39、組成,標號的長度不受限制,大小寫字母有區(qū)別。.3.6 匯編言語編程匯編言語-根本元素3定義的名字 匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。 分段名匯編系統(tǒng)中預定義的分段名有: .text .bss .data .sdata .sbss 等,但是用戶可以本人定義段名,語法如下:.section section_name attribute.3.6 匯編言語編程匯編言語-根本元素3定義的名字 匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。 分段名匯編系統(tǒng)中預定義的分段名有: .text .bss .data .sdata .sbss 等,但是用戶可以本人定義段名,語法
40、如下:.section section_name attribute例如:定義一個可以執(zhí)行的代碼段 .mytext.section .mytext,axmycode.3.6 匯編言語編程匯編言語-根本元素3定義的名字 匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。 宏定義名宏定義的語法如下:.macro macro_name parm1 parmNmacro body.endm.3.6 匯編言語編程匯編言語-根本元素4常數(shù) 二進制數(shù)由0b或者0B開頭,如:0b1000101、 0B1001110;十六進制數(shù)以0 x或者0X開頭,如:0 x4567、 0X10089;八進制數(shù)由0開頭
41、,如:0345、09870;十進制數(shù)以非零數(shù)開頭,如:345、12980.3.6 匯編言語編程匯編言語-根本元素5當前地址數(shù) 當前的地址數(shù)用點號“.表示,在匯編程序中可以直接運用該符號。6表達式 在匯編程序中可以運用表達式,在表達式中可以運用常數(shù)和數(shù)值。 可以運用的運算符有: 前綴運算符號- 取負數(shù) 取補數(shù) 中綴運算符號* / % | & !+ -.3.6 匯編言語編程匯編言語-根本元素7注釋符號 不同芯片的匯編程序中,注釋的符號有所不同,以“開頭的程序行是注釋行。.3.6 匯編言語編程匯編言語-語句1語句類型注釋符號 匯編語句按其作用和編譯的情況分為兩大類:執(zhí)行性語句和闡明性語句。.3.6
42、匯編言語編程匯編言語-語句2數(shù)據(jù)語句 一字節(jié)數(shù)據(jù)定義語句兩字節(jié)數(shù)據(jù)定義語句四字節(jié)數(shù)據(jù)定義語句八字節(jié)數(shù)據(jù)定義單個字串定義多個字串1多個字串2反復數(shù)據(jù)定義.3.6 匯編言語編程匯編言語-語句3列表控制語句 .title “heading在匯編列表中將“heading“作為標題。.list系統(tǒng)遇此語句就輸出列表文件。.3.6 匯編言語編程匯編言語-語句4普通執(zhí)行語句 不同的芯片有不同指令集,見相關的指令手冊。.3.6 匯編言語編程匯編言語-程序構造1程序構造語句 程序構造語句是偽操作符定義的闡明語句,用于闡明程序段的開場、終了以及源程序的終了等。.3.6 匯編言語編程匯編言語-程序構造1程序構造語句
43、 程序構造語句是偽操作符定義的闡明語句,用于闡明程序段的開場、終了以及源程序的終了等。代碼段的開場 .text 數(shù)據(jù)段的開場 .data 源程序的終了 .end.3.6 匯編言語編程匯編言語-程序構造2過程函數(shù)的定義過程的構造如下:過程名:過程體前往語句例如:.align 2.globl uart1_sendch.type uart1_sendch,functionuart1_sendch:ldrr2,=SYSFLG1:ldrr1,r2tstr1,#UTXFF1bne1bldrr2,=UARTDR1strbr0,r2movpc,lr普通情況下,.type 和.align聲明可以缺省。 .3.6
44、 匯編言語編程宏語句與條件編程-等價語句1.equ語句語法: .equ symbol,expression例子: .equ PPC_PC,32*4運用: stwr4,PPC_PC(r1) 2 .set語句與.equ的功能一樣。 .3.6 匯編言語編程宏語句與條件編程-宏定義與宏調用宏定義:.macro macro_name param1 ,param2,.paramN.macro body.endm例如:運用ARM的匯編指令集闡明.macro ROMSEC_patova TTPA, pa_start,va_start,tmp,icldrtmp,=APFIELD_ROMaddTTPA,TTPA,
45、va_start,LSR #18addtmp,tmp,pa_start20:strtmp,TTPA,#4addtmp,tmp,#0 x10000subsic,ic,#1bne 20b.endm.3.6 匯編言語編程宏語句與條件編程-反復塊和源文件的嵌入(1) 反復塊定義:.rept countcontents.endr例如:.rept 2.long 0 x12908.endr等價于:.long 0 x12908.long 0 x12908(2) 源文件的嵌入在一個匯編文件中可以嵌入其它匯編文件,例如匯編頭文件等。方法如下:.include “filename.3.6 匯編言語編程宏語句與條件編
46、程-條件編譯.if expression 表達式為非零那么編譯后面的語句,否那么后面的語句被忽略。.ifdef symbol假設符號被定義那么編譯后面的語句,否那么后面的語句被忽略。.ifndef symbol假設符號未被定義那么編譯后面的語句,否那么后面的語句被忽略。.else表示與前面的if語句的條件相反。.endif表示條件判別終了。.3.6 匯編言語編程宏語句與條件編程-條件編譯例如:.macro sum from=0, to=5 .long from .if to - from sum “(from+1),to .endif.endm運用:sum,5等價于.long 0 .long
47、5條件判別可以嵌套運用,if-else-endif遵照最近匹配的原那么。.3.6 匯編言語編程模塊化程序設計 -全局符號 在模塊中定義的、要被別的模塊運用的符號包括變量名和函數(shù)名都必需被聲明為全局符號。方法如下:.global symbol 在本模塊中要運用其他模塊中的全局符號,可以用.extern symbol的方式聲明,但也可以不用聲明在匯編時自動以為它是其它模塊中的全局符號。.3.6 匯編言語編程模塊化程序設計 -模塊間的符號互用 1匯編模塊與匯編模塊間的調用2匯編模塊調用C言語模塊中的函數(shù)3匯編模塊運用C言語模塊中的變量4C言語模塊調用匯編模塊中的函數(shù) 5C言語模塊運用匯編模塊中的變量
48、.3.6 匯編言語編程內存方式 在 uClinux 環(huán)境下,內存方式為平方式,即整個內存空間最大為4GB。一切義務共享這4GB的空間,而不是每個義務有單獨的4G虛擬空間。一切的尋址都是32位地址的方式,因此程序模塊間可以很容易的共享變量和數(shù)據(jù)。.3.6 匯編言語編程StrongARM&ARM7 -存放器名字類型說 明r0r14通用寄存器f0f7浮點寄存器pc指令指針ps機器狀態(tài)寄存器fps浮點狀態(tài)寄存器.3.6 匯編言語編程StrongARM&ARM7 -如何在匯編模塊中調用C言語模塊中的函數(shù)在調用C函數(shù)之前,必需在當前棧中空出至少8個字節(jié)的空間,然后才調用C函數(shù)。C函數(shù)的第一個參數(shù)最左邊的參
49、數(shù)用r0傳送,后面的參數(shù)依次用r1、r2等來傳送。例如:假定C函數(shù)為int get_sum (int var1,int var2),那么在匯編程序中首先將參數(shù)送到r0、r1中,然后將棧指針減8,最后調用get_sum。留意:C函數(shù)名在匯編中運用時不用加下劃線.3.6 匯編言語編程StrongARM&ARM7 -注釋符號以“開頭的程序行是注釋行。.3.6 匯編言語編程StrongARM&ARM7 -普通程序.title “example.data.global var1var1:.long 0 x897678 ,0 x2378789.byte 89 ,56, 23.string “ hello.
50、bss.global zero_varzero_var:.short 0,0,0.long 0,0,0,0.3.6 匯編言語編程StrongARM&ARM7 -普通程序.textUART1INIT_TEST:ldr r3,=SYSCON1ldr r0,r3tst r0,#UART1ENbeq 2f1:ldr r1,r3tst r1,#UTXFF1bne 1b2:bic r0,r0,#UART1ENstr r0,r3bic r0,r0,#SIREN.3.6 匯編言語編程StrongARM&ARM7 -普通程序str r0,r3orr r0,r0,#UART1ENstr r0,r3ldr r3,=
51、SYSFLG2ldr r0,r3and r0,r0,#0 x40mov pc,lr.section “.mytext , “ax.global u1b_setu1b_set:ldr r3,=UBLCR1str r0,r3mov pc,lr.end. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.7簡單程序設計順序程序設計 例3-1 用ARM指令實現(xiàn)的C賦值語句:x=(a+b)-c 可以用r0表示a、rl表示b、
52、r2表示c和r3表示x,用r4作為間接尋址存放器。ADR r4,a;讀取變量 a 的地址LDR r0,r4;讀a的內容到 r0ADR r4,b;讀取變量b的地址LDR rl,r4 ;讀b內容到 r1ADD r3,r0,rl;a+b 的結果保管在r3ADR r4,c;讀取變量c的地址LDR r2,r4;讀c的內容到r2SUB r3,r3,r2 ;(a+b)-c結果保管到r3ADR r4,x;讀x的地址STR r3,r4 ;保管變量x.3.7簡單程序設計順序程序設計 例3-2 用ARM指令實現(xiàn)的C賦值語句:z=(a2)|(b&15)可以運用r0表示a和z,r1表示b,r4表示地址進展編碼 ADR
53、r4,a ;讀取變量a的地址到r4 LDR r0,r4 ;讀a的內容到r0 MOV r0,r0,LSL 2 ;實現(xiàn)a2 操作,結果保管在r0 ADR r4,b ;讀取變量b的地址到r4 LDR rl,r4 ;讀b的內容到r1 AND r1,r1,#15 ;實現(xiàn)b&15 操作,結果保管在r1中 ORR rl,r0,rl ;計算z的結果 ADR r4,z ;讀取變量z的地址到r4 STR rl,r4 ;保管變量z .3.7簡單程序設計分支程序設計 例3-3在ARM中實現(xiàn)下面if語句: if(ab) x=5; y=c+d: else x=c-d; 實現(xiàn)上述指令的第一種方法比較傳統(tǒng)并且和其他微處置器類
54、似。以下指令運用條件分支和無條件數(shù)據(jù)操作:.3.7簡單程序設計分支程序設計 例3-4在ARM中實現(xiàn)C的switch語句 C中的switch語句采用以下方式: switch(test) case 0:break; case 1:break; 上述語句也可以像if語句那樣編碼,首先測試test=A,然后測試test=B,依此類推.3.7簡單程序設計循環(huán)程序設計 例3-5用ARM指令實現(xiàn)FIR過濾器FIR(finite impulser response)過濾器是一種處置信號的常用方法;FIR過濾器是簡單的對積求和: cixi 1in作為過濾器運用時,xi假定為周期性采集的數(shù)據(jù)樣品,ci是系數(shù)。.
55、這種表示假定樣品是周期性采集而來的,每次一個新的樣品到來都要重新計算一次FIR過濾器的輸出。 方框表示存儲剛剛到來的樣品產生xi時延元素。延遲的樣品分別單獨與c相乘,然后求和得到過濾器的輸出fc1c2c3c4x1x2x3x4.3.7簡單程序設計子程序設計 每個C函數(shù)前往一個值(除非它的前往類型是void);普通把不前往值的構造稱為子例程或過程。. 第 3 章 目錄1 GNU GCC簡介2 C/C+交叉編譯器arm-elf-gcc3 交叉銜接器arm-elf-ld 4 工程管理器 MAKE5 交叉匯編器 arm-elf-as6 匯編言語編程7 簡單程序設計8 混合言語編程.3.8混合言語編程匯編言語與C/C+的混合編程通常有以下幾種方式:在C/C+代碼中嵌入?yún)R編指令;在匯編程序和C/C+的程序之間進展變量的互訪;匯編程序、C/C+程序間的相互調用。.如何在C言語內嵌匯編言語 3.8混合言語編程- 內嵌匯編的語法_asm 指令;指令 *注釋* 指令 .如何在C言語內嵌匯編言語 3.8混合言語
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學生信息道德培養(yǎng)活動設計方案
- 三年級下冊語文綜合能力評估試卷
- 課后托管服務收費標準及合同管理方案
- 企業(yè)心理測評體系建設方案
- 初中英語階段性考試試題解析
- 五年級美術課風箏制作教學設計
- 2023學年初一數(shù)學線上教學方案解析
- 幼兒園安全管理工作手冊
- 電力設備檢修作業(yè)安全操作規(guī)程
- 智能制造生產線調試與運行維護技術
- 2025年急診科面試常見問題及答案
- 北師大版初中九年級下冊數(shù)學3.2圓的對稱性課件
- 建筑起重司索信號工安全操作規(guī)程
- 青光眼病人的健康宣教
- 2024-2025學年天津市河西區(qū)七年級下英語期中考試題(含答案和音頻)
- 商業(yè)地產運營管理手冊
- 哈鐵面試試題及答案
- 質量小品完整版本
- 《家禽的主要傳染病》課件
- 試用期員工轉正申請書(匯編15篇)
- DB22-T5026-2019雙靜壓管樁技術標準
評論
0/150
提交評論