ARM匯編:匯編中IA、IB、DA、DB和FD、ED、FA、EA什么意思?


ARM指令的多數據傳輸(STM、LDM)中,提到:多寄存器的Load和Store指令分為2組:
一組用於數據的存儲與讀取,對應於IA、IB、DA、DB,
一組用於堆棧操作,對應於FD、ED、FA、EA,

兩組中對應的指令含義相同。

IA:increase after   ;表示數據傳輸后地址增加
IB:increase before
DA: decrease after
DB: decrease before

即:

  1.  
    STMIB(地址先增而后完成操作)
  2.  
     
  3.  
    STMFA(滿遞增堆棧)
  4.  
     
  5.  
    STMIA(完成操作而后地址遞增)
  6.  
     
  7.  
    STMEA(空遞增堆棧)
  8.  
     
  9.  
     
  10.  
     
  11.  
    STMDB(地址先減而后完成操作)
  12.  
     
  13.  
    STMFD(滿遞減堆棧)
  14.  
     
  15.  
    STMDA(完成操作而后地址遞減)
  16.  
     
  17.  
    STMED(空遞減堆棧)

上述各組2個指令含義相同只是適用場合不同,同理有:

  1.  
    LDMIB、LDMED;
  2.  
     
  3.  
    LDMIA、LDMFD;
  4.  
     
  5.  
    LDMDB、LDMEA;
  6.  
     
  7.  
    LDMDA、LDMFA。


IA模式表示:每次傳送后地址+4;(After Increase)

DB模式表示:每次傳送前地址-4;(Before Decrease)

多寄存器加載/存儲指令共有8種模式(4個用與數據塊的傳輸,4個用於棧操作)


STMDB和LDMIA指令一般配對使用,STMDB用於將寄存器壓棧,LDMIA用於將寄存器彈出棧,作用是保存使用到的寄存器。


例子1:


指令:stmdb sp!,{r0-r12,lr}
含義:sp = sp - 4,先壓lr,sp = lr(即將lr中的內容放入sp所指的內存地址)。sp = sp - 4,再壓r12,sp = r12。sp = sp - 4,再壓r11,sp = r11......sp = sp - 4,最后壓r0,sp = r0。

如果想要將r0-r12和lr彈出,可以用ldmia指令:ldmia sp!,{r0-r12,lr}

例子2:


STMIA, 比如當前r0指向的內存地址是 0x1000,STMIA R0!,{R1-R7} 就是 首先把r1存入 0x1000,然后r2存入0x1004,然后r3存入0x1008,如果是32位的處理器就是每次加4個字節,以此類推把 r1-r7按照遞增的地址存入,這個r0!就是從r0的地址開始存的意思。STMDB則是地址從r0開始減少,依次存儲。

例子3:


LDMIA:LDM是多寄存器存取的意思,后面參數以“,”分隔,第一個參數是首地址;第二個參數是寄存器列表,並以“{}”括起來。
LDMIA R0!, {R1-R4};R0表示要操作的存儲空間首地址,要操作的數據個數由寄存器列表決定,現在是R1到R4,共4個數據(每個數據是32bits的)

具體:
地址為R0的存儲空間中的數據賦值給R1
地址為R0+4的存儲空間中的數據賦值給R2
地址為R0+8的存儲空間中的數據賦值給R3
地址為R0+12的存儲空間中的數據賦值給R4

所有的示例指令執行前的存儲空間和寄存器情況:
mem32[0x1000C] = 0x04
mem32[0x10008] = 0x03
mem32[0x10004] = 0x02
mem32[0x10000] = 0x01
r0 = 0x00010000
r1 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
執行后存儲空間不變,寄存器變化:
r0 = 0x00010010
r1 = 0x01
r2 = 0x02
r3 = 0x03
r4 = 0x04


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM