基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用課件_第1頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用課件_第2頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用課件_第3頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用課件_第4頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用課件_第5頁
已閱讀5頁,還剩257頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應用主講人:李巖哈爾濱理工大學計算機學院基于s3c44B0X嵌入式uCLinux系1本章主要內容:(1)GCC編譯過程(2)C/C++交叉編譯器arm-elf-gcc(3)交叉匯編器arm-elf-as(4)交叉連接器arm-elf-ld(5)工程管理器make(6)匯編語言編程(7)混合編程本章主要內容:(1)GCC編譯過程2

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介3

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介43.1GNUGCC簡介

GNU集成編譯環(huán)境GCC(GNUCompilerCollection)是一種面向嵌入式領域、支持多種編程語言、支持多種CPU的交叉編譯工具。

輸出預處理后的C/C++源程序(展開頭文件和替換宏)輸出C/C++源程序的匯編代碼輸出二進制目標文件生成靜態(tài)庫生成可執(zhí)行程序轉換文件格式GNUGCC的基本功能3.1GNUGCC簡介GNU集成編譯環(huán)境53.1GNUGCC簡介GCC組成--------------C/C++交叉編譯器arm-elf-gccarm-elf-gcc是編譯的前端程序,它通過調用其他程序來實現(xiàn)將程序源文件編譯成目標文件的功能。

arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足用戶的各種編譯需求。3.1GNUGCC簡介GCC組成------------63.1GNUGCC簡介GCC組成--------------匯編器arm-elf-as

arm-elf-as將匯編語言程序轉換為ELF(ExecutableandLinkingFormat,執(zhí)行時鏈接文件格式)格式的可重定位目標代碼,這些目標代碼同其它目標模塊或函數(shù)庫易于定位和鏈接。說明:arm-elf-as產(chǎn)生一個交叉參考表和一個標準的符號表,產(chǎn)生的代碼和數(shù)據(jù)能夠放在多個區(qū)(Section)中。3.1GNUGCC簡介GCC組成------------73.1GNUGCC簡介GCC組成--------------連接器arm-elf-ld

arm-elf-gcc是編譯的前端程序,arm-elf-ld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目標模塊鏈接成一個單一的、絕對定位的目標程序。3.1GNUGCC簡介GCC組成------------83.1GNUGCC簡介GCC組成--------------庫管理器arm-elf-ar

arm-elf-ar將多個可重定位的目標模塊歸檔為一個函數(shù)庫文件。3.1GNUGCC簡介GCC組成------------93.1GNUGCC簡介GCC組成--------------工程管理器MAKE

arm-elf-gccMake是用于自動編譯、鏈接程序的實用工具,使用make后就不需要手工的編譯每個程序文件。要使用make,首先要編寫makefile。

Makefile描述程序文件之間的依賴關系,并提供更新文件的命令。3.1GNUGCC簡介GCC組成------------103.1GNUGCC簡介GCC組成-------------其他實用程序

arm-elf-objcopy目標文件格式轉換工具等;3.1GNUGCC簡介GCC組成------------113.1GNUGCC簡介GCC編譯程序的基本過程

arm-elf-gcc根據(jù)輸入文件的后綴來確定文件的類型,然后根據(jù)用戶的編譯選項(包括優(yōu)化選項、調試信息選項等)將其編譯成相應的匯編臨時文件(后綴為.s);

arm-elf-as將該匯編文件編譯成目標文件(后綴為.o);

arm-elf-ld根據(jù)用戶的鏈接選項(包括指定鏈接命令文件等)將目標文件和各種庫鏈接起來生成可執(zhí)行文件。程序的編譯過程3.1GNUGCC簡介GCC編譯程序的基本過程12C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-elf-as目標文件源文件列表生成庫連接命令文件可重定位模塊Arm-eif-ldArm-elf-ar用戶庫庫列表可執(zhí)行程序C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-13

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介14概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令格式

