读书人

【真心请问】一段很短的ARM代码逻辑

发布时间: 2013-01-22 10:23:54 作者: rapoo

【真心请教】一段很短的ARM代码,逻辑上有点乱了,求伪代码或C代码
本帖最后由 giter888 于 2013-01-10 11:27:59 编辑 其中isOurApk_ptr DCD 0xFFFFFFFF
另外,那个R10,R11哪来的啊?


EXPORT com_aes_Exec_decryptData
com_aes_Exec_decryptData

var_11C= -0x11C

PUSH {R4-R7,LR} ; Push registers
MOV R7, R11 ; Rd = Op2
MOV R6, R10 ; Rd = Op2
MOV R5, R9 ; Rd = Op2
MOV R4, R8 ; Rd = Op2
PUSH {R4-R7} ; Push registers
MOVS R4, R3 ; Rd = Op2
LDR R3, =(isOurApk_ptr - 0x1184) ; Load from Memory
SUB SP, SP, #0xFC ; Rd = Op1 - Op2
MOV R10, R0 ; Rd = Op2
ADD R3, PC ; Rd = Op1 + Op2
LDR R3, [R3] ; Load from Memory
MOVS R5, #0 ; Rd = Op2
LDR R3, [R3] ; Load from Memory
CMP R3, #1 ; Set cond. codes on Op1 - Op2
BNE loc_120C ; Branch


[解决办法]
PUSH以上可以暂时放开,只是跳转前的寄存器现场保存,3个ldr命令,第一条将符号地址-去xx的地址值装到R3,第2个ldr是将R3里面的数据表示的地址值的那段数据装到R3,这时候的R3是第一条ldr的地址值+PC的地址值,第3个同理第2个.

最后哦的cmp和bne 就简单了,第一个比较,不等就跳到后面那个符号地址去执行.

PUSH保存了现场等下就回的来.
[解决办法]
引用:
PUSH以上可以暂时放开,只是跳转前的寄存器现场保存,3个ldr命令,第一条将符号地址-去xx的地址值装到R3,第2个ldr是将R3里面的数据表示的地址值的那段数据装到R3,这时候的R3是第一条ldr的地址值+PC的地址值,第3个同理第2个.

最后哦的cmp和bne 就简单了,第一个比较,不等就跳到后面那个符号地址去执行.

PUSH保存了现场等下就回的来.
……


第一个ldr我手误打错了,应该是符号地址-去xx的地址值指向的那段内存的值,装到R3,
ldr reg,=(a) 这种都是把 ()里面的东西当地址值,这条指令相当与 reg = *a;

读书人网 >汇编语言

热点推荐