ly = (lSum>>2);
上面这句话可以分解为两个指令:
mov r14,r14,asr #2
指令意思是,将r14寄存器中的值(lSum),右移2位,然后又重新保存在r14寄存器中
str r14,[r13,#0x1c]
指令意思是,将r14寄存器中的值,保存到一个局部变量,这个局部变量的存放寄存器是[r13,#0x1c],
NOTE: 与str相对的一个指令是ldr,表示LOAD
[0xe59d0020] ldr r0,[r13,#0x20]
意思是将局部变量寄存器寻址[r13,#0x20]得到的值,装载在r0寄存器中
lSum = pSrcTop[lLeftDb + 1]; 其实就是lSum = *(pSrcTop + lLeftDb + 1);
这个语句的指令集可以是
add r3,r1,r14
指令的意思是,将r14寄存器(lLeftDb)和r1寄存器(pSrcTop)中的值相加,保存在r3寄存器(一个存放pSrcTop + lLeftDb的临时寄存器)中
* ldrb r9,[r3,#1]
第二个指令的意思是,用r3寄存器来寻址,[r3,#1],并取值(*),结果保存在r9寄存器(lSum)中
lSum += pSrcTop[lSrcLineStep + lLeftDb + 1];
其实就是 lSum = lSum + *(pSrcTop + lSrcLineStep + lLeftDb + 1)
换成指令集就是
[0xe084e00e] * add r14,r4,r14
意思是r14寄存器中的pSrcTop,加上r4寄存器中的lSrcLineStep,并仍然保存在r14寄存器中
[0xe08ee001] add r14,r14,r1
意思是r14寄存器,加上r1寄存器(lLeftDb),并保存在r14中
[0xe5dea001] ldrb r10,[r14,#1]
意思是直接寻址,并将结果保存在r10中,*(pSrcTop + lSrcLineStep + lLeftDb + 1)
[0xe08a9009] add r9,r10,r9
意思是lSum = lSum + r10寄存器中的内容,结果保存在r9寄存器中(lSum)
NOTE:
ldrb 和 ldr的区别是
ldrb是对寄存器寻址后取值,然后保存在另一个寄存器。而ldr是直接把寄存器寻址得到的地址值,保存在另一个寄存器
上面这句话可以分解为两个指令:
mov r14,r14,asr #2
指令意思是,将r14寄存器中的值(lSum),右移2位,然后又重新保存在r14寄存器中
str r14,[r13,#0x1c]
指令意思是,将r14寄存器中的值,保存到一个局部变量,这个局部变量的存放寄存器是[r13,#0x1c],
NOTE: 与str相对的一个指令是ldr,表示LOAD
[0xe59d0020] ldr r0,[r13,#0x20]
意思是将局部变量寄存器寻址[r13,#0x20]得到的值,装载在r0寄存器中
lSum = pSrcTop[lLeftDb + 1]; 其实就是lSum = *(pSrcTop + lLeftDb + 1);
这个语句的指令集可以是
add r3,r1,r14
指令的意思是,将r14寄存器(lLeftDb)和r1寄存器(pSrcTop)中的值相加,保存在r3寄存器(一个存放pSrcTop + lLeftDb的临时寄存器)中
* ldrb r9,[r3,#1]
第二个指令的意思是,用r3寄存器来寻址,[r3,#1],并取值(*),结果保存在r9寄存器(lSum)中
lSum += pSrcTop[lSrcLineStep + lLeftDb + 1];
其实就是 lSum = lSum + *(pSrcTop + lSrcLineStep + lLeftDb + 1)
换成指令集就是
[0xe084e00e] * add r14,r4,r14
意思是r14寄存器中的pSrcTop,加上r4寄存器中的lSrcLineStep,并仍然保存在r14寄存器中
[0xe08ee001] add r14,r14,r1
意思是r14寄存器,加上r1寄存器(lLeftDb),并保存在r14中
[0xe5dea001] ldrb r10,[r14,#1]
意思是直接寻址,并将结果保存在r10中,*(pSrcTop + lSrcLineStep + lLeftDb + 1)
[0xe08a9009] add r9,r10,r9
意思是lSum = lSum + r10寄存器中的内容,结果保存在r9寄存器中(lSum)
NOTE:
ldrb 和 ldr的区别是
ldrb是对寄存器寻址后取值,然后保存在另一个寄存器。而ldr是直接把寄存器寻址得到的地址值,保存在另一个寄存器