ARM組合語言

2021-06-06 14:07:35 字數 1231 閱讀 6347

指令stmfd和ldmfd分析;

根據atpcs規則,我們一般使用fd(full descending)型別的資料棧!所以經常使用的指令就有stmfd和ldmfd,

通過arm對於棧操作和批量load/store指令定址方式,可以知道指令stmfd和ldmfd的位址計算方法:

stmfd指令的定址方式為事前遞減方式(db)

而db定址方式實際記憶體位址為:

start_address = rn - (number_of_set_bits_in(register_list)*4)

end_address = rn - 4

stm指令操作的偽**:

if conditionpassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

memory[address] = ri

address = address + 4

有上面兩個偽**可以得出 stmfd sp!, 的偽**如下:

sp = sp - 9×4;

address = sp;

for i = 0 to 7

memory[address] = ri;

address  = address + 4;

memory[address] = lr;

ldmfd指令的定址方式為事後遞增方式(ia)

ia記憶體的實際位址的偽**

start_address = rn

end_address = rn + (number_of_set_bits_in(register_list)*4) - 4

ldm指令操作的偽**(未考慮pc暫存器):

if conditionpassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

ri = memory[address,4]

address = address + 4

所以ldmfd sp!,^ (;恢復現場,異常處理返回)偽**是:

address = sp;

for i = 0 to 7

ri = memory[address ,4]

address = address + 4;

sp = address;

ARM 組合語言程式設計

教材 嵌入式系統及應用,羅蕾 李允 陳麗蓉等,電子工業出版社 迴圈程式設計 子程式及其呼叫 匯程式設計序訪問全域性 c 變數 普通分支程式 多分支 散轉 程式 程式分支點上有多於兩個以上的執行路徑的程式叫做多分支程式。利用條件測試指令或跳轉表可以實現多分支程式 帶 arm thumb 狀態切換的分支...

ARM組合語言常用知識

在組合語言中包含有兩種指令,分別為 在編寫組合語言時,指令不區分大小寫,即mov與mov意義相同,風格保持一致即可。一般在windows中常採用大寫,在gnu中採用小寫。在組合語言中,段落的注釋採用 注釋 單句的注釋採用符號 例如 mov r1,r2 注釋cmp 比較 eq 相等 ne 不相等mov...

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...