arm-elf-gcc[options]file…在命令arm-elf-gcc后面跟一個或多個選項,選項間用空格隔開,然后跟一個或多個目標文件。例如,將test.c編譯成目標文件test.o并且生成調試信息:arm-elf-gcc–g–c–otest.otest.c概述3.2C/C++交叉編譯器arm-elf-gcc---15概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-c 將輸入的源文件編譯成目標文件-S 將C/C++文件生成匯編文件-ofile將輸出內容存于文件file-pipe在編譯的不同階段之間采用管道通訊方式-v 打印出編譯過程中執(zhí)行的命令-xlanguage 說明文件的輸入類型為language輸出控制選項:概述3.2C/C++交叉編譯器arm-elf-gcc---16概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-ansi支持所有ANSIC程序C語言選項:概述3.2C/C++交叉編譯器arm-elf-gcc---17概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-w關閉所有警告-Wall打開所有警告-Wimplicit如果有隱含申明,顯示警告信息-Wno-implicit不顯示對隱含申明的警告警告選項:概述3.2C/C++交叉編譯器arm-elf-gcc---18概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-g在文件中產(chǎn)生調試信息(調試信息的文件格式有stabs、COFF、XCOFF、DWARF)調試選項:概述3.2C/C++交叉編譯器arm-elf-gcc---19概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-O0不優(yōu)化-O1一級優(yōu)化-O2二級優(yōu)化-O3三級優(yōu)化優(yōu)化選項:概述3.2C/C++交叉編譯器arm-elf-gcc---20概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-E運行C的預處理器-C在運用-E進行預處理時不去掉注釋-Dmacro定義宏macro為1-Dmacro=defn定義宏macro為defn預處理選項:概述3.2C/C++交叉編譯器arm-elf-gcc---21概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-Wa,option將選項option傳遞給匯編器匯編選項:概述3.2C/C++交叉編譯器arm-elf-gcc---22概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項列表-Idir設置搜索路徑為dir-I-指定只對#include“file”,有效的頭文件搜索目錄搜索路徑選項:概述3.2C/C++交叉編譯器arm-elf-gcc---23概述3.2C/C++交叉編譯器arm-elf-gcc------------------源文件類型的識別*.c ——C源文件*.i ——經(jīng)過預處理后的C源文件*.h ——C頭文件*.ii ——經(jīng)過預處理后的C++源文件*.cc ——C++源文件*.cxx ——C++源文件*.cpp ——C++源文件*.C ——C++源文件*.s ——不需要預處理的匯編文件*.S ——需要預處理的匯編文件arm-elf-gcc能夠自動根據(jù)文件名后綴識別文件類型.概述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將輸出內容存于文件file,僅適用于只有一個輸出文件時。-----------輸出文件名的指定命令使用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將輸入的源文件編譯成目標文件。-----------目標文件的生成命令使用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例如,對test.c進行預處理并將結果輸出到屏幕:arm-elf-gcc–Etest.c-E只對源文件進行預處理并且缺省輸出到標準輸出。---------預處理文件的生成命令使用3.2C/C++交叉編譯器arm-elf-gcc例28命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir將目錄dir添加到頭文件搜索目錄列表的第一項。-I--I-以前用-I指定的頭文件搜索目錄只對#include“file”有效,對#include<file>無效;-I-以后指定的頭文件搜索目錄對以上兩種形式的頭文件都有效。---------設置頭文件搜索路徑命令使用3.2C/C++交叉編譯器arm-elf-gcc頭29命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir-I----------設置頭文件搜索路徑例如,編譯test.c,在當前目錄和/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不顯示對隱含申明的警告:arm-elf-gcc–c–Wno–implicittest.c常用的警告選項有:-w關閉所有警告信息。-Wall打開所有警告信息??梢允褂靡?W開頭的不同選項對特定警告進行設定。對于每種警告類型都有相應以-Wno-開始的選項關閉警告。---------控制警告產(chǎn)生命令使用3.2C/C++交叉編譯器arm-elf-gcc例31命令使用3.2C/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)化選項,總體上劃分為三級優(yōu)化:---------實現(xiàn)優(yōu)化命令使用3.2C/C++交叉編譯器arm-elf-gcc-32命令使用3.2C/C++交叉編譯器arm-elf-gcc例如:編譯test.c并且預定義宏RUN_CACHE值為1:arm-elf-gcc–c–DRUN_CACHEtest.c編譯test.c并且預定義宏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簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld

★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介34概述3.2交叉連接器arm-elf-ld

---------命令格式arm-elf-ld[option]file…命令行后跟選項和可重定位的目標文件名。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接的庫為libxxx.a,生成內存映象文件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

---------命令選項列表-eentry 指定程序入口-M 輸出鏈接信息-lar 指定鏈接庫-Ldir 添加搜索路徑-o 設置輸出文件名-Tcommandfile 指定鏈接命令文件-v 顯示版本信息-Map 制定輸出映像文件概述3.2交叉連接器arm-elf-ld--------36命令使用3.2交叉連接器arm-elf-ld

---------程序入口地址-eentry以符號entry作為程序執(zhí)行的入口地址,而不從默認的入口地址開始。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,將入口地址設為_start,命令如下:arm-elf-ld–Tlinkcmds–e_start–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----37命令使用3.2交叉連接器arm-elf-ld

---------輸出鏈接信息-M在標準端口打印出符號映象表和內存分布信息。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,在標準端口打印出符號映象表和內存分布信息,命令如下:arm-elf-ld–M–odemo.elfdemo.o如果標準輸出設置為顯示器,運行命令后將在顯示器上顯示內存映象信息和符號映象表。

命令使用3.2交叉連接器arm-elf-ld-----38命令使用3.2交叉連接器arm-elf-ld

