📄 lwipchk.s
字号:
/* r0=dataptr, r1=len, r2=acc, r3=load_value */
/* 调试这个函数的时候,遇到了许多问题。主要是dataptr的问题。如果
dataptr不是4字节对齐,那么程序就会跑到ABORT中。
现在改进算法,使dataptr在两字节对齐时也可以正确计算。但是dataptr不能
是单字节对齐。否则仍然会进行到ABORT中。
*/
.global lwip_chksum
lwip_chksum:
and r3,r0,#3 /* 不对齐的位数 */
bic r0,r0,#0x00000003 /* 使dataptr 4 字节对齐 */
add r1,r1,r3 /* 对齐后的新长度 */
cmp r1, #3
ble return
stmfd sp!,{r3} /*把不对齐的位数存入堆栈 */
ldr r2, =MASKTABLE2
ldr r2, [r2,r3,lsl #2] /*读取相应的掩码 */
ldr r3, [r0],#4
and r3, r2, r3 /*需要另外加到累计量的值*/
stmfd sp!,{r3} /* 额外累计量放入堆栈 */
sub r1, r1,#4
mov r2, #0 /* 累计量为0 */
loop1: cmp r1,#3
ble end1
ldr r3,[r0],#4
adds r2,r2,r3
adc r2,r2,#0
sub r1,r1,#4
b loop1
end1:
ldmfd sp!,{r3} /*取出额外累计量*/
adds r2,r2,r3
adc r2,r2,#0 /*加上额外的累计量*/
ldr r3,=MASKTABLE1
ldr r3,[r3,r1,lsl #2]
ldr r1,[r0]
and r3,r3,r1
adds r2,r2,r3
adc r2,r2,#0
bic r3, r2, #0xff000000
bic r3, r3, #0x00ff0000
add r2,r3,r2, lsr #16
bic r3, r2, #0xff000000
bic r3, r3, #0x00ff0000
add r2,r3,r2, lsr #16
ldmfd sp!, {r3} /*取出不对齐的位数*/
and r3,r3,#0x1
cmp r3,#0
beq NoReverse
and r3,r2,#0xff /*r2低8位与高8位交换*/
mov r3,r3,lsl #8
add r2,r3,r2,lsr #8
NoReverse:
mov r0,r2
MOV pc, lr
return:
mov r0, #0
mov pc, lr
MASKTABLE1:
.long 0x00000000
.long 0x000000ff
.long 0x0000ffff
.long 0x00ffffff
MASKTABLE2:
.long 0xffffffff
.long 0xffffff00
.long 0xffff0000
.long 0xff000000
.global htonl
.global ntohl
ntohl:
htonl:
and r3,r0,#0xFF
and r2,r0,#0xFF00
and r1,r0,#0xFF0000
mov r0,r0,lsr #24
orr r0,r0,r3,lsl #24
orr r0,r0,r2,lsl #8
orr r0,r0,r1,lsr #8
mov pc,lr
.global htons
.global ntohs
htons:
ntohs:
and r3,r0,#0xFF
and r2,r0,#0xFF00
mov r0,r3,lsl #8
orr r0,r0,r2,lsr #8
mov pc,lr
/***************************************************/
/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -