<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編中^、!、cxsf符號(hào)和movs等指令使用

          ARM匯編中^、!、cxsf符號(hào)和movs等指令使用

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏

          .macro restore_user_regs
          ldr r1,[sp, #S_PSR]
          ldr lr,[sp, #S_PC]! @ !用來(lái)控制基址變址尋址的最終新地址是否進(jìn)行回寫(xiě)操作,
          @執(zhí)行l(wèi)dr之后sp被回寫(xiě)成sp+#S_PC基址變址尋址的新地址
          msrspsr,r1 @把cpsr的值保存到spsr中
          ldmdb sp,{r0 - lr}^ @lr=[sp-1*4],r13=[sp-2*4],r12=[sp-3*4],......,r0=[sp-15*4]
          @因?yàn)闆](méi)對(duì)pc賦值,所以^的表示將數(shù)據(jù)恢復(fù)到User模式的[r0-lr]寄存器組中[gliethttp]
          mov r0,r0
          add sp,sp,#S_FRAME_SIZE - S_PC
          movs pc,lr
          .endm

          本文引用地址:http://www.ex-cimer.com/article/201611/318785.htm

          其他指令正在學(xué)習(xí)中[隨時(shí)補(bǔ)充gliethttp]
          -----------------------------
          1.ldr ip,[sp],#4將sp中內(nèi)容存入ip,之后sp=sp+4;
          ldr ip,[sp,#4]將sp+4這個(gè)新地址下內(nèi)容存入ip,之后sp值保持不變
          ldr ip,[sp,#4]!將sp+4這個(gè)新地址下內(nèi)容存入ip,之后sp=sp+4將新地址值賦給sp
          str ip,[sp],#4將ip存入sp地址處,之后sp=sp+4;
          str ip,[sp,#4]將ip存入sp+4這個(gè)新地址,之后sp值保持不變
          str ip,[sp,#4]!將ip存入sp+4這個(gè)新地址,之后sp=sp+4將新地址值賦給sp
          -----------------------------
          2.movs r1,#3 ;movs將導(dǎo)致ALU被更改,因?yàn)閞1賦值非0,即操作結(jié)果r0非0,所以ALU的Z標(biāo)志清0
          bne 1f;因?yàn)閆=0,說(shuō)明不等,所以向前跳到標(biāo)號(hào)1:所在處繼續(xù)執(zhí)行其他語(yǔ)句
          -----------------------------
          3.LDM表示裝載,STM表示存儲(chǔ).
          LDMED LDMIB預(yù)先增加裝載
          LDMFD LDMIA過(guò)后增加裝載
          LDMEA LDMDB預(yù)先減少裝載
          LDMFA LDMDA過(guò)后減少裝載

          STMFA STMIB預(yù)先增加存儲(chǔ)
          STMEA STMIA過(guò)后增加存儲(chǔ)
          STMFD STMDB預(yù)先減少存儲(chǔ)
          STMED STMDA過(guò)后減少存儲(chǔ)

          注意ED不同于IB;只對(duì)于預(yù)先減少裝是相同的.在存儲(chǔ)的時(shí)候,ED是過(guò)后減少的.
          FD、ED、FA、和EA指定是滿棧還是空棧,是升序棧還是降序棧.
          對(duì)于存儲(chǔ)STM而言
          先加后存FA姑且這么來(lái)記,先加(first add),存數(shù)據(jù)
          后加先存EA姑且這么來(lái)記,存數(shù)據(jù),后加end add
          先減后存FD姑且這么來(lái)記,先減first dec,存數(shù)據(jù)
          后減先存ED姑且這么來(lái)記,存數(shù)據(jù),后減end dec
          然后記憶LDM,LDM是STM的反相彈出動(dòng)作,所以
          因?yàn)槭窍燃雍蟠?所以后減先取FA就成了與STM對(duì)應(yīng)的取數(shù)據(jù),后減
          因?yàn)槭呛蠹酉却?所以先減后取EA就成了與STM對(duì)應(yīng)的先減,取數(shù)據(jù)
          因?yàn)槭窍葴p后存,所以后加先取FD就成了與STM對(duì)應(yīng)的取數(shù)據(jù),后加
          因?yàn)槭呛鬁p先存,所以先加后取ED就成了與STM對(duì)應(yīng)的先加,取數(shù)據(jù)
          我想通過(guò)上面的變態(tài)方式可以比較容易的記住這套指令[gliethttp]
          一個(gè)滿棧的棧指針指向上次寫(xiě)的最后一個(gè)數(shù)據(jù)單元,而空棧的棧指針指向第一個(gè)空閑單元.
          一個(gè)降序棧是在內(nèi)存中反向增長(zhǎng)(就是說(shuō),從應(yīng)用程序空間結(jié)束處開(kāi)始反向增長(zhǎng))而升序棧在內(nèi)存中正向增長(zhǎng).
          其他形式簡(jiǎn)單的描述指令的行為,意思分別是
          IA過(guò)后增加(Increment After)、
          IB預(yù)先增加(Increment Before)、
          DA過(guò)后減少(Decrement After)、
          DB預(yù)先減少(Decrement Before).

          RISC OS使用傳統(tǒng)的滿降序棧.在使用符合APCS規(guī)定的編譯器的時(shí)候,它通常把你的棧指針設(shè)置在應(yīng)用程序空間的
          結(jié)束處并接著使用一個(gè)FD(滿降序-Full Descending)棧.如果你與一個(gè)高級(jí)語(yǔ)言(BASIC或C)一起工作,你將別無(wú)選擇.
          棧指針(傳統(tǒng)上是R13)指向一個(gè)滿降序棧.你必須繼續(xù)這個(gè)格式,或則建立并管理你自己的棧.
          -----------------------------
          4.
          teq r1,#0 //r1-0,將結(jié)果送入狀態(tài)標(biāo)志,如果r1和0相減的結(jié)果為0,那么ALU的Z置位,否則Z清0
          bne reschedule//ne表示Z非0,即:不等,那么執(zhí)行reschedule函數(shù)
          -----------------------------
          5.使用tst來(lái)檢查是否設(shè)置了特定的位
          tst r1,#0x80 //按位and操作,檢測(cè)r1的0x1<<7,即第7位是否置1,按位與之后結(jié)果為0,那么ALU的Z置位
          beq reset //如果Z置位,即:以上按位與操作結(jié)果是0,那么跳轉(zhuǎn)到reset標(biāo)號(hào)執(zhí)行
          -----------------------------
          6.^的理解
          ^是一個(gè)后綴標(biāo)志,不能在User模式和Sys系統(tǒng)模式下使用該標(biāo)志.該標(biāo)志有兩個(gè)存在目的:
          6.1.對(duì)于LDM操作,同時(shí)恢復(fù)的寄存器中含有pc(r15)寄存器,那么指令執(zhí)行的同時(shí)cpu自動(dòng)將spsr拷貝到cpsr中
          如:在IRQ中斷返回代碼中[如下為ads環(huán)境下的代碼gliethttp]
          ldmfd {r4} //讀取sp中保存的的spsr值到r4中
          msr spsr_cxsf,r4 //對(duì)spsr的所有控制為進(jìn)行寫(xiě)操作,將r4的值全部注入spsr
          ldmfd {r0-r12,lr,pc}^//當(dāng)指令執(zhí)行完畢,pc跳轉(zhuǎn)之前,將spsr的值自動(dòng)拷貝到cpsr中[gliethttp]
          6.2.數(shù)據(jù)的送入、送出發(fā)生在User用戶模式下的寄存器,而非當(dāng)前模式寄存器
          如:ldmdb sp,{r0 - lr}^;表示sp棧中的數(shù)據(jù)到User分組寄存器r0-lr中,而不是恢復(fù)到當(dāng)前模式寄存器r0-lr
          當(dāng)然對(duì)于User,System,IRQ,SVC,Abort,Undefined這6種模式來(lái)說(shuō)[gliethttp]r0-r12是共用的,只是r13和r14
          為分別獨(dú)有,對(duì)于FIQ模式,僅僅r0-r7是和前6中模式的r0-r7共用,r8-r14都是FIQ模式下專有.



          -----------------------------
          7.spsr_cxsf,cpsr_cxsf的理解
          c-control field maskbyte(PSR[7:0])
          x-extension field maskbyte(PSR[15:8])
          s-status field maskbyte(PSR[23:16)
          f-flags field maskbyte(PSR[31:24]).
          老式聲明方式:cpsr_flg,cpsr_all在ADS中已經(jīng)不在支持
          cpsr_flg對(duì)應(yīng)cpsr_f
          cpsr_all對(duì)應(yīng)cpsr_cxsf

          需要使用專用指令對(duì)cpsr和spsr操作:mrs,msr
          mrs tmp,cpsr //讀取CPSR的值
          bic tmp,tmp,#0x80 //如果第7位為1,將其清0
          msr cpsr_c,tmp //對(duì)控制位區(qū)psr[7:0]進(jìn)行寫(xiě)操作
          -----------------------------
          8.cpsr的理解
          CPSR = Current Program Status Register
          SPSR = Saved Program Status Registers
          CPSR寄存器(和保存它的SPSR寄存器)



          (上圖)
          N,Z,C,V稱為ALU狀態(tài)標(biāo)志
          N:如果結(jié)果是負(fù)數(shù)則置位
          Z:如果結(jié)果是零則置位
          C:如果發(fā)生進(jìn)位則置位
          V:如果發(fā)生溢出則置位
          I:置位表示禁用IRQ中斷,清0表示使能IRQ
          F:置位表示禁用FIQ中斷,清0表示使能FIQ
          T:置位表示系統(tǒng)運(yùn)行在Thumb態(tài),清0表示運(yùn)行在ARM態(tài)
          M[4:0]:
          10000 User模式,和System系統(tǒng)模式一樣
          10001 FIQ模式
          10010 IRQ模式
          10011 SVC超級(jí)管理模式
          10111 Abort數(shù)據(jù)異常模式
          11011 Undefined未定義指令模式
          11111 System系統(tǒng)模式,和User模式一樣

          舉例:
          ands r2,r2,#7使用運(yùn)算結(jié)果改變標(biāo)志位,如果運(yùn)算結(jié)果r2=0,那么Z置位,EQ相等判斷成立
          subs r2,r2,#1使用運(yùn)算結(jié)果改變標(biāo)志位,如果運(yùn)算結(jié)果r2=0,那么Z置位,EQ相等判斷成立
          beq wordcopy
          -----------------------------
          9.指令后綴和條件判斷



          (上圖)
          EQ :等于
          NE :不等
          CS :無(wú)符號(hào)>=
          CC :無(wú)符號(hào)<
          MI :負(fù)數(shù)
          PL :非負(fù)[>=0]
          VS :溢出
          VC :無(wú)溢出
          HI :無(wú)符號(hào)>
          LS :無(wú)符號(hào)<=
          GE :有符號(hào)>=
          LT :有符號(hào)<
          GT :有符號(hào)>
          LE :有符號(hào)<=
          AL :總是[默認(rèn)]

          對(duì)于arm匯編指令,可以參考linux內(nèi)核的arch/arm目錄,那里的匯編指令很豐富[gliethttp_20080603]
          __CopyFromStart
          ; ldr r3, [r9],#4
          ; str r3, [r7], #4
          ; sub r8, r8, #4
          ldrb r3, [r9], #1
          strb r3, [r7], #1
          sub r8, r8, #1
          cmp r8, #0
          bgt __CopyFromStart
          b __JumpToBootImage

          __JumpToBootImage
          MOV pc, r0




          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();