---------輸出鏈接信息-Mapmapfile將鏈接的符號映象表和內存分布信息輸出到文件mapfile里。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將鏈接的符號映象表和內存分布信息輸出到文件map.txt里,命令如下:arm-elf-ld–Mapmap.txt–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----39命令使用3.2交叉連接器arm-elf-ld

---------指定鏈接的庫出-lar指定庫文件libar.a為鏈接的庫??梢灾貜褪褂?l來指定多個鏈接的庫。例如:鏈接的輸入文件為demo.o,指定libxxx.a為鏈接的庫,輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o–lxxx命令使用3.2交叉連接器arm-elf-ld-----40命令使用3.2交叉連接器arm-elf-ld

---------添加庫和腳本文件的搜索路徑-Ldir將dir添加到搜索路徑。例如:例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將/lib添加到庫的搜索路徑,命令如下:arm-elf-ld-L./lib–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----41命令使用3.2交叉連接器arm-elf-ld

---------設置輸出文件的名字-ooutput將輸出文件名字設定為output。如果不指定輸出文件名,arm-elf-ld生成文件名默認為a.out。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----42linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----調用linkcmds首先寫一個鏈接命令文件linkcmds,然后在arm-elf-ld的命令中使用-Tlinkcmds參數(shù),就能在鏈接時自動調用linkcmds文件.例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,則命令如下:arm-elf-ld–Tlinkcmds–odemo.elfdemo.olinkcmds連接命令文件3.2交叉連接器arm-elf43linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----編寫linkcmds

arm-elf-ld的命令語言是一種描述性的腳本語言,它主要應用于控制:有哪些輸入文件、文件的格式怎樣、輸出文件中的模塊怎樣布局、分段的地址空間怎樣分布、以及未初始化的數(shù)據(jù)段怎樣處理等。

用命令語言寫成的文件(通常稱為linkcmds)具有可重用性,不必每次在命令行輸入一大堆命令選項.并且對于不同的應用,只需對linkcmds進行簡單的修改就可以使用。linkcmds連接命令文件3.2交叉連接器arm-elf44linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----編寫linkcmds(1)arm-elf-ld命令語言(2)表達式(3)linkcmds的結構(4)對程序入口的說明(5)對程序頭的說明(6)對內存布局的說明(7)對分段的說明(8)注釋linkcmds連接命令文件3.2交叉連接器arm-elf45

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介463.3工程管理器make

概述---------命令格式

make[-fmakefile][option][target]… make命令后跟-f選項,指定makefile的名字為makefile;option表示make的一些選項;target是make指定的目標,在3.4.3將詳細說明。例如:makefile的名字是my_hello_make: make–fmy_hello_make3.3工程管理器make概述---------命令格式473.3工程管理器make

概述---------命令選項列表-f 指定makefile-e 使環(huán)境變量優(yōu)先于makefile的變量-Idir 設定搜索目錄-i 忽略make過程中所有錯誤-n 只顯示執(zhí)行過程,而不真正執(zhí)行-r 使隱含規(guī)則無效-w 顯示工作目錄-Cdir 讀取makefile設置的工作目錄-s 不顯示執(zhí)行的命令

3.3工程管理器make概述---------命令選項483.3工程管理器make

命令使用---------指定makefile-fmakefile用該選項指定makefile的名字為makefile。如果make中多次使用-f指定多個makefile,則所有makefile將鏈接起來作為最后的makefile。如果不指定makefile,make默認的makefile依次為“makefile”、“Makefile”。例如:make–fmy_hello_make3.3工程管理器make命令使用---------指定493.3工程管理器make

命令使用---------指定環(huán)境變量優(yōu)先于makefile文件中的變量-e使環(huán)境變量優(yōu)先于makefile文件中的變量。例如:

make–e3.3工程管理器make命令使用---------指定503.3工程管理器make

命令使用---------指定包含文件的搜索路徑-Idir指定在解析makefile文件中的.include時的搜索路徑為dir。如果有多個路徑,將按輸入順序依次查找。例如:

make–I/include/mk3.3工程管理器make命令使用---------指定513.3工程管理器make

命令使用---------忽略錯誤-i忽略make執(zhí)行過程中的所有錯誤。例如:

make–i3.3工程管理器make命令使用---------忽略523.3工程管理器make

命令使用---------顯示命令的執(zhí)行過程-n只顯示命令的執(zhí)行過程而不真正執(zhí)行。例如:

make–n3.3工程管理器make命令使用---------顯示533.3工程管理器make

命令使用---------使隱含規(guī)則無效-r使make的隱含規(guī)則無效,清除后綴名規(guī)則中默認的后綴清單。例如:

make–r3.3工程管理器make命令使用---------使隱543.3工程管理器make

命令使用---------顯示執(zhí)行過程中的工作目錄-w顯示make執(zhí)行過程中的工作目錄。例如:

make–w3.3工程管理器make命令使用---------顯示553.3工程管理器make

命令使用---------讀取makefile文件前設置工作目錄-Cdir在讀取makefile文件以前將工作目錄改變?yōu)閐ir,完成make后改回原來的目錄。例如:

make–Cbsp3.3工程管理器make命令使用---------讀取563.3工程管理器make

命令使用---------不顯示所執(zhí)行的命令-s運行make時用選項-s可以不顯示執(zhí)行的命令,只顯示生成的結果文件。例如:

make–s3.3工程管理器make命令使用---------不顯573.3工程管理器make

編寫一個makefile---------makefile的結構makefile文件包含:顯式規(guī)則隱含規(guī)則變量定義指令注釋3.3工程管理器make編寫一個makefile--583.3工程管理器make

編寫一個makefile---------編寫makefile中的規(guī)則targets:dependencies command … 或者 targets:dependencies;command command …指定目標名,通常是一個程序產(chǎn)生的目標文件名,也可能是執(zhí)行一個動作的名字,名字之間用空格隔開。描述產(chǎn)生target所需的文件,一個target通常依賴于多個dependency。用于指定該規(guī)則的命令。3.3工程管理器make編寫一個makefile--593.3工程管理器make

編寫一個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表示目標名的有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–osmcinit.asmc.oconfig.o;arm-elf-gcc–c–osmc.osmc.c;arm-elf-gcc–c–oconfig.oconfig.c來生成。clean為一動作名,刪除所有后綴為.o的文件。

---------編寫makefile中的規(guī)則3.3工程管理器make編寫一個makefile例如603.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。在執(zhí)行過程中將自動更新他們所依賴的文件。有些規(guī)則不是被依賴的規(guī)則,需要make指定才能被運行,如上面的例子中的clean規(guī)則可以這樣執(zhí)行:makeclean這兩種方式的結果一樣。只是第一種方式?jīng)]指明目標名,第二種方式指明了目標名。3.3工程管理器make編寫一個makefile--613.3工程管理器make

編寫一個makefile--------設置makefile中文件的搜索路徑在makefile中,可以通過給VPATH賦值來設置規(guī)則中目標文件和依賴文件的搜索目錄。make首先搜索當前目錄,如果未找到依賴的文件,make將按照VPATH中給的目錄依次搜索。3.3工程管理器make編寫一個makefile--623.3工程管理器make

編寫一個makefile--------如何定義變量在makefile中變量可以被這樣定義: CC=arm-elf-gcc AS:=arm-elf-as AR=arm-elf-ar LIBPATH:=./lib從上面的定義中可以看出,有兩種定義變量的形式:變量名=值變量名:=值為了簡化makefile以及減少不必要的錯誤,可以用變量的形式來代表目標文件名或字符串,在需要使用時直接調用變量。3.3工程管理器make編寫一個makefile--633.3工程管理器make

編寫一個makefile--------引用變量有兩種方式:${VarName}$(VarName)

兩種方式的效果一樣。VarName表示變量名。3.3工程管理器make編寫一個makefile--643.3工程管理器make

編寫一個makefile--------make提供的常用變量例如:demo.o:demo.cdemo.h${CC}${CFLAGS}$<-o$@$<的值為demo.c,$@的值為demo.o,而$^的值為demo.cdemo.h。

$@——表示目標名$^——表示所有的依賴文件$<——第一個依賴文件3.3工程管理器make編寫一個makefile--653.3工程管理器make

編寫一個makefile--------make里的常用函數(shù)常用的函數(shù)有:(1)$(substfrom,to,text)將字text中的from子串替換為to子串。(2)$(patsubstpattern,replacement,text)按模式pattern替換text中的字串。函數(shù)的使用方式有兩種:$(functionarguments)${functionarguments}

3.3工程管理器make編寫一個makefile--663.3工程管理器make

編寫一個makefile--------隱含規(guī)則實際上使用的隱含規(guī)則如下所示:對*.c-->*.o的隱含規(guī)則為:%.o:%.c${CC}${CFLAGS}$<-o$@對于*.s-->*.o的隱含規(guī)則為:%.o:%.s${AS}${ASFLAGS}$<-o$@隱含規(guī)則是指由make自定義的規(guī)則,常用的有:由*.c的文件生成*.o的文件由*.s的文件生成*.o的文件3.3工程管理器make編寫一個makefile--67

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介683.5交叉匯編器arm-elf-as概述---------命令格式arm-elf-as[option…][asmfile…]在命令arm-elf-as后面跟一個或多個選項,以及該選項的子選項,選項間用空格隔開,然后跟匯編源文件名。例如:將demo.s編譯成目標文件,并且設置頭文件的搜索目錄為C:\demo\include:arm-elf-as–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as概述--------693.5交叉匯編器arm-elf-as概述---------命令選項列表-a[dhlns] 顯示arm-elf-as信息-f 不進行預處理-Ipath 設置頭文件搜索路徑-o 設定輸出文件名-v 顯示版本信息-W 不顯示警告提示-Z 不顯示錯誤提示3.5交叉匯編器arm-elf-as概述--------703.5交叉匯編器arm-elf-as命令使用---------生成目標文件每次運行arm-elf-as只輸出一個目標文件,默認狀態(tài)下名字為a.out??梢酝ㄟ^-o選項指定輸出文件名字,通常都以.o為后綴。例如:編譯demo.s輸出目標文件demo.o: arm-elf-as–odemo.odemo.s3.5交叉匯編器arm-elf-as命令使用------713.5交叉匯編器arm-elf-as命令使用---------設置頭文件搜索路徑-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個目錄,當前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------723.5交叉匯編器arm-elf-as命令使用---------顯示arm-elf-as信息內容-a[dhlns]打開arm-elf-as信息顯示。dhlns為其子選項,分別表示:d ——不顯示調試信息h ——顯示源碼信息l ——顯示匯編列表n ——不進行格式處理s ——顯示符號列表3.5交叉匯編器arm-elf-as命令使用------733.5交叉匯編器arm-elf-as命令使用---------設置目標文件名字-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個目錄,當前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------743.5交叉匯編器arm-elf-as命令使用---------如何取消警告內容-W加選項-W以后,運行arm-elf-as就不輸出警告信息。例如:編譯demo.s輸出目標文件demo.o,不輸出警告信息:arm-elf-as–W–odemo.odemo.s

3.5交叉匯編器arm-elf-as命令使用------753.5交叉匯編器arm-elf-as命令使用---------設置是否進行預處理arm-elf-as內部的預處理程序,完成以下工作:調整并刪除多余空格,刪除注釋,將字符常量改成對應的數(shù)值。例如:編譯demo.s輸出目標文件demo.o,并且編譯時不進行預處理,則命令如下:arm-elf-as–f–odemo.odemo.s

3.5交叉匯編器arm-elf-as命令使用------76

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介773.6匯編語言編程匯編語言---------基本元素(1)字符集匯編中使用下列字符組成源程序的各種語法元素:大寫字母A~Z;小寫字母a~z;數(shù)字0~9;符號+-*/=[]();,.:‘@$&#<>{}%_“\-|^?!。其中大小寫字母作用不同。3.6匯編語言編程匯編語言---------基本元素(1)783.6匯編語言編程匯編語言---------基本元素(2)約定的名字包括寄存器名、指令名字和偽操作符。每一個偽操作符表示一定功能的操作。3.6匯編語言編程匯編語言---------基本元素(2)793.6匯編語言編程匯編語言---------基本元素(2)約定的名字偽操作符可以分為六類:數(shù)據(jù)定義偽操作符符號定義偽操作符程序結構偽操作符條件匯編偽操作符宏偽操作符其他偽操作符3.6匯編語言編程匯編語言---------基本元素(2)803.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。①標號標號只能由a~z、A~Z、0~9、.、_等字符組成,標號的長度不受限制,大小寫字母有區(qū)別。3.6匯編語言編程匯編語言---------基本元素(3)813.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語法如下: .sectionsection_nameattribute3.6匯編語言編程匯編語言---------基本元素(3)823.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語法如下: .sectionsection_nameattribute例如:定義一個可以執(zhí)行的代碼段.mytext .section".mytext","ax" mycode …3.6匯編語言編程匯編語言---------基本元素(3)833.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標號、分段名、宏定義名都是用戶可以定義的名字。③宏定義名宏定義的語法如下:.macromacro_nameparm1…parmNmacrobody.endm3.6匯編語言編程匯編語言---------基本元素(3)843.6匯編語言編程匯編語言---------基本元素(4)常數(shù)二進制數(shù)由0b或者0B開頭,如:0b1000101、0B1001110;十六進制數(shù)以0x或者0X開頭,如:0x4567、0X10089;八進制數(shù)由0開頭,如:0345、09870;十進制數(shù)以非零數(shù)開頭,如:345、129803.6匯編語言編程匯編語言---------基本元素(4)853.6匯編語言編程匯編語言---------基本元素(5)當前地址數(shù)當前的地址數(shù)用點號“.”表示,在匯編程序中可以直接使用該符號。(6)表達式在匯編程序中可以使用表達式,在表達式中可以使用常數(shù)和數(shù)值。可以使用的運算符有: ①前綴運算符號 -——取負數(shù) ~——取補數(shù) ②中綴運算符號 */%<<<>>>|&^!+-3.6匯編語言編程匯編語言---------基本元素(5)863.6匯編語言編程匯編語言---------基本元素(7)注釋符號

