[英]ARM Assembly - Are the instructions equivalent?
“ stmdb r3 !, {sp,lr}”是否等效於序列?
和
“ ldmia r0 !, {sp,lr}”是否等效於序列?
我誤解了stmdb的功能。 等價於“ stmdb r3 !, {sp,lr}”,將是交換順序“ lr”,然后是“ sp”:
謝謝,維傑
stmdb r3 !, {sp,lr}
str sp,[r3,#-4]!
str lr,[r3,#-4]!
stmdb r3 !, {sp,lr}-在每次傳輸前存儲多個寄存器和遞減地址。 r3基址寄存器和! -將起始r3地址+ offcet寫回r3。 DB-由於4種堆棧類型(全降序堆棧,全升序堆棧,空降序堆棧,空升序堆棧)。 用STM DB對應於Full Descending堆棧。 因此,sp-堆棧指針和lr-鏈接寄存器存儲到由r3和r3尋址的內存中== sizeof(sp)+ sizeof(ls)。 r3 + = 8;
r3指向某個內存地址。
r3-= 8; (4字節指令)將r3移入較低的存儲器地址。 遞減r3。
存儲順序lr-first sp-second。 到r3-8-lr將被存儲,到r3-4 sp將被存儲。
r3-點到端(r3 + = 8);
str sp,[r3,#-4]! (預索引變體)-將sp存儲到r3-4內存地址中並保存r3- = 4;
str lr,[r3,#-4]! -將lr存儲到(r3-4)-4中並保存r3- = 4;
因此,將stmdb r3 !, {sp,lr}-放入更高的地址lr中。 (str sp,[r3,#-4]!)+(str lr,[r3,#-4]!)lr再次位於較高的地址中。
ldmia r0 !, {sp,lr}-之后加載多個增量。
從r0指向的內存中獲取值並將其保存到sp中。 從內存中獲取下一個值並保存到lr中。 r0 + = 8;
ldr sp,[r0],#4-將值從存儲器r0 + 4加載到sp。 ([r0],#4)-后索引變式的第一次加載和下一次編輯r0,r0 + = 4。
ldr lr,[r0],#4-將值從存儲器r0 + 4加載到lr中。
來自較高內存的兩個變量值都復制到了lr中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.