微處理器系統(tǒng)原理與應(yīng)用設(shè)計(jì)-4-程序設(shè)計(jì)-公開(kāi)_第1頁(yè)
微處理器系統(tǒng)原理與應(yīng)用設(shè)計(jì)-4-程序設(shè)計(jì)-公開(kāi)_第2頁(yè)
微處理器系統(tǒng)原理與應(yīng)用設(shè)計(jì)-4-程序設(shè)計(jì)-公開(kāi)_第3頁(yè)
微處理器系統(tǒng)原理與應(yīng)用設(shè)計(jì)-4-程序設(shè)計(jì)-公開(kāi)_第4頁(yè)
微處理器系統(tǒng)原理與應(yīng)用設(shè)計(jì)-4-程序設(shè)計(jì)-公開(kāi)_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

開(kāi)發(fā)平臺(tái)01請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本2編程語(yǔ)言從處理器的角度來(lái)看一條指令只是一個(gè)操作多條指令構(gòu)成程序完成一個(gè)功能操作從程序執(zhí)行角度來(lái)看處理器讀取指令后譯碼執(zhí)行,完成所有操作從程序設(shè)計(jì)的角度來(lái)看如何用指令來(lái)描述所要實(shí)現(xiàn)的功能如何組織這些指令如何將指令和數(shù)據(jù)放置到規(guī)定的存儲(chǔ)位置如何讓文字的文本變成可以執(zhí)行的二進(jìn)制數(shù)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本3編程語(yǔ)言機(jī)器語(yǔ)言二進(jìn)制語(yǔ)言處理器能直接執(zhí)行的唯一語(yǔ)言按照指令的執(zhí)行順序?qū)⑾鄳?yīng)的二進(jìn)制數(shù)值排列寫入存儲(chǔ)空間后就可以執(zhí)行,但不便編程匯編語(yǔ)言采用助記符來(lái)表示指令匯編指令和機(jī)器指令一一對(duì)應(yīng)的采用一些助記符來(lái)規(guī)范指令的排列和數(shù)據(jù)的存放指令和規(guī)范一起構(gòu)成了匯編語(yǔ)言可視為機(jī)器語(yǔ)言的文字描述形式,方便程序的設(shè)計(jì)。高級(jí)語(yǔ)言面向處理的,采用規(guī)范的數(shù)據(jù)定義、操作語(yǔ)句和程序結(jié)構(gòu)程序更接近處理思路,更易讀易懂可以應(yīng)用于更多的處理器程序通過(guò)編譯器可以生成匯編程序。程序匯編語(yǔ)言高級(jí)語(yǔ)言視角存儲(chǔ)器與指令數(shù)據(jù)結(jié)構(gòu)與算法數(shù)據(jù)定義直觀,易觀察抽象,但易用運(yùn)算處理直接,效率高,但描述復(fù)雜直接,描述簡(jiǎn)潔,但效率稍低流程結(jié)構(gòu)跳轉(zhuǎn)主導(dǎo),不易描述且難懂格式化,描述簡(jiǎn)單且易讀應(yīng)用場(chǎng)合面向處理系統(tǒng)啟動(dòng)和高速處理面向數(shù)據(jù)處理和業(yè)務(wù)應(yīng)用C語(yǔ)言請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本4程序要素程序由數(shù)據(jù)、運(yùn)算和流程三者結(jié)合構(gòu)建而成流程是算法的體現(xiàn),決定如何執(zhí)行運(yùn)算操作控制器控制流程運(yùn)算是數(shù)據(jù)的加工,決定如何處理數(shù)據(jù)ALU加工數(shù)據(jù)數(shù)據(jù)是信息的表現(xiàn)和處理的對(duì)象,決定如何存儲(chǔ)和訪問(wèn)寄存器和存儲(chǔ)器存儲(chǔ)數(shù)據(jù)程序有四個(gè)基本要素?cái)?shù)據(jù)定義處理語(yǔ)句流程控制組織結(jié)構(gòu)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本5程序要素?cái)?shù)據(jù)定義實(shí)質(zhì)是完成存儲(chǔ)分配確定數(shù)據(jù)的類型、數(shù)量、存儲(chǔ)介質(zhì)、位置采用變量來(lái)定義數(shù)據(jù)高級(jí)語(yǔ)言的變量可以保存寄存器,也可以保存在存儲(chǔ)器匯編語(yǔ)言中的變量都是定義在存儲(chǔ)器的處理語(yǔ)句實(shí)質(zhì)是實(shí)現(xiàn)數(shù)據(jù)加工高級(jí)語(yǔ)言的運(yùn)算語(yǔ)句是面向變量的一條運(yùn)算語(yǔ)句所對(duì)應(yīng)的匯編可能需要多條語(yǔ)句涉及到多次的寄存器與存儲(chǔ)器之間的數(shù)據(jù)交互操作匯編語(yǔ)言的運(yùn)算語(yǔ)句是面向ALU的一條語(yǔ)句就是一次操作,涉及一次寄存器和存儲(chǔ)器的交互操作請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本6程序要素流程控制實(shí)質(zhì)是構(gòu)建某一功能的處理操作流根據(jù)數(shù)據(jù)加工的結(jié)果來(lái)調(diào)整所要執(zhí)行的操作處理流程采用三種常用結(jié)構(gòu)順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。高級(jí)語(yǔ)言有專用的結(jié)構(gòu)構(gòu)建語(yǔ)句,涉及比較運(yùn)算和跳轉(zhuǎn)操作匯編語(yǔ)言中只能用多個(gè)跳轉(zhuǎn)語(yǔ)句來(lái)實(shí)現(xiàn)組織結(jié)構(gòu)實(shí)質(zhì)是將多個(gè)功能處理流程有機(jī)組合完成一個(gè)復(fù)雜的功能組織形式是采用函數(shù)或子過(guò)程來(lái)構(gòu)建功能模塊,通過(guò)功能模塊互聯(lián)實(shí)現(xiàn)程序的功能高級(jí)語(yǔ)言采用專用的函數(shù)或子過(guò)程語(yǔ)法來(lái)構(gòu)建,自動(dòng)完成堆棧操作和參數(shù)傳遞等工作匯編語(yǔ)言則通過(guò)標(biāo)號(hào)定義和堆棧操作來(lái)實(shí)現(xiàn)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本7編程語(yǔ)言對(duì)照Thumb-2匯編語(yǔ)言與C語(yǔ)言功能匯編語(yǔ)句C語(yǔ)句數(shù)據(jù)定義DCB,DCW,DCD,DCQ,SPACEchar,short,long,longlong,int,[],struct處理語(yǔ)句ADD,SUB,MUL,DIV,AND,ORR,EOR,BIC,CMP,LSL,ASR,LSR,MLA,MLS,CMP,TST+,-,*,/,&.|,~,^,>>,<<,++,--,>,<,>=,<=,==,!=,&&,||,!流程控制B,BX,CBZ,CBNZif-else,switch-case,while,do-while,for,continue,break,goto組織結(jié)構(gòu)PROC,ENDP,BLintfunc(),return,func()請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本8匯編程序結(jié)構(gòu)分區(qū)采用AREA對(duì)代碼和數(shù)據(jù)分別分區(qū),并指明存儲(chǔ)類型必須包括兩個(gè)區(qū)保存異常向量表的只讀數(shù)據(jù)區(qū)AREARESET,DATA,READONLY;區(qū)名為RESET,用于異常向量表,保存在ROM中。包含啟動(dòng)程序的只讀代碼區(qū)AREA|.text|,CODE,READONLY;區(qū)名為系統(tǒng)默認(rèn)名,保存在ROM中自行添加可讀寫數(shù)據(jù)區(qū)AREAmydata,DATA,READWRITE;區(qū)名為mydata,保存在RAM中自行添加只讀代碼區(qū)AREAmycode,CODE,READONLY;區(qū)名為mycode,保存在ROM中每個(gè)區(qū)的首個(gè)指令或數(shù)據(jù)通常都要有標(biāo)識(shí)標(biāo)識(shí)被外部使用,要用EXPORT語(yǔ)句再聲明一次請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本9匯編程序結(jié)構(gòu)異常向量表在只讀存儲(chǔ)區(qū)中分配的數(shù)據(jù)重啟時(shí)映射在地址0x00000000其中第1個(gè)字保存主棧指針MSP值值人為指定或通過(guò)語(yǔ)句來(lái)自動(dòng)分配第2個(gè)字保存重啟異常處理向量標(biāo)識(shí)Reset_Handler的值異常向量表首地址標(biāo)識(shí)為_(kāi)_Vectors,需再用EXPORT語(yǔ)句聲明棧用戶存放程序臨時(shí)創(chuàng)建的局部數(shù)據(jù)啟動(dòng)時(shí)自動(dòng)分配一定空間的主堆棧堆運(yùn)行中被動(dòng)態(tài)分配的存儲(chǔ)段,大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。根據(jù)需求分配AREARESET,DATA,READONLY;EXPORT__Vectors__Vectors;第一個(gè)字為MSP初值;第二個(gè)字為Reset_Handler的值?;第n個(gè)字為異常類型n-1的異常服務(wù)函數(shù)的值?請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本10重啟服務(wù)重啟異常服務(wù)初始化時(shí)鐘初始化存儲(chǔ)器初始化數(shù)據(jù)數(shù)據(jù)初始化只讀區(qū)(RO區(qū))分配異常向量表、程序代碼和只讀數(shù)據(jù)可初始化的讀寫區(qū)(RW區(qū))分配需初始化的數(shù)據(jù)不初始化的讀寫區(qū)(ZI區(qū))分配不需要初始化的數(shù)據(jù)AREA|.text|,DATA,READONLYENTRYReset_Handler PROCEXPORT Reset_Handler [WEAK]?ENDPRW區(qū)數(shù)據(jù)的初值:既要保存在ROM中,保證數(shù)據(jù)不丟失又要保存在RAM中,供處理器使用加電后要用指令將它們從ROM中讀出并寫到相應(yīng)的RAM中請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本11重啟服務(wù)數(shù)據(jù)初始化加載視圖RO區(qū)和RW區(qū)均在ROM中保存供加電啟動(dòng)時(shí)使用執(zhí)行視圖RO區(qū)在ROM中保存RW區(qū)和ZI區(qū)在RAM中保存供執(zhí)行時(shí)使用①源地址為Image$$RO$$Limit,目的地址為Image$$RW$$Base;②判定目的地址與Image$$ZI$$Base的大小關(guān)系③小時(shí),從源地址取一字寫到目的地址,兩地址皆增4再?gòu)?fù)制下一字,再執(zhí)行②;④判定目的地址與Imag$$ZI$$Limit的大小關(guān)系;⑤小時(shí),向目標(biāo)地址寫0,地址增4,再執(zhí)行④。請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本12集成環(huán)境KeiluVision先建立一個(gè)空項(xiàng)目testcm4“Device”選擇”ARM”-“ARMCortexM4”-“ARMCM4”ROM開(kāi)始于地址0x00000000,空間大小為0x40000RAM開(kāi)始于地址0x20000000,空間大小為0x20000空項(xiàng)目中新建或添加源文件startup.s系統(tǒng)初始化和測(cè)試匯編程序test.c編制C語(yǔ)言程序請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本13集成環(huán)境Keil配置請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本14啟動(dòng)文件三個(gè)基本步驟:可讀寫數(shù)據(jù)區(qū)定義堆棧只讀數(shù)據(jù)區(qū)定義異常向量表代碼區(qū)給出重啟異常服務(wù)函數(shù)以及數(shù)據(jù)初始化函數(shù)先進(jìn)行基本設(shè)備初始化,再進(jìn)行變量初始化最后跳轉(zhuǎn)用戶主程序AREASTACK,DATA,READWRITE,ALIGN=3SPACE 1024__initial_sp;棧底,也是棧頂?shù)某跏嫉刂稟REARESET,DATA,READONLYEXPORT__Vectors__VectorsDCD__initial_sp;MSP的初值DCDReset_

AREA|.text|,CODE,READONLYENTRYReset_HandlerPROC;重啟異常處理程序EXPORTReset_Handler[WEAK]BLData_Init;數(shù)據(jù)初始化IMPORTmain;用戶主函數(shù)main()的地址LDRR0,=mainBXR0;執(zhí)行main函數(shù)ENDPIMPORT|Image$$RO$$Limit|IMPORT|Image$$RW$$Base|IMPORT|Image$$ZI$$Base|IMPORT|Image$$ZI$$Limit|Data_Init PROC;RW區(qū)裝載與ZI區(qū)清零LDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR2,=|Image$$ZI$$Base|;RW區(qū)復(fù)制LOOPRWCMPR1,R2LDRCCR3,[R0],#4STRCCR3,[R1],#4BCCLOOPRW;ZI區(qū)執(zhí)行清0操作。LDRR2,=|Image$$ZI$$Limit|LDRR0,=0LOOPZICMPR1,R2STRCCR0,[R1],#4BCCLOOPZI;數(shù)據(jù)初始化完成BXLRENDPEND數(shù)據(jù)定義02請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本16數(shù)據(jù)定義常量表示具體數(shù)值的字符串標(biāo)號(hào)op1MOVR0,R1采用EQU定義constEQU值;#defineconst值變量一個(gè)存儲(chǔ)空間標(biāo)號(hào)-變量名-存儲(chǔ)單元地址字節(jié)空間xSPACEm