不同芯片的匯編程序中,注釋的符號有所不同,ARM以“@”開頭的程序行是注釋行。3.6匯編語言編程匯編語言---------基本元素(7)873.6匯編語言編程匯編語言---------語句(1)語句類型注釋符號匯編語句按其作用和編譯的情況分為兩大類:執(zhí)行性語句和說明性語句。3.6匯編語言編程匯編語言---------語句(1)語句883.6匯編語言編程匯編語言---------語句(2)數(shù)據(jù)語句一字節(jié)數(shù)據(jù)定義語句兩字節(jié)數(shù)據(jù)定義語句四字節(jié)數(shù)據(jù)定義語句八字節(jié)數(shù)據(jù)定義單個字串定義多個字串1多個字串2重復數(shù)據(jù)定義3.6匯編語言編程匯編語言---------語句(2)數(shù)據(jù)893.6匯編語言編程匯編語言---------語句(3)列表控制語句①.title“heading” 在匯編列表中將“heading“作為標題。②.list 系統(tǒng)遇此語句就輸出列表文件。3.6匯編語言編程匯編語言---------語句(3)列表903.6匯編語言編程匯編語言---------語句(4)一般執(zhí)行語句不同的芯片有不同指令集,見相關的指令手冊。3.6匯編語言編程匯編語言---------語句(4)一般913.6匯編語言編程匯編語言---------程序結構(1)程序結構語句程序結構語句是偽操作符定義的說明語句,用于說明程序段的開始、結束以及源程序的結束等。3.6匯編語言編程匯編語言---------程序結構(1)923.6匯編語言編程匯編語言---------程序結構(1)程序結構語句程序結構語句是偽操作符定義的說明語句,用于說明程序段的開始、結束以及源程序的結束等。代碼段的開始.text②數(shù)據(jù)段的開始.data③源程序的結束.end3.6匯編語言編程匯編語言---------程序結構(1)933.6匯編語言編程匯編語言---------程序結構(2)過程(函數(shù))的定義過程的結構如下: 過程名: 過程體 返回語句例如:.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匯編語言編程匯編語言---------程序結構(2)943.6匯編語言編程宏語句與條件編程---------等價語句(1).equ語句語法:.equsymbol,expression 例子:.equPPC_PC,32*4 應用:stw r4,PPC_PC(r1)

(2).set語句 與.equ的功能相同。

3.6匯編語言編程宏語句與條件編程---------等價語953.6匯編語言編程宏語句與條件編程---------宏定義與宏調用宏定義:.macromacro_nameparam1,param2,…..paramN .macrobody.endm例如:(使用ARM的匯編指令集說明) .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匯編語言編程宏語句與條件編程---------宏定義963.6匯編語言編程宏語句與條件編程---------重復塊和源文件的嵌入(1)重復塊定義: .reptcount contents .endr例如: .rept2 .long0x12908 .endr等價于: .long0x12908 .long0x12908(2)源文件的嵌入在一個匯編文件中可以嵌入其它匯編文件,例如匯編頭文件等。方法如下:.include“filename”3.6匯編語言編程宏語句與條件編程---------重復塊973.6匯編語言編程宏語句與條件編程---------條件編譯.ifexpression表達式為非零則編譯后面的語句,否則后面的語句被忽略。.ifdefsymbol如果符號被定義則編譯后面的語句,否則后面的語句被忽略。.ifndefsymbol如果符號未被定義則編譯后面的語句,否則后面的語句被忽略。.else表示與前面的if語句的條件相反。.endif表示條件判斷結束。3.6匯編語言編程宏語句與條件編程---------條件編983.6匯編語言編程宏語句與條件編程---------條件編譯例如: .macrosumfrom=0,to=5 .long\from .if\to-\from sum“(\from+1)”,\to .endif .endm應用: sum,5等價于 .long0 …… .long5 條件判斷可以嵌套使用,if-else-endif遵循最近匹配的原則。3.6匯編語言編程宏語句與條件編程---------條件編993.6匯編語言編程模塊化程序設計---------全局符號在模塊中定義的、要被別的模塊使用的符號(包括變量名和函數(shù)名)都必須被聲明為全局符號。方法如下:

.globalsymbol在本模塊中要使用其他模塊中的全局符號,可以用.externsymbol的方式聲明,但也可以不用聲明在匯編時自動認為它是其它模塊中的全局符號。3.6匯編語言編程模塊化程序設計---------全局符1003.6匯編語言編程模塊化程序設計---------模塊間的符號互用

(1)匯編模塊與匯編模塊間的調用(2)匯編模塊調用C語言模塊中的函數(shù)(3)匯編模塊使用C語言模塊中的變量(4)C語言模塊調用匯編模塊中的函數(shù)(5)C語言模塊使用匯編模塊中的變量3.6匯編語言編程模塊化程序設計---------模塊間1013.6匯編語言編程內存模式

在uClinux

