Assembly 臂组件中的奇怪STRB

Assembly 臂组件中的奇怪STRB,assembly,arm,Assembly,Arm,我对编程非常陌生,我想知道STRB在这个反编译代码中到底做了什么,因为我知道LSRS是一个右移,ADDS是将r3增加8个循环,因为BNE在这里检查r3是否等于0x20,如果不是,那么继续循环: loc_4EE LSRS.W R1, R5, R3 LSRS.W R2, R6, R3 ADDS R3, #8 STRB R1, [R7,#0x40+var_40] STRB R2, [R7,#0x40+

我对编程非常陌生,我想知道STRB在这个反编译代码中到底做了什么,因为我知道LSRS是一个右移,ADDS是将r3增加8个循环,因为BNE在这里检查r3是否等于0x20,如果不是,那么继续循环:

loc_4EE
LSRS.W          R1, R5, R3
LSRS.W          R2, R6, R3
ADDS            R3, #8
STRB            R1, [R7,#0x40+var_40]
STRB            R2, [R7,#0x40+var_3C]
ADDS            R7, #1
CMP             R3, #0x20 ; ' '
BNE             loc_4EE
下面是变量初始化的全部代码(放在这里,我想这可能很重要)

我对编程相当陌生

是通用编程还是汇编语言编程

下面的片段:

  MOVS            R3, #0
loc_4EE
  LSRS.W          R1, R5, R3
  LSRS.W          R2, R6, R3
  ADDS            R3, #8
  STRB            R1, [R7,#0x40+var_40]
  STRB            R2, [R7,#0x40+var_3C]
  ADDS            R7, #1
  CMP             R3, #0x20 ; ' '
  BNE             loc_4EE
可以用(伪)-C表示为:

unsigned char *r7;    // initialised somewhere to point to some address on stack
unsigned int r5, r6;  // also initialised before this fragment to hold some values
int r3 = 0; 
do
{
   *(r7)   = (unsigned char)(r5>>r3);
   *(r7+4) = (unsigned char)(r6>>r3);
   r3 += 8; 
   r7 += 1;
} while (r3 != 32)
这样做是为了什么?没有线索,因为我们没有任务的上下文。
您可以将其视为从big-endian到little-endian的转换,例如:

如果r5==0xAABBCCDD,r6==0x11223344,则从r7中“堆栈上的地址”开始的8个字节将填充为:

0xDD 0xCC 0xBB 0xAA 0x44 0x33 0x22 0x11

您是否尝试过检查ARM体系结构参考手册或其他ARM指令集参考?
添加R7、SP、#0x2C
因此R7至少是某种帧指针或堆栈帧指针,可能指向本地数组。STRB当然是一个字节存储。@fuzye的原因,到目前为止我理解了一些代码的使用手册,但栈与STRB的理解here@JohnWick我不知道你在寻求什么样的建议。你知道strb是做什么的吗?您的具体问题是什么?您不了解arm文档的哪一部分?
unsigned char *r7;    // initialised somewhere to point to some address on stack
unsigned int r5, r6;  // also initialised before this fragment to hold some values
int r3 = 0; 
do
{
   *(r7)   = (unsigned char)(r5>>r3);
   *(r7+4) = (unsigned char)(r6>>r3);
   r3 += 8; 
   r7 += 1;
} while (r3 != 32)