;charx[m]; unsignedcharx[m];雙字變量aDCQ0 ;longlonga; unsignedlonglonga;字變量bDCD0 ;longa; unsignedlonga;半字變量cDCW0 ;shorta; unsignedshorta;字節(jié)變量dDCB0 ;chara; unsignedchara;字變量(地址)eDCDb ;int*e=&b; unsignedint*e=&b;雙字和字變量從4的倍數(shù)地址開(kāi)始分配半字變量從偶數(shù)地址開(kāi)始分配字節(jié)變量可以任何地址開(kāi)始分配請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本17數(shù)據(jù)定義變量匯編語(yǔ)言變量是存儲(chǔ)空間[a]變量名a是該存儲(chǔ)空間的首地址C語(yǔ)言變量名a代表存儲(chǔ)空間&a表示存儲(chǔ)空間的首地址*a表示以a值為地址的存儲(chǔ)空間變量賦值操作變量名作為地址常量,保存在寄存器作為基地址功能匯編語(yǔ)句C語(yǔ)句對(duì)64位變量賦值0x123456789ABCDEF0LDRR0,=0x9ABCDEF0LDRR1,=0x12345678LDRR2,=aSTRDR0,R1,[R2]a=0x123456789ABCDEF0;對(duì)32位變量賦值0x11223344LDRR1,=0x11223344LDRR2,=bSTRR1,[R2]b=0x11223344;對(duì)16位變量賦值0x5678LDRR1,=0x5678LDRR2,=cSTRHR1,[R2]c=0x5678;對(duì)8位變量賦值0x78LDRR1,=0x78LDRR2,=dSTRBR1,[R2]d=0x78;請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本18數(shù)據(jù)定義變量賦值功能匯編語(yǔ)句C語(yǔ)句將變量b的值賦給變量aLDRR2,=bLDRR0,[R2]LDRR2,=aSTRR0,[R2]a=b;將變量a的地址值賦給變量bLDRR1,=aLDRR2,=bSTRR1,[R2]b=(long)&a;將變量c的高字節(jié)賦給變量dLDRR2,=cLDRBR1,[R2,#1]LDRR0,=dSTRR1,[R0]d=*((char*)&c+1);請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本19數(shù)據(jù)定義加載和存儲(chǔ)指令只關(guān)心存儲(chǔ)空間的地址變量是為方便程序設(shè)計(jì)而設(shè)的匯編語(yǔ)言中賦值操作可跨越變量定義的約束aDCB0;chara;bDCB0;charb;cDCB0;charc;dDCB0;chard;功能匯編語(yǔ)句C語(yǔ)句[a]

0x12LDRR1,=0x12LDRR0,=aSTRBR1,[R0]a=0x12;[b]

0x34LDRR1,=0x34LDRR0,=bSTRBR1,[R0]b=0x34;[c]

0x56LDRR1,=0x56LDRR0,=cSTRBR1,[R0]b=0x56;[d]

0x78LDRR1,=0x78LDRR0,=dSTRBR1,[R0]b=0x78;功能匯編語(yǔ)句C語(yǔ)句[a]

0x78563412LDRR1,=0x78563412LDRR0,=aSTRR1,[R0]*(long*)&a=0x78563412;基于變量定義,逐個(gè)變量操作從存儲(chǔ)器角度看,向四個(gè)字節(jié)存儲(chǔ)單元寫四個(gè)數(shù),也可以是向一個(gè)字存儲(chǔ)單元寫一個(gè)數(shù)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本20數(shù)組變量多個(gè)相同類型的變量順序排列構(gòu)成數(shù)組變量數(shù)組變量名為數(shù)組變量的首地址C語(yǔ)言采用“[]”來(lái)定義數(shù)組變量變量名也是數(shù)組變量的首地址賦值采用基址+偏移量尋址方式匯編語(yǔ)言基址取變量名偏移量以字節(jié)為單位,其值=序號(hào)×類型尺寸字節(jié)、半字、字和雙字的類型尺寸分別為1、2、4、8C語(yǔ)言其偏移量只是相差的同類型變量的個(gè)數(shù)功能匯編語(yǔ)句C語(yǔ)句字節(jié)數(shù)組cDCB0,0,0unsignedcharc[]={0,0,0};半字?jǐn)?shù)組bDCW0,0,0,0,0unsignedshortb[]={0,0,0,0,0};字?jǐn)?shù)組aDCDc,b,a,0longa[]={(long)c,(long)b,(long)a,0};請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本21數(shù)組變量數(shù)組賦值功能匯編語(yǔ)句C語(yǔ)句字?jǐn)?shù)組a的第3個(gè)變量賦值0x12345678LDRR0,=0x12345678LDRR1,=aSTRR0,[R1,#2*4]a[2]=0x12345678;或*(a+2)=0x12345678;半字?jǐn)?shù)組b的第5個(gè)變量賦值0x1234LDRR0,=0x1234LDRR1,=bSTRHR0,[R1,#4*2]b[4]=0x1234;或*(b+4)=0x1234;字節(jié)數(shù)組c的第1個(gè)變量賦值0x12LDRR0,=0x12LDRR1,=cSTRBR0,[R1,#0]c[0]=0x12;或*c=0x12;功能匯編語(yǔ)句C語(yǔ)句1個(gè)字aDCD0x12345678longa=0x12345678;1個(gè)含2半字的數(shù)組aDCW0x5678,0x1234shorta[]={0x5678,0x1234};1個(gè)含4字節(jié)的數(shù)組aDCB0x78,0x56,0x34,0x12chara[]={0x78,0x56,0x34,0x12};1個(gè)半字和1個(gè)含2字節(jié)的數(shù)組aDCW0x5678bDCB0x34,0x12shorta=0x5678;charb[]={0x34,0x12};1個(gè)含2字節(jié)的數(shù)組和1個(gè)半字aDCB0x78,0x56bDCW0x1234chara[]={0x78,0x56};shortb=0x1234;采用不同的定義方式來(lái)實(shí)現(xiàn)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本22指針變量在C語(yǔ)言中,定義指針變量來(lái)保存變量的地址指針對(duì)應(yīng)著匯編語(yǔ)言中的地址對(duì)某類型<type>的指針變量p賦值時(shí)p=&a;對(duì)于該類型的數(shù)組變量x,數(shù)組變量名本身就是地址(指針常量)p=x;對(duì)于指定地址值N的存儲(chǔ)空間,可以直接賦立即數(shù)p=(<type>*)N;在匯編語(yǔ)言中,指針變量就是一個(gè)普通的字型變量只是這個(gè)字型存儲(chǔ)單元用來(lái)保存其它變量的地址功能C語(yǔ)言匯編語(yǔ)言定義指針變量shortx[4];short*p;xSPACE4*2pDCD0指針變量賦值p=x;LDRR0,=xLDRR1,=pSTRR0,[R1]指針變量對(duì)應(yīng)的存儲(chǔ)空間賦值*p=2LDRR0,=2LDRR1,=pLDRR1,[R1]STRHR0,[R1]對(duì)指針變量指向的存儲(chǔ)空間賦值后指針變量自增*p++=2;LDRR0,=2LDRR1,=pLDRR2,[R1]STRHR0,[R2],#2STRR2,[R1]指針變量自增后再對(duì)其指向的存儲(chǔ)空間賦值*++p=2;LDRR0,=2LDRR1,=pLDRR2,[R1]STRHR0,[R2,#2]!STRR2,[R1]請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本23結(jié)構(gòu)體變量多個(gè)不同類型的變量順序排列構(gòu)成結(jié)構(gòu)體變量結(jié)構(gòu)體變量名為結(jié)構(gòu)體變量的首地址C語(yǔ)言采用“struct{}”來(lái)定義結(jié)構(gòu)體類型以及變量以變量名為基地址,聯(lián)合結(jié)構(gòu)體內(nèi)變量名的偏移量進(jìn)行尋址結(jié)構(gòu)體內(nèi)每個(gè)變量的偏移量為其地址與變量名的差值功能匯編語(yǔ)句C語(yǔ)句1個(gè)變量?jī)?nèi)含1個(gè)字、1個(gè)半字和1個(gè)字節(jié)aDCD0DCW0DCB0struct{unsignedlongx;unsignedshorty;unsignedcharz;}a;功能匯編語(yǔ)句C語(yǔ)句將0x12345678、0x9ABC和0xDE分別保存在變量a中LDRR1,=aLDRR0,=0x12345678STRR0,[R1,#X]LDRR0,=0x9ABCSTRHR0,[R1,#Y]LDRR0,=0xDESTRBR0,[R1,#Z]a.x=0x12345678;a.y=0x9ABC;a.z=0xDE;XEQU0YEQU4ZEQU6請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本24變量共用變量的實(shí)質(zhì)是存儲(chǔ)空間無(wú)論何種類型的變量,都是一定大小的存儲(chǔ)空間類型定義,只是對(duì)存儲(chǔ)空間進(jìn)行了一種應(yīng)用劃分對(duì)于某固定的存儲(chǔ)空間可以采用不同的類型來(lái)定義相當(dāng)于同一物理體可有多個(gè)不同的描述方式所保存的數(shù)據(jù)可以使用不同的訪問(wèn)方式功能匯編語(yǔ)句C語(yǔ)句1個(gè)字aDCD0longa;2個(gè)半字aDCW0DCW0struct{shortx;shorty;}a;1個(gè)含2半字的數(shù)組aDCW0,0shorta[2];4個(gè)字節(jié)aDCB0DCB0DCB0DCB0struct{charx;chary;charz;charw;}a;1個(gè)含4字節(jié)的數(shù)組aDCB0,0,0,0chara[4];1個(gè)半字和1個(gè)含2字節(jié)的數(shù)組aDCW0DCB0,0struct{shortx;chary[2];}a;1個(gè)半字和2個(gè)字節(jié)aDCW0

DCB0

DCB0struct{shortx;chary;charz;}a;1個(gè)含2字節(jié)的數(shù)組和1個(gè)半字aDCB0,0DCW0struct{charx[2];shorty;}a2個(gè)字節(jié)和1個(gè)半字aDCB0

DCB0

DCW0struct{charx;chary;shortz;}a;數(shù)據(jù)處理03請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本26符號(hào)擴(kuò)展加載有符號(hào)數(shù)和無(wú)符號(hào)數(shù)加載時(shí)有符號(hào)數(shù)要擴(kuò)展符號(hào)位采用LDRSB和LDRSH指令寄存器數(shù)據(jù)擴(kuò)展SXTB、SXTHUXTB、UXTH數(shù)據(jù)定義DCB0xFFDCW0xFFFFDCD0xFFFFFFFF無(wú)符號(hào)數(shù)值255655354294967295寄存器0x000000FF0x0000FFFF0xFFFFFFFF有符號(hào)數(shù)值-1-1-1寄存器0xFFFFFFFF0xFFFFFFFF0xFFFFFFFF功能

匯編語(yǔ)句C語(yǔ)句匯編語(yǔ)句C語(yǔ)句無(wú)符號(hào)數(shù)有符號(hào)數(shù)變量定義xDCB0xF0unsignedcharx=0xF0;xDCB0xF0charx=0xF0;yDCW0x1000unsignedshorty=0x1000;yDCW0x1000shorty=0x1000;zDCD0unsignedlongz=0;zDCD0longz=0;變量讀取LDRR0,=xLDRBR0,[R0]LDRR1,=yLDRHR1,[R1]LDRR2,=zLDRR2,[R2]

LDRR0,=xLDRSBR0,[R0]LDRR1,=yLDRSHR1,[R1]LDRR2,=zLDRR2,[R2]

變量保存LDRR0,#NLDRR1,=zSTRR0,[R1]z=N;LDRR0,#NLDRR1,=zSTRR0,[R1]z=N請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本27數(shù)據(jù)運(yùn)算算術(shù)運(yùn)算、移位運(yùn)算、位邏輯運(yùn)算一條匯編指令功能C語(yǔ)言匯編語(yǔ)言功能C語(yǔ)言匯編語(yǔ)言

算術(shù)運(yùn)算

加z=x+yADDR2,R0,R1減z=x-ySUBR2,R0,R1

乘z=x*yMULR2,R0,R1除z=x/yU/SDIVR2,R0,R1

乘累加z=z+x*yMLAR2,R2,R0,R1乘累減z=z-x*yMLSR2,R2,R0,R1

移位運(yùn)算

左移z=x<<yLSLR2,R0,R1右移z=x>>yL/ASRR2,R0,R1

位邏輯運(yùn)算

與z=x&yANDR2,R0,R1或z=x|yORRR2,R0,R1

非z=~xMVNR2,R0異或z=x^yEORR2,R0,R1

請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本28數(shù)據(jù)運(yùn)算關(guān)系運(yùn)算兩個(gè)量值之間的大小關(guān)系關(guān)系成立時(shí)運(yùn)算結(jié)果為邏輯“真”非零值來(lái)代表“真”不成立時(shí)運(yùn)算結(jié)果為邏輯“假”零值來(lái)代表“假”邏輯運(yùn)算對(duì)邏輯量進(jìn)行與、或、非運(yùn)算邏輯與和邏輯或采用位邏輯來(lái)計(jì)算邏輯非采用條件指令來(lái)實(shí)現(xiàn)功能C語(yǔ)言匯編語(yǔ)言功能C語(yǔ)言匯編語(yǔ)言關(guān)系運(yùn)算大于z=x>yCMPR0,R1MOVLSR2,#0MOVHIR2,#1小于小于z=x<yz=x<yCMPR0,R1MOVHSR2,#0MOVLOR2,#1CMPR0,R1MOVLER2,#0MOVGTR2,#1CMPR0,R1MOVGER2,#0MOVLTR2,#1不小于z=x>=yCMPR0,R1MOVHSR2,#1MOVLOR2,#0不大于不大于z=x<=yz=x<=yCMPR0,R1MOVLSR2,#1MOVHIR2,#0CMPR0,R1MOVGER2,#1MOVLTR2,#0CMPR0,R1MOVLER2,#1MOVGTR2,#0等于z=x==yCMPR0,R1MOVEQR2,#1MOVNER2,#0不等于不等于z=x!=yz=x!=yCMPR0,R1MOVEQR2,#0MOVNER2,#1邏輯運(yùn)算邏輯與z=x&&yANDR2,R0,R1邏輯非邏輯非z=!xz=!xCMPR0,#0MOVNER2,#0MOVEQR2,#1邏輯或z=x||yORRR2,R0,R1請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本29運(yùn)算數(shù)據(jù)存儲(chǔ)大量臨時(shí)數(shù)據(jù)需要臨時(shí)保存在存儲(chǔ)器采用分配的變量保存時(shí),存取數(shù)據(jù)均需取地址和讀寫數(shù)據(jù)兩條指令完成采用堆棧保存,不需要取地址而只需要讀寫數(shù)據(jù)一條指令存儲(chǔ)空間可以反復(fù)被利用功能使用寄存器使用堆棧a*b+a*c+a*d+b*c+b*d+c*dMULR4,R0,R1;a*bMULR5,R0,R2;a*cADDR4,R4,R5MULR5,R0,R3;a*dADDR0,R4,R5MULR4,R1,R2;b*cADDR0,R0,R4MULR4,R1,R3;b*dADDR0,R0,R4MULR4,R2,R3;c*dADDR0,R0,R4PUSH{R2,R3}MULR2,R0,R2;a*cMULR3,R0,R3;a*dMULR0,R0,R1;a*bADDR2,R2,R3ADDR0,R0,R2POP{R2,R3}PUSH{R0}MULR0,R1,R2;b*cMULR1,R1,R3;b*dMULR2,R2,R3;c*dPOP{R3}ADDR0,R0,R1ADDR0,R0,R2ADDR0,R0,R3a-d分別保存在R0-R3中共用6個(gè)寄存器R0-R5只用R0-R3流程結(jié)構(gòu)04請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本31分支結(jié)構(gòu)四種結(jié)構(gòu)單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)、開(kāi)關(guān)結(jié)構(gòu)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本32單分支結(jié)構(gòu)若-則結(jié)構(gòu)由一個(gè)關(guān)系和一個(gè)分支體構(gòu)成只有關(guān)系為真時(shí)才執(zhí)行支體的語(yǔ)句if(<cond>){//關(guān)系為真時(shí)要執(zhí)行的語(yǔ)句}處理流程圖C語(yǔ)言匯編語(yǔ)言if(x>y){z=z+1;}CMPR0,R1BLEop0LDRR3,[R2]ADDR3,#1STRR3,[R2]op0CMPR0,R1ADDGER3,R3,#1STRGER3,[R2]變量x和y值分別保存在R0和R1中變量z的地址保存在R2中請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本33分支結(jié)構(gòu)雙分支結(jié)構(gòu)若-則-否則結(jié)構(gòu)由一個(gè)關(guān)系和兩個(gè)分支體構(gòu)成若關(guān)系為真,則執(zhí)行支體1的語(yǔ)句,否則執(zhí)行支體2的語(yǔ)句if(<cond>){//關(guān)系為真時(shí)要執(zhí)行的語(yǔ)句}else{//關(guān)系為假時(shí)要執(zhí)行的語(yǔ)句}處理流程圖C語(yǔ)言匯編語(yǔ)言if(x>y){z=z+1;}else{z=z-1;}CMPR0,R1BLEop0LDRR3,[R2]ADDR3,#1STRR3,[R2]Bop1op0LDRR3,[R2]SUBR3,#1STRR3,[R2]op1LDRR3,[R2]CMPR0,R1ADDGTR3,#1SUBLER3,#1STRR3,[R2]請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本34分支結(jié)構(gòu)多分支結(jié)構(gòu)若-則-否則若-則-…結(jié)構(gòu),多個(gè)關(guān)系和多個(gè)分支體若關(guān)系1為真,則執(zhí)行支體1的語(yǔ)句,否則,若關(guān)系2為真,則執(zhí)行支體2的語(yǔ)句,否則……if(<cond1>){//關(guān)系1為真時(shí)要執(zhí)行的語(yǔ)句}elseif(<cond2>){//關(guān)系1為假但關(guān)系2為真時(shí)要執(zhí)行的語(yǔ)句}elseif(<cond3>)?else{//所有關(guān)系都為假時(shí)要執(zhí)行的語(yǔ)句}處理流程C語(yǔ)言匯編語(yǔ)言if(x==0){y=1;z=1;}elseif(x<=2){y=2;z=3;}else{z=4;}CMPR0,#0BNEop0LDRR3,=1STRR3,[R1]STRR3,[R2]Bop_endOp0CMPR0,#2BGTop1LDRR3,=2STRR3,[R1]LDRR3,=3STRR3,[R2]Bop_endOp1LDRR3,=4STRR3,[R2]op_end請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本35分支結(jié)構(gòu)開(kāi)關(guān)結(jié)構(gòu)針對(duì)某一變量或變量的表達(dá)式的值來(lái)選擇相應(yīng)的分支體相當(dāng)于若變量或變量表達(dá)式的值為某值時(shí),則執(zhí)行相應(yīng)的分支體分支是基本數(shù)值的,可以采用查表跳轉(zhuǎn)指令switch(<expr>){case<val_0>:?//值為val_0時(shí)要執(zhí)行的語(yǔ)句case<val_1>:?//值為val_1時(shí)要執(zhí)行的語(yǔ)句case<val_N>:?//值為val_N時(shí)要執(zhí)行的語(yǔ)句default:?//其它值時(shí)要執(zhí)行的語(yǔ)句}請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本36分支結(jié)構(gòu)開(kāi)關(guān)結(jié)構(gòu)處理流程C語(yǔ)言匯編語(yǔ)言switch(x){case0:

y=1;

break;case1:case2:y=2;break;default:y=0;}CMPR0,#2MOVHIR0,#3TBB[PC,R0]b_tblDCB((b_0-b_tbl)/2)DCB((b_1_2-b_tbl)/2)DCB((b_1_2-b_tbl)/2)DCB((b_3-b_tbl)/2)b_0LDRR2,=1STRR2,[R1]Bb_endb_1_2LDRR2,=2STRR2,[R1]Bb_endb_3LDRR2,=0STRR2,[R1]b_end變量x值保存在R0中變量y的地址保存在R1中不在偏移表中出現(xiàn)的序號(hào)值,必須在使用查表跳轉(zhuǎn)指令前對(duì)序號(hào)值進(jìn)行重賦值處理相當(dāng)于C語(yǔ)言中的default語(yǔ)句支體請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本37循環(huán)結(jié)構(gòu)三種結(jié)構(gòu)當(dāng)型、直到型和計(jì)數(shù)型請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本38循環(huán)結(jié)構(gòu)當(dāng)型當(dāng)關(guān)系為真時(shí)執(zhí)行循環(huán)體執(zhí)行循環(huán)體前先檢測(cè)關(guān)系是為真,是則執(zhí)行循環(huán)體,否則結(jié)束字符串存儲(chǔ)處理流程C語(yǔ)言匯編語(yǔ)言char*p=x;y=0;while(*p){y++;p++;}MOVR2,#0loopLDRBR3,[R0],#1CBZR3,loop_endADDR2,#1Blooploop_end

STRR2,[R1]while(<邏輯量>){//循環(huán)體;}字符串保存在變量名為x的字節(jié)型數(shù)組變量中,x的值保存在R0中。所計(jì)算得到的長(zhǎng)度保存在名為y的字型變量中,y地址保存在R1中。請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本39循環(huán)結(jié)構(gòu)直到型執(zhí)行循環(huán)體直到關(guān)系為假執(zhí)行循環(huán)體后檢測(cè)關(guān)系是否為真,是則再執(zhí)行循環(huán)體,否則結(jié)束處理流程C語(yǔ)言匯編語(yǔ)言char*p=x-1;y=-1;do{y++;p++;}while(*p);MOVR2,#-1loopADDR2,#1LDRBR3,[R0],#1CMPR3,#0BNEloopSTRR2,[R1]字符串保存在變量名為x的字節(jié)型數(shù)組變量中,x的值保存在R0中。所計(jì)算得到的長(zhǎng)度保存在名為y的字型變量中,y地址保存在R1中。do{//循環(huán)體;}while(<邏輯量>);請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本40計(jì)數(shù)型采用計(jì)數(shù)量確定循環(huán)次數(shù),執(zhí)行前對(duì)計(jì)數(shù)量賦初始,每次執(zhí)行循環(huán)體前檢測(cè)計(jì)數(shù)量是否達(dá)到規(guī)定數(shù),每次執(zhí)行完循環(huán)體后計(jì)數(shù)量更新。for(<計(jì)數(shù)量)=<初值>;<執(zhí)行循環(huán)體的關(guān)系>;<循環(huán)量更新表達(dá)式>){//循環(huán)體;}處理流程C語(yǔ)言匯編語(yǔ)言s=0;for(i=0;i<=N;i++){s=s+i;}MOVR2,#0MOVR0,#0loopCMPR0,#NBNEloop_endADDR2,R0ADDR0,#1Blooploop_endSTRR2,[R1]

函數(shù)05請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本42函數(shù)一個(gè)大型程序通常由若干個(gè)程序模塊按照一定流程組合而成。每個(gè)程序模塊也稱為子程序,由一個(gè)或多個(gè)語(yǔ)句塊組成,負(fù)責(zé)完成某項(xiàng)特定任務(wù),具備相對(duì)的獨(dú)立性。子程序通過(guò)主程序的調(diào)用來(lái)實(shí)現(xiàn)功能。子程序有兩種表現(xiàn)形式過(guò)程強(qiáng)調(diào)動(dòng)作,沒(méi)有返回值函數(shù)側(cè)重計(jì)算,通常有返回值兩者實(shí)質(zhì)是一回事,后文統(tǒng)稱為函數(shù)過(guò)程是沒(méi)有返回值的函數(shù)請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本43函數(shù)函數(shù)操作函數(shù)被調(diào)用時(shí),返回地址保存在LR中進(jìn)入函數(shù)時(shí),需將函數(shù)體內(nèi)會(huì)用到的寄存器壓入堆棧保護(hù)離開(kāi)函數(shù)時(shí),將返回地址賦給PC實(shí)現(xiàn)返回函數(shù)有輸入?yún)?shù)和返回值接受調(diào)用方的數(shù)據(jù)進(jìn)行處理,處理結(jié)果返給調(diào)用方函數(shù)在處理中需要多個(gè)寄存器這些寄存器的值稱為現(xiàn)場(chǎng)函數(shù)開(kāi)始時(shí)現(xiàn)場(chǎng)保存使用這些寄存器之前要將原有的數(shù)據(jù)壓入堆棧函數(shù)結(jié)束時(shí)現(xiàn)場(chǎng)恢復(fù)當(dāng)處理結(jié)束后再恢復(fù)回來(lái)功能匯編語(yǔ)言C語(yǔ)言啞函數(shù)dummyPROCBXLRENDPvoiddummy(){}請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本44函數(shù)參數(shù)傳遞參數(shù)傳遞調(diào)用者將所要處理的數(shù)據(jù)(也稱為輸入?yún)?shù))保存在寄存器或存儲(chǔ)器中函數(shù)從中讀取這些數(shù)據(jù)并將處理結(jié)果(也稱為返回值)也保存在這些寄存器或存儲(chǔ)器中函數(shù)結(jié)束返回后,調(diào)用者從中讀取數(shù)據(jù)。存儲(chǔ)方式寄存器傳遞調(diào)用者將參數(shù)保存在指定的寄存器中函數(shù)被調(diào)用時(shí),從這些寄存器中取數(shù)進(jìn)行處理,處理結(jié)果保存在指定的寄存器中存儲(chǔ)變量傳遞調(diào)用者將參數(shù)保存在指定的存儲(chǔ)變量中函數(shù)被調(diào)用時(shí),從這些存儲(chǔ)變量中取數(shù)進(jìn)行處理,處理結(jié)果保存在指定的存儲(chǔ)變量中堆棧傳遞調(diào)用者將數(shù)據(jù)壓入堆棧中函數(shù)被調(diào)用時(shí),從堆棧中取出輸入?yún)?shù)處理結(jié)束后,返回參數(shù)保存在輸入?yún)?shù)所在的堆棧單元中返回交互輸入?yún)?shù)與返回值請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本45函數(shù)參數(shù)傳遞存儲(chǔ)方式寄存器/堆棧聯(lián)合傳遞調(diào)用者將輸入?yún)?shù)一部分保存在寄存器中,一部分保存在堆棧中函數(shù)從寄存器中和堆棧中獲得輸入?yún)?shù),其結(jié)果也保存在寄存器和堆棧中作為返回值功能匯編語(yǔ)言C語(yǔ)言參數(shù)傳遞主程序?qū)和y值分別讀入寄存器R0和R1,并將R1壓棧。調(diào)用返回后,將R0中值保存到z中,再調(diào)整SP下移一字,回到初始棧位。LDRR0,=xLDRHR0,[R0]LDRR1,=yLDRHR1,[R1]PUSH{R1}BLmyfuncLDRR1,=zSTRR0,[R1]ADDSP,#4z=myfunc(x,y);函數(shù)壓入工作寄存器R1,再?gòu)亩褩V腥〕鲚斎雲(yún)?shù)存于R1,其和保存在調(diào)入時(shí)的棧頂,彈出R1后返回。myfuncPROCPUSH{R1}LDRR1,[SP,#4]ADDR0,R1POP{R1}MOVPC,LRENDPintmyfunc(intx,inty){returnx+y;}請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本46函數(shù)參數(shù)傳遞參數(shù)作用傳值傳變量的值改變參數(shù)值不影響變量的值傳址傳變量的地址利用地址可以改變變量的值功能參數(shù)分配C語(yǔ)言匯編語(yǔ)言傳值voidswap(intx,inty){intz;z=y;y=x;x=z;}swapPROCPUSH{LR}MOVLR,R0MOVR0,R1MOVR1,LRPOP{PC}ENDP功能參數(shù)分配C語(yǔ)言匯編語(yǔ)言傳址voidswap(int*x,int*y){intz;z=*y;*y=*x;*x=z;}swapPROCPUSH{R2,LR}LDRR2,[R0]LDRLR,[R1]