環(huán)境下,內存模式為平模式,即整個內存空間最大為4GB。 所有任務共享這4GB的空間,而不是每個任務有單獨的4G虛擬空間。 所有的尋址都是32位地址的方式,因此程序模塊間可以很容易的共享變量和數(shù)據(jù)。3.6匯編語言編程內存模式 在uClinux環(huán)境下,1023.6匯編語言編程StrongARM&ARM7---------寄存器名字類型說明r0~r14通用寄存器f0~f7浮點寄存器pc指令指針ps機器狀態(tài)寄存器fps浮點狀態(tài)寄存器3.6匯編語言編程StrongARM&ARM7-----1033.6匯編語言編程StrongARM&ARM7---------如何在匯編模塊中調用C語言模塊中的函數(shù)

在調用C函數(shù)之前,必須在當前棧中空出至少8個字節(jié)的空間,然后才調用C函數(shù)。C函數(shù)的第一個參數(shù)(最左邊的參數(shù))用r0傳遞,后面的參數(shù)依次用r1、r2等來傳遞。例如:假定C函數(shù)為intget_sum(intvar1,intvar2),則在匯編程序中首先將參數(shù)送到r0、r1中,然后將棧指針減8,最后調用get_sum。注意:C函數(shù)名在匯編中使用時不用加下劃線3.6匯編語言編程StrongARM&ARM7-----1043.6匯編語言編程StrongARM&ARM7---------注釋符號以“@”開頭的程序行是注釋行。3.6匯編語言編程StrongARM&ARM7-----1053.6匯編語言編程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匯編語言編程StrongARM&ARM7-----1063.6匯編語言編程StrongARM&ARM7---------一般程序.textUART1INIT_TEST:ldrr3,=SYSCON1ldrr0,[r3]tstr0,#UART1ENbeq2f1:ldrr1,[r3]tstr1,#UTXFF1bne1b2:bicr0,r0,#UART1ENstrr0,[r3]bicr0,r0,#SIREN3.6匯編語言編程StrongARM&ARM7-----1073.6匯編語言編程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匯編語言編程StrongARM&ARM7-----108

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介1093.7簡單程序設計順序程序設計例3-1用ARM指令實現(xiàn)的C賦值語句:x=(a+b)-c可以用r0表示a、rl表示b、r2表示c和r3表示x,用r4作為間接尋址寄存器。ADRr4,a ;讀取變量a的地址LDRr0,[r4] ;讀a的內容到r0ADRr4,b ;讀取變量b的地址LDRrl,[r4];讀b內容到r1ADDr3,r0,rl ;a+b的結果保存在r3ADRr4,c ;讀取變量c的地址LDRr2,[r4] ;讀c的內容到r2SUBr3,r3,r2 ;(a+b)-c結果保存到r3ADRr4,x ;讀x的地址STRr3,[r4] ;保存變量x3.7簡單程序設計順序程序設計例3-1用ARM指令實現(xiàn)的1103.7簡單程序設計順序程序設計例3-2

用ARM指令實現(xiàn)的C賦值語句:z=(a<<2)|(b&15)可以使用r0表示a和z,r1表示b,r4表示地址進行編碼

ADRr4,a;讀取變量a的地址到r4LDRr0,[r4];讀a的內容到r0MOVr0,r0,LSL2;實現(xiàn)a<<2操作,結果保存在r0ADRr4,b;讀取變量b的地址到r4LDRrl,[r4];讀b的內容到r1ANDr1,r1,#15;實現(xiàn)b&15操作,結果保存在r1中ORRrl,r0,rl;計算z的結果ADRr4,z;讀取變量z的地址到r4STRrl,[r4];保存變量z

3.7簡單程序設計順序程序設計例3-2用ARM指令實現(xiàn)的1113.7簡單程序設計分支程序設計例3-3在ARM中實現(xiàn)下面if語句:if(a<b){x=5;y=c+d:}elsex=c-d;

實現(xiàn)上述指令的第一種方法比較傳統(tǒng)并且和其他微處理器相似。下列指令使用條件分支和無條件數(shù)據(jù)操作:3.7簡單程序設計分支程序設計例3-3在ARM中實現(xiàn)下面i1123.7簡單程序設計分支程序設計例3-4在ARM中實現(xiàn)C的switch語句C中的switch語句采用下列形式:switch(test){case0:...break;case1:...break;}

上述語句也可以像if語句那樣編碼,首先測試test=A,然后測試test=B,依此類推.3.7簡單程序設計分支程序設計例3-4在ARM中實現(xiàn)C的s1133.7簡單程序設計循環(huán)程序設計例3-5用ARM指令實現(xiàn)FIR過濾器FIR(finiteimpulserresponse)過濾器是一種處理信號的常用方法;FIR過濾器是簡單的對積求和:∑cixi1≤i≤n作為過濾器使用時,xi假定為周期性采集的數(shù)據(jù)樣品,ci是系數(shù)。3.7簡單程序設計循環(huán)程序設計例3-5用ARM指令實現(xiàn)FI114這種表示假定樣品是周期性采集而來的,每次一個新的樣品到來都要重新計算一次FIR過濾器的輸出?!鞣娇虮硎敬鎯倓偟絹淼臉悠樊a(chǎn)生xi時延元素。延遲的樣品分別單獨與c相乘,然后求和得到過濾器的輸出fΔΔΔΔΣc1c2c3c4x1x2x3x4這種表示假定樣品是周期性采集而來的,每次一個1153.7簡單程序設計子程序設計

