微處理器系統(tǒng)原理與應用設計-3-匯編指令-公開_第1頁
微處理器系統(tǒng)原理與應用設計-3-匯編指令-公開_第2頁
微處理器系統(tǒng)原理與應用設計-3-匯編指令-公開_第3頁
微處理器系統(tǒng)原理與應用設計-3-匯編指令-公開_第4頁
微處理器系統(tǒng)原理與應用設計-3-匯編指令-公開_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

指令體系Cortex-M4使用Thumb指令集,代碼體積和性能均衡很好,什么樣的指令體系有如此優(yōu)異的表現(xiàn)?01請在插入菜單—頁眉和頁腳中修改此文本2指令格式{label}<opcode>{<cond>}{S}<operand1>,<operand2>,…;注釋{}表示為可選項,在無需使用時可以省略label是標識名其值就是該指令的存儲地址<opcode>表示具體的指令操作助記符<cond>代表指令執(zhí)行條件只有滿足執(zhí)行條件才會執(zhí)行對應該指令省略時表示無條件執(zhí)行S表示是否更新應用程序狀態(tài)寄存器<operand1>,<operand2>表示操作數(shù)操作數(shù)的具體個數(shù)隨指令類型有所不同;為注釋符后面文本為注釋指令為16位與32位混合每條指令地址都是偶數(shù)16位指令作用的通用寄存器為R0-R7后綴條件標志后綴條件標志EQ相等Z==1NE不等Z==0CS無符號數(shù)大于等于C==1CC無符號數(shù)小于N==1MI負數(shù)N==1PL非負數(shù)N==0VS溢出V==1VC未溢出V==0HI無符號數(shù)大于C==1且Z==0LS無符號數(shù)小于等于C==0或Z==1GE有符號數(shù)大于等于N==VLT有符號數(shù)小于N!=VGT有符號數(shù)大于Z==0且N==VLE有符號數(shù)小于等于Z==1或N!=V

MYADD1ADDSR1,R1,#1BEQMYADD1請在插入菜單—頁眉和頁腳中修改此文本3指令代碼數(shù)據(jù)傳輸類搬移、加載/存儲、批量加載/存儲等數(shù)據(jù)運算類算術運算、邏輯運算、移位、比較測試、符號擴展、字節(jié)調序、位域處理等流程控制子程序(函數(shù))調用、轉移、IF-THEN等處理器控制異常相關、休眠模式、存儲器屏障、空執(zhí)行和斷點等數(shù)字信號處理(DSP)單指令多數(shù)據(jù)(SIMD)、乘與乘加、飽和運算等請在插入菜單—頁眉和頁腳中修改此文本4指令編碼讀指獲得的16位數(shù)據(jù)的高5位決定指令是16位還是32位B15B14B13不為111B

16位指令B15B14B13為111BB12B11為00

16位指令(無條件轉移指令)B12B11不為00

與后續(xù)16位一起構成32位指令16位指令編碼高六位B15-B10為操作碼op指令或指令類op指令或指令類00xxxx移位、加、減、比較和搬移指令010000數(shù)據(jù)處理指令010001特殊數(shù)據(jù)指令、分支和交換指令01001x從文本池加載指令0101xx單數(shù)據(jù)加載、存儲指令10100x產(chǎn)生PC相對地址011xxx10101x產(chǎn)生SP相對地址100xxx1011xx雜項16位指令11000x多寄存器存儲指令11001x多寄存器加載指令1101xx條件分支和SVC指令11100x無條件分支指令請在插入菜單—頁眉和頁腳中修改此文本5指令編碼16位移位、加、減、比較和搬移指令編碼B13-B932位指令編碼兩個16位數(shù)構成op指令或指令類op指令或指令類000xx邏輯左移001xx邏輯右移010xx算術右移--01100寄存器加01101寄存器減011103位立即數(shù)加011113位立即數(shù)減100xx搬移101xx比較110xx8位立即數(shù)加111xx8位立即數(shù)減op1op2op3指令或指令類op1op2op3指令或指令類0100xx0xxx多數(shù)據(jù)加載/存儲0100xx1xxx雙或單獨加載/存儲、查表分支0101xxxxxx數(shù)據(jù)處理011xxxxxxx協(xié)處理器指令10x0xxxxx0數(shù)據(jù)處理10x1xxxxx0數(shù)據(jù)處理10xxxxxxx1分支和雜項控制11000xxx0x單數(shù)據(jù)存儲1100xx001x加載字節(jié)、存儲器1100xx011x加載半字、未分配存儲器1100xx101x字加載1100xx111x未定義11010xxxxx數(shù)據(jù)處理110110xxxx乘和乘加110111xxxx長乘、長乘加和除111xxxxxxx協(xié)處理器指令請在插入菜單—頁眉和頁腳中修改此文本6指令執(zhí)行描述指令執(zhí)行表將相關的存儲單元、寄存器組、特殊寄存器、正在執(zhí)行的指令等關鍵內容列在表中橫排表每一行代表當前指令執(zhí)行時的相關存儲器單元和寄存器的數(shù)據(jù),執(zhí)行完成后更新內容出現(xiàn)在下一行豎排表每一列代表當前指令執(zhí)行時的相關存儲器單元和寄存器的數(shù)據(jù),執(zhí)行完成后更新內容出現(xiàn)在下一列存儲器寄存器組APSR執(zhí)行指令備注[][N+K][]RdRnRmPCNZCV地址標號指令