STRLR,[R0]

STRR2,[R1]POP{R2,PC}ENDP請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本47局部變量分配局部變量函數(shù)體內(nèi)需要一定量的存儲(chǔ)空間供函數(shù)處理使用,其作用域僅在函數(shù)體內(nèi)在函數(shù)結(jié)束后就沒(méi)用了,故在堆??臻g中進(jìn)行分配函數(shù)相關(guān)的堆棧區(qū)分為四個(gè)子區(qū)從高地址向低地址依次分配為:輸入?yún)?shù)子區(qū)參數(shù)傳遞寄存器保護(hù)子區(qū)用于保護(hù)調(diào)用現(xiàn)場(chǎng),通過(guò)PUSH和POP建立和釋放多個(gè)寄存器局部變量子區(qū)該空間的分配和釋放通過(guò)更新SP來(lái)實(shí)現(xiàn),局部變量存儲(chǔ)空間的尋址是以SP為基址實(shí)現(xiàn)臨時(shí)保護(hù)子區(qū)運(yùn)算時(shí)動(dòng)態(tài)保存中間數(shù)據(jù),通過(guò)出棧和入棧指令來(lái)操作請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本48局部變量分配局部變量匯編語(yǔ)言函數(shù)的局部變量保存在存儲(chǔ)器中,每個(gè)變量都使用地址來(lái)訪問(wèn)C語(yǔ)言函數(shù)的輸入?yún)?shù)和內(nèi)部定義的變量都視為局部變量可能保存在寄存器中,也可能保存在存儲(chǔ)器中,要根據(jù)具體處理過(guò)程來(lái)定某函數(shù)有三個(gè)輸入?yún)?shù)值a、b和c,一個(gè)保存在R0,另兩個(gè)保存在堆棧中,返回結(jié)果保存在R0。程序只允許用寄存器R0、R1和R2,處理過(guò)程需要3個(gè)臨時(shí)字變量。功能C語(yǔ)言匯編語(yǔ)言寄存器與堆棧函數(shù):三個(gè)輸入?yún)?shù),一個(gè)返回值。intmyfunc(intx,inty,intz){intm,n,k;k=x;?}myfuncPROCPUSH{R1,R2}SUBSP,SP,#4*3STRR0,[SP,#4*2]?ADDSP,SP.#4*3POP{R1,R2}BXLRENDP請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本49迭代函數(shù)

功能C語(yǔ)言匯編語(yǔ)言u(píng)nsignedintfac(unsignedintn){unsignedinti,s;s=1;for(i=n;i>=1;i--)s=s*i;returns;}facPROCPUSH{LR}MOVLR,#1loopCMPR0,#1BLOretMULLR,LR,R0SUBR0,#1BloopretMOVR0,LRPOP{PC}ENDP請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本50遞歸函數(shù)

功能C語(yǔ)言匯編語(yǔ)言指令執(zhí)行后狀態(tài)寄存器組堆棧R0LRm-1mm+1函數(shù):計(jì)算階乘,利用公式:n!=n

(n-1)!0!=1輸入?yún)?shù)和返回參數(shù)均保存在R0中。unsignedintfac(unsignedintn){if(n)returnn*fac(n-1);elsereturn1;}

facPROCna---CBZR0,op2na---PUSH{R0,LR}nana-SUBR0,#1n-1ana-BLfac(n-1)!bna-POP{LR}(n-1)!nna-MULR0,LRn!nna

POP{LR}n!ana-op2

MOVR0,#10!ana

ret

MOVPC,LRn!a---ENDP

函數(shù)調(diào)用中都會(huì)在堆棧中保存調(diào)用時(shí)的寄存器,故反復(fù)調(diào)用自身不影響函數(shù)的正常執(zhí)行混合編程06請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本52變量互用C用匯編變量匯編程序的變量名用EXPORT來(lái)聲明才可由C程序使用使用時(shí)用extern來(lái)聲明變量名asm_var在匯編程序中代表地址、在C程序中代表存儲(chǔ)空間匯編用C變量C語(yǔ)言中的變量只要不使用static來(lái)聲明就可以由匯編使用,使用時(shí)用IMPORT語(yǔ)句聲明變量;匯編程序EXPORTasm_varasm_var DCD0//C程序externintasm_var;asm_var=2;匯編程序IMPORTc_varLDRR0,=3LDRR1,=c_varSTRR0,[R1]//C程序intc_var;請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本53函數(shù)調(diào)用輸入?yún)?shù)1-參數(shù)4保存在寄存器R0-R3,其它參數(shù)從最后向前入棧保存32位返回值保存在R0,64位返回值保存在R0和R1中輸入?yún)?shù)參數(shù)1參數(shù)2參數(shù)3參數(shù)4參數(shù)5

參數(shù)m返回值一個(gè)參數(shù)R0------R0R1兩個(gè)參數(shù)R0R1------R0R1三個(gè)參數(shù)R0R1R2----R0R1四個(gè)參數(shù)R0R1R2R3---R0R1五個(gè)參數(shù)R0R1R2R3SP--R0R1m個(gè)參數(shù)R0R1R2R3SP…SP+4m-20R0R1;匯編程序EXPORTasm_funcasm_funcPROCMULR0,R0BXLR//C程序externunsignedintasm_func(unsignedintn);voidtest{asm_func(2);}unsignedintc_func(unsignedintn){returnn*n;};匯編程序IMPORTc_funcLDRR0,=3PUSH{LR}BLc_funcPOP{LR}請(qǐng)?jiān)诓迦氩藛巍?yè)眉和頁(yè)腳中修改此文本54

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論