每個C函數(shù)返回一個值(除非它的返回類型是void);一般把不返回值的結構稱為子例程或過程。3.7簡單程序設計子程序設計每個C函數(shù)返回一個116

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設計★8混合語言編程第3章目錄★1GNUGCC簡介1173.8混合語言編程

匯編語言與C/C++的混合編程通常有以下幾種方式:在C/C++代碼中嵌入?yún)R編指令;在匯編程序和C/C++的程序之間進行變量的互訪;匯編程序、C/C++程序間的相互調用。3.8混合語言編程 匯編語言與C/C++的混合編程通常有以下118如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的語法__asm {指令[;指令]/*注釋*/ …… [指令] }

如何在C語言內嵌匯編語言3.8混合語言編程--------119如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的語法例3-6使能/禁能IRQ中斷__inlinevoidenable_IRQ(void){inttmp;__asm//嵌入?yún)R編代碼{MRStmp,CPSR//讀取CPSR的值BICtmp,tmp,#0x80MSR CPSR_c,tmp}}如何在C語言內嵌匯編語言3.8混合語言編程--------120如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的語法例3-6使能/禁能IRQ中斷__inlinevoiddisable_IRQ(vold)inttmp;__asm{MRStmp,CPSRORRtmp,tmp,#0x80MSRCPSR_c,tmp}}如何在C語言內嵌匯編語言3.8混合語言編程--------121如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的指令用法(1)操作數(shù)內嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C表達式。(2)物理寄存器內嵌匯編中使用物理寄存器有以下限制:不能直接向PC寄存器賦值使用物理寄存器的指令中,不要使用過于復雜的C表達式。編譯器可能會使用R12或R13存放編譯的中間結果通常內嵌的匯編指令中不要指定物理寄存器,如何在C語言內嵌匯編語言3.8混合語言編程--------122如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的指令用法(3)常量。在內嵌匯編指令中,常量前面的“#”可以省略。(4)指令展開。內嵌的匯編指令中,如果包含常量操作數(shù),則該指令有可能被內嵌匯編器展開成幾條指令。(5)標號。C程序中的標號可以被內嵌的匯編指令使用。但是只有指令B可以使用C程序中的標號,而指令BL則不能使用。如何在C語言內嵌匯編語言3.8混合語言編程--------123如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的指令用法(6)內存單元的分配。所有的內存分配均由C編譯器完成,分配的內存單元通過變量供內嵌匯編器使用。內嵌匯編器不支持內嵌匯編程序中用于內存分配的偽指令。如何在C語言內嵌匯編語言3.8混合語言編程--------124如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編的指令用法(7)SWI和BL指令。在內嵌的SWI和BL指令中,除了正常的操作數(shù)域外,還必須增加以下3個可選的寄存器列表:

第1個寄存器列表中的寄存器用于輸入的參數(shù)。第2個寄存器列表中的寄存器用于存儲返回的結果。第3個寄存器列表中的寄存器的內容可能被被調用的子程序破壞,即這些寄存器是供被調用的子程序作為工作寄存器。如何在C語言內嵌匯編語言3.8混合語言編程--------125如何在C語言內嵌匯編語言3.8混合語言編程-----------內嵌匯編器與armasm匯編器的差異內嵌匯編器不支持通過“.”指示符或PC獲取當前指令地址不支持“LDRRn,=expr”偽指令,而使用“MOVRn,expr”指令向寄存器賦值;不支持標號表達式;不支持ADR和ADRL偽指令;不支持BX指令;不能向PC賦值。使用0x前綴代替“&”,表示十六進制數(shù)。當使用8位移位常數(shù)導致CPSR的ALU標志更新時,N、Z、C和V標志中的C不具有真實意義。如何在C語言內嵌匯編語言3.8混合語言編程--------1263.8混合語言編程如何在C語言內嵌匯編語言-----------內嵌匯編注意事項(1)必須小心使用物理寄存器.如R0~R3、PC、LR和CPSR中的N、Z、C和V標志位,因為計算匯編代碼中的C表達式時,可能會使用這些物理寄存器,并會修改N、Z、C和V標志位。例如: __asm {MOVvar,x ADDy,var,x/y } 計算x/y時R0會被修改。內嵌匯編器探測到隱含的寄存器沖突就會報錯。3.8混合語言編程如何在C語言內嵌匯編語言--------1273.8混合語言編程如何在C語言內嵌匯編語言-----------內嵌匯編注意事項(2)不要使用寄存器代替變量。例如: intbad_f(intx)//

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論