1.Branch,Exception generating.System instruction
1.1 條件分支:
B.cond指令
指令格式:
其中,cond這4位是決定是否滿足分支跳轉的條件,根據相應的譯法有相應的條件位,label是imm19,是一個偏移地址,下一次分支地址=當前PC+label
CBNZ指令
指令格式:
其中,wt和xt代表的是Rt的譯碼得到的通用目的寄存器的號碼,0-31,當這個寄存器的值(64位)非零,那么執行跳轉,地址當前PC+label偏移地址。
CBZ
CBZ和CBNZ的區別在於判定寄存器的值是非零還是零,與CBNZ類似。
TBNZ
指令格式:
測試位不為0發生跳轉,imm指定目的寄存器的某一個位,『b5:b40』組成,0-63或者0-31,有b5決定。哪個目的寄存器由Rt指定,
label是偏移地址。
TBZ
與TBNZ類似。
1.2 非條件分支,立即(branch unconditional,immediate)
B
指令格式:
label=imm26,為branch的分支指令
BL
指令格式:
直接跳往label+PC地址,並且往X30這個寄存器寫入當前PC+4作為地址標簽。LINK指令與非LINK指令的差別就在於在某個寄存器
寫入當前的地址+4,下一次程序返回(RET),那么就可以直接從這個寄存器拿地址返回,不用指定具體的地址。
1.3 非條件分支,寄存器
非條件branch帶R(寄存器)和imme(立即數)的差別就是跳轉的范圍差別,imme跳轉的范圍小,通過指定當前的偏移地址來跳,
帶R的指令寄存器號碼進行跳轉,可以跳到整個地址空間的任意一個地方。
BLR
指令格式:
直接跳轉到目的寄存器的地址,目的寄存器有Rn進行譯碼,並且把當前PC+4回寫到X30
BR
指令格式:
與BLR差別在於有無回寫。
RET
指令格式:
Xn有Rn譯碼,如果舍棄的話那么默認X30!(什么樣的方式來暗示舍棄?)
1.4 中斷產生和返回
BRK(breakpoint Instruction)
指令格式:
imm=imm16,PE會記住中斷狀態,在ESR_ELx這個寄存器,x由中斷等級決定,EC值=0X3C
並且將相應的imm寫入到ESR_ELx的ISS部分。BRK是16位的imm。
HLT(halt instruction):產生一個halt debug事件(event)
指令格式:
HVC(Generate exception targeting exception level2)
when el0 and secure el1,when SCR_EL3.HCE = 0, this instruction is undefined.
執行這條中斷,PE會在ESR_ELx的EC段寫入0x16,將imm16寫入其ISS段。
SMC(Generate exception targeting exception level3)
Secure Monitor Call cause exception on EL3.
這條指令旨在軟件中斷等級大於等於1的時候有效。當HCR_EL2.TSC和SCR_EL3.SMD都是0的時候,
SMC指令會使PE在ESR_ELx的EC段寫入0x17,並將此帶到EL3,如果HCR_EL2.TSC=1,執行這個指令在
NO-SECURE EL1會產生一個中斷帶到EL2,不用care SCR_EL3.SMD。當HCR_EL2.TSC=0並且SCR_EL3.
SMD =1,這個指令沒有定義。
SVC:supervisor call causes an exception to be taken to el1