汇编语言:尝试理解一个小函数

mad*_*ada 12 assembly arm

对于我的工作,我需要反转这部分代码(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)

Cur*_*urd 6

除了最后两行,它可能类似于以下内容.
如果我不是100%正确,请不要打我.

如果
R0p0p
R1n
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)


Fil*_*erg 1

怎么样:ARM 指令集

一些提示/简化的汇编

  • 推送 - 将某些内容放入“堆栈”/内存中
  • 添加 - 通常“添加”,如 +
  • Pop 从“堆栈”/内存中检索一些内容
  • CMP - 是 Compare 的缩写,将某物与另一物进行比较。

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的一点介绍。简化。

尝试理解上面的代码并检查指令集。