Assembly 臂组件中的奇怪STRB
我对编程非常陌生,我想知道STRB在这个反编译代码中到底做了什么,因为我知道LSRS是一个右移,ADDS是将r3增加8个循环,因为BNE在这里检查r3是否等于0x20,如果不是,那么继续循环: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+
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)