对于我的工作,我需要反转这部分代码(ARM9)正在做的事情.我是一个java开发人员,我真的不明白这部分与单个函数相关的代码.
当然我正在寻求帮助,因为原始代码不是更多可用.任何人都可以帮助我知道这个代码在任何高级语言中使用小算法做了什么?这会很好.我已经尝试了很多个小时没有结果.
sub_FFFF7B38
PUSH {LR}
ADDS R2, R0, #0
LDRB R3, [R2]
CMP R3, #0
BEQ loc_FFFF7B52
SUBS R1, #1
BCC loc_FFFF7B52
loc_FFFF7B46:
ADDS R0, #1
LDRB R3, [R0]
CMP R3, #0
BEQ loc_FFFF7B52
SUBS R1, #1
BCS loc_FFFF7B46
loc_FFFF7B52:
SUBS R0, R0, R2
POP {R1}
Run Code Online (Sandbox Code Playgroud)
除了最后两行,它可能类似于以下内容.
如果我不是100%正确,请不要打我.
如果
R0 是 p0或p和
R1 是 n与
R2 是临时值(编辑;第一我想:i或的地址p0[i])
R3 是临时值
.
sub_FFFF7B38
PUSH {LR} ; save return address
ADDS R2, R0, #0 ; move R0 to R2
LDRB R3, [R2] ; load *p0
CMP R3, #0 ; if *p0==0
BEQ loc_FFFF7B52 ; then jump to loc_FFFF7B52
SUBS R1, #1 ; decrement n
BCC loc_FFFF7B52 ; if there was a borrow (i.e. n was 0): jump to loc_FFFF7B52
loc_FFFF7B46:
ADDS R0, #1 ; increment p
LDRB R3, [R0] ; load *p
CMP R3, #0 ; if *p==0
BEQ loc_FFFF7B52 ; jump to loc_FFFF7B52
SUBS R1, #1 ; decrement n
BCS loc_FFFF7B46 ; if there was no borrow (i.e. n was not 0): jump to loc_FFFF7B46
loc_FFFF7B52:
SUBS R0, R0, R2 ; calculate p - p0
POP {R1} ; ??? I don't understand the purpose of this
; isn't there missing something?
Run Code Online (Sandbox Code Playgroud)
或在C:
int f(char *p0, unsigned int n)
{
char *p;
if (*p0==0 || n--==0)
return 0;
for(p=p0; *++p && n>0; n--)
{
}
return p - p0;
}
Run Code Online (Sandbox Code Playgroud)
怎么样:ARM 指令集
一些提示/简化的汇编
X:or:Whatever:表示下面是一个“子程序”。在 Java 中使用过“goto”吗?其实也类似。
如果您有以下内容(如果它是正确的 arm-asm 则忽略它只是 pseduo ):
PUSH 1
x:
POP %eax
Run Code Online (Sandbox Code Playgroud)
首先,它将 1 放入堆栈,然后将其弹出回 eax(这是扩展 ax 的缩写,它是一个可以放入 32 位数据量的寄存器)
现在,他们会x:做什么呢?好吧,我们假设在此之前还有 100 行 asm,那么您可以使用“跳转”指令导航到x:.
这是对asm的一点介绍。简化。
尝试理解上面的代码并检查指令集。