MNKI+4

I

Rd→[Rn+Rm]

M

I+6

I+2

存儲器[]

[N+K]

M[]

寄存器組RdM

RnN

RmK

PCI+4I+6APSRN

Z

C

V

執(zhí)行指令地址II+2標號

指令

備注Rd→[Rn+Rm]

數(shù)據(jù)傳輸指令處理器內部的寄存器要與存儲器進行數(shù)據(jù)交互,如何實現(xiàn)寄存器與存儲單元之間的數(shù)據(jù)傳輸呢?同時需要多個寄存器與存儲器進行交互是處理中是常事。如何設計指令讓控制單元能夠自動完成多個數(shù)據(jù)傳輸操作呢?寄存器與寄存器之間也要不斷交換數(shù)據(jù),寄存器從指令寄存器中獲取立即數(shù),寄存器與特殊寄存器之間交換部分位的值。這些需要何種指令來實現(xiàn)?02請在插入菜單—頁眉和頁腳中修改此文本8尋址加載從存儲單元到寄存器存儲從寄存器到存儲單元有效地址(EA)所要訪問的存儲單元的地址尋址計算所要訪問的存儲單元的有效地址某寄存器保存的地址(也稱為基地址)和偏移量之和地址回寫將有效地址保存到寄存器中存儲單元助記符指出EA的計算參與者指出是否地址回寫尋址方式存儲單元助記符有效地址地址回寫立即數(shù)偏移前序尋址[Rn,#offset]EA=Rn+offset無[Rn,#offset]!EA=Rn+offsetRn=EA寄存器偏移前序尋址[Rn,Rm,LSL#n]EA=Rn+(Rm<<n)無后序尋址[Rn],#offsetEA=RnRn=EA+offset寄存器存儲器存儲加載請在插入菜單—頁眉和頁腳中修改此文本9訪問指令訪問指令格式<oprcode>Rd,<mem><oprcode>為加載或存儲指令LDR(加載)STR(存儲)Rd為寄存器<mem>是存儲單元訪問數(shù)據(jù)類型字節(jié)(B)8位半字(H)16位字32位雙字(D)64位取值有符號數(shù)(S)、無符號數(shù)指令示例功能描述LDRBRd,<mem>從<mem>讀取8位無符號數(shù)加載到Rd中LDRSBRd,<mem>從<mem>讀取8位有符號數(shù)加載到Rd中LDRHRd,<mem>從<mem>讀取16位無符號數(shù)加載到Rd中LDRSHRd,<mem>從<mem>讀取16位有符號數(shù)加載到Rd中LDRRd,<mem>從<mem>讀取32位數(shù)加載到Rd中LDRDRdLo,RdHi,<mem>從<mem>讀取64位數(shù)加載到RdLo和RdHi中,RdLo和RdHi分別存儲低32位和高32位STRBRd,<mem>將Rd的低8位數(shù)存儲到<mem>中STRHRd,<mem>將Rd的低16位數(shù)存儲到<mem>中STRRd,<mem>將Rd的值存儲到<mem>中STRDRdLo,RdHi,<mem>將RdLo和RdHi組合成的64位數(shù)存儲到<mem>中,RdLo和RdHi分別保存數(shù)的低32位和高32位請在插入菜單—頁眉和頁腳中修改此文本10立即數(shù)偏移前序尋址有效地址是寄存器Rn保存的基地址與立即數(shù)偏移量offset之和指令格式LDRRd,[Rn,#offset];從地址Rn+offset處讀取32位數(shù)加載到Rd中STRRd,[Rn,#offset];將Rd的值存儲到地址Rn+offset處LDRRd,[Rn,#offset]!;Rd←[Rn+offset],Rn←Rn+offsetSTRRd,[Rn,#offset]!;Rd→[Rn+offset],Rn←Rn+offset存儲器寄存器組執(zhí)行指令[20001000]R0R1R283828180200010001234567800000001STRBR1,[R0,#1]!83827880200010011234567800000001LDRSHR1,[R0,#1]8382788020001001FFFF838200000001-請在插入菜單—頁眉和頁腳中修改此文本11文本池訪問讀取程序代碼空間的只讀數(shù)據(jù)采用以PC作為基地址的立即數(shù)偏移尋址存儲器寄存器組執(zhí)行指令[0000101C]R0PC123456782000100100001004LDRR0,[PC,#0x18]123456781234567800001006-請在插入菜單—頁眉和頁腳中修改此文本12寄存器偏移前序尋址有效地址是兩個寄存器Rn和Rm的值之和Rn保存基地址Rm保存偏移量(偏移量可以通過移位生成新的偏移量)指令格式LDRRd,[Rn,Rm,#n];Rd←[Rn+(Rm<<n)]STRRd,[Rn,Rm,#n];Rd→[Rn+(Rm<<n)]存儲器寄存器組執(zhí)行指令[20001000]R0R1R283828180200010001234567800000001STRBR1,[R0,R2]83827880200010001234567800000001LDRSHR1,[R0,R2,LSL#1]8382788020001000FFFF838200000001-請在插入菜單—頁眉和頁腳中修改此文本13后序尋址存儲單元的有效地址是基地址寄存器的值,在訪問存儲器同時將地址值與偏移量相加得到新的值更新基地址寄存器指令格式LDRRd,[Rn],#offset;Rd

[Rn],Rn

Rn+offsetSTRRd,[Rn],#offset;Rd

[Rn],Rn

Rn+offset存儲器寄存器組執(zhí)行指令[20001000]R0R1838281802000100112345678STRBR1,[R0],#1838278802000100212345678LDRSHR1,[R0],#28382788020001004FFFF8382-請在插入菜單—頁眉和頁腳中修改此文本14多數(shù)據(jù)加載/存儲讀或寫存儲器中多個連續(xù)數(shù)據(jù)多加載是指數(shù)據(jù)從多個存儲單元到多個寄存器LDM多存儲是指數(shù)據(jù)從多個寄存器到多個存儲單元STM訪問時地址會自動增減只支持32位數(shù)據(jù)的讀寫兩種地址更新類型IA-每次讀/寫后增大地址DB-每次讀/寫前減小地址寄存器存儲器多存儲多加載寄存器寄存器寄存器寄存器寄存器請在插入菜單—頁眉和腳中修改此文本15多數(shù)據(jù)加載/存儲指令寄存器列表由m個寄存器構成的集合由“{”和“}”分別作為首尾助記符多個寄存器按順序從小到大排列寄存器之間采用“,”分隔{R1,R3,R5,R7}序號連續(xù)的多個寄存器采用“-”來表示{R3-R6}相當于{R3,R4,R5,R6}序號連續(xù)和不連續(xù)的寄存器混合在一起,

“,”和“-”組合使用{R0-R3,R5,R7-R10}就表示{R0,R1,R2,R3,R5,R7,R8,R9,R10}序號大的寄存器對應高地址存儲單元,序號小的寄存器對應低地址存儲單元指令實例功能描述LDMIARn,<reg_list>LDMIARn!,<reg_list>從存儲器讀取多個字保存在列表中的寄存器里。訪問地址初值為Rn的值,每次讀取后加4。若有!則在讀完后將訪問地址Rn+4m回寫到Rn。LDMDBRn,<reg_list>LDMDBRn!,<reg_list>從存儲器讀取多個字保存在列表中的寄存器里。訪問地址初值為Rn的值,每次讀取前減4。若有!則在讀完后將訪問地址Rn-4m回寫到Rn。STMIARn,<reg_list>STMIARn!,<reg_list>將列表中的寄存器的值寫入存儲器,訪問地址初值為Rn的值,每次寫入后加4。若有!則在寫完后將訪問地址Rn+4m回寫到Rn。STMDBRn,<reg_list>STMDBRn!,<reg_list>將列表中的寄存器的值寫入存儲器,訪問地址初值為Rn的值,每次寫入前減4。若有!則在寫完后將訪問地址Rn-4m回寫到Rn。16多數(shù)據(jù)存儲寄存器組R001234567012345670123456701234567R189ABCDEF89ABCDEF89ABCDEF89ABCDEFR25A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5AR32000101020001004200010102000101C存儲器[20001004]00000000012345670000000000000000[20001008]0000000089ABCDEF0000000000000000[2000100C]000000005A5A5A5A0000000000000000[20001010]00000000000000000000000001234567[20001014]00000000000000000000000089ABCDEF[20001018]0000000000000000000000005A5A5A5A執(zhí)行指令STMDBR3!,{R0-R2}-STMIAR3!,{R0-R2}-請在插入菜單—頁眉和頁腳中修改此文本17多數(shù)據(jù)加載寄存器組R000000000111111110000000044444444R100000000222222220000000055555555R200000000333333330000000066666666R32000101020001004200010102000101C存儲器[20001004]11111111111111111111111111111111[20001008]22222222222222222222222222222222[2000100C]33333333333333333333333333333333[20001010]44444444444444444444444444444444[20001014]55555555555555555555555555555555[20001018]66666666666666666666666666666666執(zhí)行指令LDMDBR3!,{R0-R2}-LDMIAR3!,{R0-R2}-請在插入菜單—頁眉和頁腳中修改此文本18堆棧操作堆棧操作是一種特殊的多存儲和多加載操作SP為地址寄存器且地址加減方向固定。壓棧指令PUSH每次存儲時先讓SP自減4再將數(shù)據(jù)保存在SP所指的存儲單元STMDBSP!,<reg_list>彈棧指令POP每次加載時先從SP所指的存儲單元讀取數(shù)據(jù)再將SP自加4LDMIASP!,<reg_list>存儲區(qū)可采用STR/LDR和STM/LDM指令實例功能描述PUSH<reg_list>將列表中的寄存器值壓入棧中保存POP<reg_list>從棧中彈出值保存在列表中的寄存器中使用SP訪問時要小心!因為SP是專用的指針,其值出現(xiàn)錯誤會導致有些操作出錯。請在插入菜單—頁眉和頁腳中修改此文本19寄存器之間兩條指令原值傳輸MOVRd,Rn;16位指令,寄存器Rn的值賦給寄存器Rd反值傳輸MVNRd,Rn;16位指令,寄存器Rn的值取反賦給寄存器Rd寄存器組指令R0R19ABCDEF012345678MOVR1,R09ABCDEF09ABCDEF0MVNR1,R09ABCDEF06543210F-請在插入菜單—頁眉和頁腳中修改此文本20立即數(shù)加載立即數(shù)保存在指令中保存在指令空間的存儲單元中四種指令MOVRd,#imm16位指令,將立即數(shù)imm賦給寄存器Rd由8位立即數(shù)左移0-23位得到的常數(shù)奇偶字節(jié)完全相同的數(shù)MOVWRd,#imm32位指令,將16位立即數(shù)imm賦給寄存器Rd的低16位MOVTRd,#imm32位指令,將16位立即數(shù)imm賦給寄存器Rd的高16位LDRRd,[PC,#offset]文本池訪問將立即數(shù)imm預先存儲在指令空間,使用該指令加載寄存器組存儲器執(zhí)行指令R0PC[00001004]00000000--MOVWR0,#0x123400001234--MOVTR0,#0x567856781234--MOVR0,#0x12000000120000100012345678LDRR0,[PC,#0x4]123456780000100212345678-請在插入菜單—頁眉和頁腳中修改此文本21立即數(shù)加載LDRRd,=imm實現(xiàn)立即數(shù)賦值給寄存器的操作LDR是偽指令根據(jù)立即數(shù)的特點自動選擇指令由8位立即數(shù)左移0-23位得到的常數(shù)或奇偶字節(jié)完全相同的常數(shù)MOVRd,#imm1-16位常數(shù)MOVWRd,#imm17-32位常數(shù)LDRRd,[PC,#offset]大于16位的立即數(shù)采用MOVW和MOVT兩條指令比文本池訪問效率高LDRR0,=0x12345678MOVWR0,#0x5678MOVTR0,#0x1234請在插入菜單—頁眉和頁腳中修改此文本22寄存器與特殊寄存器之間特殊寄存器CONTROLPRIMASKFAULTMASKBASEPRI只允許使用MRS和MSR實現(xiàn)與通用寄存器之間交互數(shù)據(jù)特殊寄存器Rs的值復制到通用寄存器RdMRSRd,Rs將通用寄存器Rd的值復制到特殊寄存器RsMSRRs,Rd數(shù)據(jù)運算指令

在微處理器系統(tǒng)實際應用中,數(shù)據(jù)會被進行各種處理(運算)。其中,最主要的就是算術運算、邏輯運算、移位運算和比較運算。這些需要何種指令來實現(xiàn)?03請在插入菜單—頁眉和頁腳中修改此文本24數(shù)據(jù)運算數(shù)據(jù)會被進行各種處理(運算)算術運算、邏輯運算、移位運算和比較運算目的操作數(shù)只能是寄存器,源操作數(shù)只能是寄存器或立即數(shù)寄存器與寄存器寄存器與常數(shù)完成運算的同時還可以對寄存器APSR中的標志位進行清0或置116位的數(shù)據(jù)運算指令都影響這些標志位32位的數(shù)據(jù)運算指令通過操作助記符后綴S來影響這些標志位請在插入菜單—頁眉和頁腳中修改此文本25標志位更新APSR負值(N)執(zhí)行結果為負置1,否則清01-負值,0-非負值零值(Z)執(zhí)行結果為0置1,否則清01-零值,0-非零值進位(C)無符號加法產(chǎn)生進位時置1,否則清0無符號減法未產(chǎn)生借位時置1,否則清01-產(chǎn)生進位或未產(chǎn)生借位,0-沒有產(chǎn)生進位或產(chǎn)生借位溢出(V)有符號加或減產(chǎn)生進位或借位時置1,否則清01-有符號數(shù)運算溢出,0-沒有溢出操作結果NZCV0x70000000+0x700000000xE000000010010x90000000+0x900000000x3000000000110x80000000+0x800000000x0000000001110x00001234-0x000010000x0000023400100x00000004-0x000000050xFFFFFFFF10000x80000005-0x800000040x0000000100100x70000000-0xF00000000x8000000010010xA0000000-0xA00000000x000000000110請在插入菜單—頁眉和頁腳中修改此文本26算術運算加ADD/ADDS(dst=src1+src2)ADC/ADCS(dst=src1+src2+C)減SUB/SUBS(dst=src1-src2)SBC/SBCS(dst=src1-src2-~C)乘MUL/MULS(dst=src1×src2)UMLL/SMLL(無/有符號dst_64=src1×src2)除UDIV/SDIV(無/有符號dst=src1÷src2)乘加MLA(dst=src3+src1×src2)UMLAL/SMALL(無/有符號dst_64+=src1×src2)MLS(dst=src3-src1×src2)寄存器組APSR執(zhí)行指令R0R1R2NZCV8000000080000000FFFFFFFF0000ADDR2,R1,R08000000080000000000000000000ADDSR2,R1,R08000000080000000000000000111ADCSR2,R1,R08000000080000000000000010011ADDSR2,R08000000080000000800000011000SBCSR2,R1,R08000000080000000FFFFFFFF1000SUBSR2,R1,R08000000080000000000000000110-第1條指令執(zhí)行時,雖有進位、溢出和零值,但因指令沒有S后綴,所以不影響APSR。第2條指令加上后綴S,產(chǎn)生的進位、溢出和零值更新APSR中的標志位。請在插入菜單—頁眉和頁腳中修改此文本27邏輯運算位與AND/ANDS(dst=src1&src2)位或ORR/ORRS(dst=src1|src2)位異或EOR/EORS(dst=src1^src2)位與非BIC/BICS(dst=src1&(~src2))寄存器組APSR執(zhí)行指令R0R1R2NZCVFFFF666600003333000000000000ANDSR2,R1,R0FFFF666600003333000022220000ORRSR2,R1,R0FFFF666600003333FFFF77771000EORSR2,R1,R0FFFF666600003333FFFF55551000BICSR2,R1,R0FFFF666600003333000011110000-請在插入菜單—頁眉和頁腳中修改此文本28比較與測試比較CMP寄存器與寄存器或立即數(shù)相減,更新標志位CMN寄存器與寄存器或立即數(shù)相加,更新標志位測試TST寄存器與寄存器或立即數(shù)進行位與運算,更新標志位TEQ寄存器與寄存器或立即數(shù)進行位異或運算,更新標志位請在插入菜單—頁眉和頁腳中修改此文本29移位運算某些位的數(shù)值搬移到其他位置相當于二進制乘除運算。邏輯左移LSL/LSLS(dst=src1<<src2)邏輯右移LSR/LSRS(dst=src1>>src2)算術右移ASR/ASRS(dst=src1>>src2)循環(huán)移位ROR/RORS(dst=src1>>src2)寄存器組APSR執(zhí)行指令R0R1R2NZCV00000001F0F0F0F2000000000000LSLSR2,R1,R000000001F0F0F0F2E1E1E1E41010LSRSR2,R1,R000000001F0F0F0F2787878790000ASRSR2,R1,R000000001F0F0F0F2F87878791000RORSR2,R1,R000000001F0F0F0F2787878790000-數(shù)據(jù)轉換指令在微處理器系統(tǒng)實際應用中,有時候需要對數(shù)據(jù)進行擴展和重組。這些需要何種指令來實現(xiàn)?04請在插入菜單—頁眉和頁腳中修改此文本31數(shù)據(jù)擴展有符號數(shù):最高位填充SXTB/SXTHRd,Rn{,

ROR

#m}無符號數(shù):0填充UXTB/UXTHRd,Rn{,

ROR

#m}擴展相加U/SXTAB、U/SXTAHRd,Rn,Rm{,

ROR

#m}將Rm值按無/有符號和字節(jié)/半字擴展后與Rn相加,和保存在Rd中m只能取8或16或24請在插入菜單—頁眉和頁腳中修改此文本32反序與重組反序高低字節(jié)的順序轉換字節(jié)反序REVRd,Rn字節(jié)按序反轉半字反序REV16Rd,Rn每個半字內字節(jié)反轉反轉擴展REVSHRd,Rn反轉低半字并有符號擴展重組兩個不同數(shù)之間高低半字重構新字前高后低PKHTBRd,Rn,Rm{,LSL#m}前低后高PKHBTRd,Rn,Rm{,LSL#m}請在插入菜單—頁眉和頁腳中修改此文本33位域處理位反轉RBITRd,Rm位清除BFCRd,#m,#n位插入BFIRd,Rn,#m,#n位提取擴展U/SBFXRd,Rn,#m,#n零前導計數(shù)CLZRd,Rm統(tǒng)計Rm前導為0的位數(shù)流程控制指令程序是由按照特定順序排列的若干指令構成的。重新對PC賦值,可以實現(xiàn)對程序流程的控制,屬于流程控制指令。05請在插入菜單—頁眉和頁腳中修改此文本35流程控制程序是由按照特定順序排列的若干指令構成的在執(zhí)行程序時,處理器通過PC自增來實現(xiàn)按地址順序逐條讀指執(zhí)行因需停止后續(xù)指令執(zhí)行而轉向其他的地址取指執(zhí)行將新地址賦給PC重新對PC賦值,可以實現(xiàn)對程序流程的控制PC的低位必須置1常用的兩條指令跳轉有去無回調用有去有回跳槽出差請在插入菜單—頁眉和頁腳中修改此文本36跳轉不再按順序執(zhí)行下一條指令,而是要執(zhí)行其他地址所保存的指令把要轉移到的指令地址賦給PC,處理器從新地址重新讀取指令無條件跳轉強制轉移條件跳轉需要根據(jù)運算結果的狀態(tài)來決定具體的執(zhí)行指令比較跳轉比較后再轉移查表跳轉根據(jù)值在存儲區(qū)中獲取轉移地址地址信息在指令中或寄存器中地址信息在指令中地址信息在指令中地址信息在存儲器中請在插入菜單—頁眉和頁腳中修改此文本37無條件跳轉B<label>程序跳轉到label處繼續(xù)執(zhí)行跳轉范圍不能超過+/-2KBB.W<label> 32位的跳轉指令跳轉范圍可以達+/-16MBBX<Rm> 跳轉地址在寄存器Rm中寄存器組執(zhí)行指令備注R0PC地址標號指令

00001021000010100000100C

Bop1

0000102100001020

讀指0000102100001022

譯指、讀指000010210000102400001020op1-執(zhí)行、譯指、讀指

00001021000010100000100C

BXR0讀指0000102100001020

讀指0000102100001022

譯指、讀指000010210000102400001020op1-執(zhí)行、譯指、讀指跳轉語句使處理器內部的操作流水線中斷,重新開始新的操作流水線跳轉一次額外增加兩個指令周期的時間請在插入菜單—頁眉和頁腳中修改此文本38條件跳轉條件跳轉在執(zhí)行時,先檢查APSR中的標志位并判斷是否符合條件B<cond><label>若<cond>成立,則執(zhí)行<label>處指令,否則繼續(xù)執(zhí)行后續(xù)指令寄存器組APSR執(zhí)行指令R0PCNZCV地址標號指令000000010000101001100000100C

BNEop1000000010000101201100000100E

--------

-000000010000101001100000100C

BEQop100000001000010200110

00000001000010220110

0000000100001024011000001020op1-請在插入菜單—頁眉和頁腳中修改此文本39比較跳轉比較和跳轉兩個操作融合為一體的指令不支持后向跳轉,只能向前跳轉不受APSR影響,也不影響標志位CBZRn,<label>寄存器的值為零時跳轉CBNZRn,<label>寄存器的值不為零時跳轉CMPRn,

#0BEQ<label>CMPRn,

#0BNE<label>寄存器組APSR執(zhí)行指令R0PCNZCV地址標號指令000010010000101000000000100C

CBNZR0,op100001001000010200000

00001001000010220000

0000100100001024000000001020Op1

000010010000101000000000100C

CBZR0,op1000010010000101200000000100E

-請在插入菜單—頁眉和頁腳中修改此文本40查表跳轉從偏移表中獲取前向轉移量并計算出跳轉地址TBB以字節(jié)為單位的查表轉移字節(jié)表首地址為Rd的值序號為Rn值的存儲字節(jié)為前向跳轉偏移量前向跳轉地址偏移量范圍為4-514與PC值一起計算前向跳轉地址TBH以半字為單位的查表轉移字節(jié)表首地址為Rd的值序號為Rn值的存儲半字為前向跳轉偏移量前向跳轉地址偏移量范圍為4~131074與PC值一起計算前向跳轉地址請在插入菜單—頁眉和頁腳中修改此文本41查表跳轉查表指令當前PC為0x00002000R0為0時跳轉至0x00002000,地址偏移量為0x00TBB和TBH前向偏移量為0x00R0為1時跳轉至0x00002040,地址偏移量為0x40TBB和TBH前向偏移量為0x20R0為2時跳轉至0x000020A0,地址偏移量為0xA0TBB和TBH前向偏移量為0x50R0為3時跳轉至0x000020C0,地址偏移量為0xC0TBB和TBH前向偏移量為0x60偏移表保存在0x00004000TBB存儲地址分別為0x00004000、0x00004001、0x00004002、0x00004003TBH存儲地址分別為0x00004000、0x00004002、0x00004004、0x00004006請在插入菜單—頁眉和頁腳中修改此文本42調用有返回地址的跳轉將下一條指令地址保存在LR中并將跳轉地址賦給PC下一條指令地址也稱為返回地址將返回地址賦給PC后執(zhí)行調用指令的下一條指令BL<label>跳轉到<label>處繼續(xù)執(zhí)行同時將返回地址保存在LR中BLXRm跳轉到Rm所指定的地址同時將返回地址保存在LR中寄存器組執(zhí)行指令R0LRPC地址標號指令-00001001000010100000100C

BLop1-0000101100001020

-0000101100001022

-000010110000102400001020op1

----

-0000102100001001000010100000100C

BLR0000010210000100F00001020

000010210000100F00001022

000010210000100F0000102400001020op1

在使用BL指令之前,根據(jù)具體情況來決定是否保存LR值。如需要,則將LR值壓入堆棧來保存。異常處理指令異常處理相關的指令主要有:系統(tǒng)服務調用(SVC)指令和改變處理器狀態(tài)(CPS)指令。06請在插入菜單—頁眉和頁腳中修改此文本44異常處理系統(tǒng)服務調用(SVC)SVC#imm產(chǎn)生一個SVC異常,使處理器進入特權處理模式imm表示一個8位立即數(shù)具體數(shù)值不會影響SVC異常的響應動作用作輸入?yún)?shù)當執(zhí)行SVC指令時產(chǎn)生了SVC異常,其異常類型是11異常處理程序入口地址保存在地址0x0000002C處從該地址讀取一個字將R0-R3、R12、LR、返回地址和xPSR壓入堆棧用0xFFFFFFF9、0x0100000B和異常處理程序入口地址更新LR和xPSR和PC從PC處讀取指令執(zhí)行異常處理程序R011111111111111111111111111111111R122222222222222222222222222222222R233333333333333333333333333333333R344444444444444444444444444444444R1255555555555555555555555555555555SP20000400200003E0200003E0200003E0LRFFFFFFFFFFFFFFF9FFFFFFF9FFFFFFF9PC00000058000000620000006400000066xSPR010000000100000B0100000B0100000B[0000002C]00000063000000630000006300000063[200003E0]00000000111111111111111111111111[200003E4]00000000222222222222222222222222[200003E8]00000000333333333333333333333333[200003EC]00000000444444444444444444444444[200003F0]00000000555555555555555555555555[200003F4]00000000FFFFFFFFFFFFFFFFFFFFFFFF[200003F8]00000000000000560000005600000056[200003FC]00000000010000000100000001000000地址00000054

00000062指令SVC#7

-請在插入菜單—頁眉和頁腳中修改此文本45異常處理改變處理器狀態(tài)(CPS)實現(xiàn)異常使能和禁止異常返回觸發(fā)將EXC_RETURN賦給PC根據(jù)EXC_RETURN值來訪問??臻g將進入異常時入棧的寄存器數(shù)值恢復到寄存器組中指令格式指令功能CPSIEI使能中斷(清除PRIMASK)CPSIDI禁止中斷(設置PRIMASK),NMI和HardFault不受影響CPSIEF使能中斷(清除FAULTMASK)CPSIDF禁止中斷(設置FAULTMASK),NMI不受影響返回指令描述BX<reg>EXC_RETURN數(shù)值在寄存器中時使用,禁用MOVPC,<reg>POP{PC}或POP{…,PC}EXC_RETURN數(shù)值在堆棧中時使用,PC為目的寄存器之一LDR或LDMEXC_RETURN數(shù)值在存儲器中時使用,PC為目的寄存器之一DSP指令數(shù)據(jù)處理涉及多數(shù)并行運算、數(shù)值范圍限定、數(shù)位變化、不同數(shù)位的合成等操作。Cortex-M4支持飽和運算、乘法和乘累加指令,還支持單指令多數(shù)據(jù)操作(SIMD)。07請在插入菜單—頁眉和頁腳中修改此文本47飽和運算當數(shù)據(jù)超出計算范圍時,將其值置為最大或最小不會發(fā)生溢出U/SSATRd,#imm,Rn,{,#shift}將Rn{移位結果}按imm位進行計算大于最大值取最大值小于最小值取最小值指令格式功能描述QADDRd,Rn,RmRd=Q<Rn+Rm>QSUBRd,Rn,RmRd=Q<Rn-Rm>QDADDRd,Rn,RmRd=Q<Rn+Q<2×Rm>>QDSUBRd,Rn,RmRd=Q<Rn-Q<2×Rm>>請在插入菜單—頁眉和頁腳中修改此文本48單指令多數(shù)據(jù)(SIMD)運算一條指令可以同時處理多個數(shù)據(jù)支持多個數(shù)據(jù)并行加減運算4組8位普通加減及半加減運算指令格式功能描述SADD8/UADD8Rd,Rn,Rm有/無符號8位數(shù)加4組,Rd.b=Rn.b+Rm.bQADD8/UQADD8Rd,Rn,Rm有/無符號8位數(shù)加4組,Rd.b=QB<Rn.b+Rm.b>SSUB8/USUB8Rd,Rn,Rm有/無符號8位數(shù)減4組,Rd.b=Rn.b-Rm.bQSUB8/UQSUB8Rd,Rn,Rm有/無符號8位數(shù)減4組,Rd.b=QB<Rn.b-Rm.b>SHADD8/UHADD8Rd,Rn,Rm有/無符號8位數(shù)半加4組,Rd.b=(Rn.b+Rm.b)÷2SHSUB8/UHSUB8Rd,Rn,Rm有/無符號8位數(shù)半H4組,Rd.b=(Rn.b-Rm.b)÷2請在插入菜單—頁眉和頁腳中修改此文本49單指令多數(shù)據(jù)(SIMD)運算2組16位普通加減及半加減運算指令格式功能描述SADD16/UADD16Rd,Rn,Rm有/無符號16位數(shù)加2組,Rd.h=Rn.h+Rm.hQADD16/UQADD16Rd,Rn,Rm有/無符號16位數(shù)加2組,Rd.h=QH<Rn.h+Rm.h>SSUB16/USUB16Rd,Rn,Rm有/無符號16位數(shù)減2組,Rd.h=Rn.h-Rm.hQSUB16/UQSUB16Rd,Rn,Rm有/無符號16位數(shù)減2組,Rd.h=QH<Rn.h-Rm.h>SHADD16/UHADD16Rd,Rn,Rm有/無符號16位數(shù)半加2組,Rd.h=(Rn.h+Rm.h)÷2SHSUB16/UHSUB16Rd,Rn,Rm有/無符號16位數(shù)半減2組,Rd.h=(Rn.h-Rm.h)÷2請在插入菜單—頁眉和頁腳中修改此文本50單指令多數(shù)據(jù)(SIMD)運算支持高半字(T)和低半字(B)同時進行交叉加減或半加減運算指令功能描述SASX/UASXRd,Rn,Rm有/無符號數(shù),Rd.T=Rn.T+Rm.B||Rd.B=Rn.B-Rm.TSSAX/USAXRd,Rn,Rm有/無符號數(shù),Rd.T=Rn.T-Rm.B||Rd.B=Rn.B+Rm.TSHASX/UHASXRd,Rn,Rm有/無符號數(shù),Rd.T=(Rn.T+Rm.B)÷2||Rd.B=(Rn.B-Rm.T)÷2SHSAX/UHSAXRd,Rn,Rm有/無符號數(shù),Rd.T=(Rn.T-Rm.B)÷2||Rd.B=(Rn.B+Rm.T)÷2請在插入菜單—頁眉和頁腳中修改此文本51單指令多數(shù)據(jù)(SIMD)運算半字擴展雜項指令指令功能SXTB16Rd,Rn{,ROR#m}{循環(huán)右移后}高低半字的低字節(jié)分別按有符號字節(jié)展開Rd.T=(RRn.23,…,RRn.23:16)Rd.B=(RRn.7,…,RRn.7:0)UXTB16Rd,Rn{,ROR#m}{循環(huán)右移后}高低半字的低字節(jié)分別按無符號字節(jié)展開Rd.T=(0,…,0,RRn.23:16)Rd.B=(0,…,0,RRn.7:0)SXTAB16Rd,Rn,Rm{,ROR#m}{循環(huán)右移后}高低半字的低字節(jié)分別按有符號字節(jié)

溫馨提示

  • 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

提交評論