📄 ip.s
字号:
.module ip.c
.area text(rom, con, rel)
.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\ip.c
.dbfunc e ip_packhandle _ip_packhandle fc
; handleok -> R20
; ipcksum -> y+0
; sou_ip0 -> R14
; sou_ip1 -> R22
; sou_ip2 -> R10
; sou_ip3 -> R12
; ipheadlen -> y+10
; offset -> y+8
; ippackid -> y+6
; protocol -> R20
; totallen -> y+4
; ipbegin -> R4,R5
.even
_ip_packhandle::
xcall push_gset5
movw R4,R16
sbiw R28,11
.dbline -1
.dbline 19
; #include "main.h"
; #include "rtl8019as.h"
; #include "arp.h"
; #include "ip.h"
; #include "icmp.h"
; #include "udp.h"
;
; extern unsigned int ip_id;
; extern unsigned char tempip_d3;
; extern unsigned char tempip_d2;
; extern unsigned char tempip_d1;
; extern unsigned char tempip_d0;
; unsigned char tempip_d3;
; unsigned char tempip_d2;
; unsigned char tempip_d1;
; unsigned char tempip_d0;
;
; unsigned char ip_packhandle(unsigned char *ipbegin)
; {
.dbline 20
; unsigned char handleok=0;
clr R20
.dbline 21
; unsigned char ipheadlen=0;
clr R0
std y+10,R0
.dbline 22
; unsigned int totallen=0;
clr R1
std y+5,R1
std y+4,R0
.dbline 23
; unsigned int ippackid=0;
std y+7,R1
std y+6,R0
.dbline 24
; unsigned int offset=0;
std y+9,R1
std y+8,R0
.dbline 25
; unsigned char protocol=0;
.dbline 26
; unsigned char sou_ip3=0;
clr R12
.dbline 27
; unsigned char sou_ip2=0;
clr R10
.dbline 28
; unsigned char sou_ip1=0;
clr R22
.dbline 29
; unsigned char sou_ip0=0;
clr R14
.dbline 30
; unsigned int ipcksum=0;
clr R2
clr R3
std y+1,R3
std y+0,R2
.dbline 32
;
; if((*(ipbegin+16)!=myip_3) || //匹配本地IP,不匹配者忽略
movw R30,R4
ldd R24,z+16
cpi R24,192
brne L6
movw R30,R4
ldd R24,z+17
cpi R24,168
brne L6
movw R30,R4
ldd R2,z+18
tst R2
brne L6
movw R30,R4
ldd R24,z+19
cpi R24,99
breq L2
L6:
.dbline 37
; (*(ipbegin+17)!=myip_2) ||
; (*(ipbegin+18)!=myip_1) ||
; (*(ipbegin+19)!=myip_0)
; )
; {
.dbline 38
; return 0;
clr R16
xjmp L1
L2:
.dbline 41
; }
;
; ipheadlen=((*ipbegin)&0x0F); //获取ip头长度
movw R30,R4
ldd R24,z+0
andi R24,15
std y+10,R24
.dbline 42
; ipheadlen<<=2;
mov R0,R24
lsl R0
lsl R0
std y+10,R0
.dbline 43
; totallen=*(ipbegin+2); //获取总长度
ldd R2,z+2
clr R3
std y+5,R3
std y+4,R2
.dbline 44
; totallen<<=8;
movw R0,R2
mov R1,R0
clr R0
std y+5,R1
std y+4,R0
.dbline 45
; totallen|=*(ipbegin+3);
movw R30,R4
ldd R2,z+3
clr R3
or R0,R2
or R1,R3
std y+5,R1
std y+4,R0
.dbline 47
;
; ippackid=*(ipbegin+4); //获取ip包id
movw R30,R4
ldd R2,z+4
clr R3
std y+7,R3
std y+6,R2
.dbline 48
; ippackid<<=8;
movw R0,R2
mov R1,R0
clr R0
std y+7,R1
std y+6,R0
.dbline 49
; ippackid|=*(ipbegin+5);
movw R30,R4
ldd R2,z+5
clr R3
or R0,R2
or R1,R3
std y+7,R1
std y+6,R0
.dbline 51
;
; offset=*(ipbegin+6); //获取包偏移量
movw R30,R4
ldd R2,z+6
clr R3
std y+9,R3
std y+8,R2
.dbline 52
; offset<<=8;
movw R0,R2
mov R1,R0
clr R0
std y+9,R1
std y+8,R0
.dbline 53
; offset|=*(ipbegin+7);
movw R30,R4
ldd R2,z+7
clr R3
or R0,R2
or R1,R3
std y+9,R1
std y+8,R0
.dbline 55
;
; protocol=*(ipbegin+9); //获取协议类型
movw R30,R4
ldd R20,z+9
.dbline 57
;
; sou_ip3=*(ipbegin+12); //获取源IP
movw R30,R4
ldd R12,z+12
.dbline 58
; sou_ip2=*(ipbegin+13);
movw R30,R4
ldd R10,z+13
.dbline 59
; sou_ip1=*(ipbegin+14);
movw R30,R4
ldd R22,z+14
.dbline 60
; sou_ip0=*(ipbegin+15);
movw R30,R4
ldd R14,z+15
.dbline 62
;
; tempip_d3=sou_ip3;
sts _tempip_d3,R12
.dbline 63
; tempip_d2=sou_ip2;
sts _tempip_d2,R10
.dbline 64
; tempip_d1=sou_ip1;
sts _tempip_d1,R22
.dbline 65
; tempip_d0=sou_ip0;
sts _tempip_d0,R14
.dbline 67
;
; switch(protocol)
mov R2,R20
clr R3
std y+3,R3
std y+2,R2
movw R24,R2
cpi R24,6
ldi R30,0
cpc R25,R30
brne X2
xjmp L8
X2:
ldi R24,6
cp R24,R2
cpc R25,R3
brlt L18
L17:
ldd R24,y+2
ldd R25,y+3
cpi R24,1
ldi R30,0
cpc R25,R30
breq L10
xjmp L8
L18:
ldd R24,y+2
ldd R25,y+3
cpi R24,17
ldi R30,0
cpc R25,R30
brne X3
xjmp L14
X3:
xjmp L8
X0:
.dbline 68
; {
L10:
.dbline 70
; case 1: //ICMP协议
; if(icmp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
ldd R2,y+10
clr R3
ldd R18,y+4
ldd R19,y+5
sub R18,R2
sbc R19,R3
mov R16,R2
clr R17
add R16,R4
adc R17,R5
push R4
push R5
xcall _icmp_packhandle
pop R5
pop R4
tst R16
brne X4
xjmp L11
X4:
.dbline 71
; {
.dbline 72
; ip_id++; //生成IP标识
lds R24,_ip_id
lds R25,_ip_id+1
adiw R24,1
sts _ip_id+1,R25
sts _ip_id,R24
.dbline 73
; *(ipbegin+4)=(ip_id>>8)&0xFF;
mov R24,R25
clr R25
andi R25,0
movw R30,R4
std z+4,R24
.dbline 74
; *(ipbegin+5)=(ip_id&0xFF);
lds R24,_ip_id
lds R25,_ip_id+1
andi R25,0
movw R30,R4
std z+5,R24
.dbline 76
;
; *(ipbegin+10)=0;//求头部校验和
clr R2
movw R30,R4
std z+10,R2
.dbline 77
; *(ipbegin+11)=0;
movw R30,R4
std z+11,R2
.dbline 78
; ipcksum=tsum((unsigned int *)ipbegin,ipheadlen); //校验和的求法
ldd R18,y+10
clr R19
movw R16,R4
push R16
push R17
xcall _tsum
pop R5
pop R4
std y+1,R17
std y+0,R16
.dbline 79
; *(ipbegin+10)=ipcksum&0xFF;
movw R24,R16
andi R25,0
movw R30,R4
std z+10,R24
.dbline 80
; *(ipbegin+11)=(ipcksum>>8)&0xFF;
movw R24,R16
mov R24,R25
clr R25
andi R25,0
movw R30,R4
std z+11,R24
.dbline 82
;
; *(ipbegin+12)=myip_3;//写入本地IP
ldi R24,192
movw R30,R4
std z+12,R24
.dbline 83
; *(ipbegin+13)=myip_2;
ldi R24,168
movw R30,R4
std z+13,R24
.dbline 84
; *(ipbegin+14)=myip_1;
clr R2
movw R30,R4
std z+14,R2
.dbline 85
; *(ipbegin+15)=myip_0;
ldi R24,99
movw R30,R4
std z+15,R24
.dbline 87
;
; *(ipbegin+16)=sou_ip3;//写入远程IP
movw R30,R4
std z+16,R12
.dbline 88
; *(ipbegin+17)=sou_ip2;
movw R30,R4
std z+17,R10
.dbline 89
; *(ipbegin+18)=sou_ip1;
movw R30,R4
std z+18,R22
.dbline 90
; *(ipbegin+19)=sou_ip0;
movw R30,R4
std z+19,R14
.dbline 91
; break;
xjmp L8
L11:
.dbline 93
; }
; protocol=0;
clr R20
.dbline 94
; break;
xjmp L8
X1:
.dbline 96
; case 6: //TCP协议
; break;
L14:
.dbline 99
;
; case 17: //UDP协议
; if(udp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
ldd R2,y+10
clr R3
ldd R18,y+4
ldd R19,y+5
sub R18,R2
sbc R19,R3
mov R16,R2
clr R17
add R16,R4
adc R17,R5
xcall _udp_packhandle
tst R16
breq L15
.dbline 100
; {
.dbline 101
; break;
xjmp L8
L15:
.dbline 103
; }
; protocol=0;
clr R20
.dbline 105
;
; default:break;
L8:
.dbline 108
; }
;
; return(protocol);
mov R16,R20
.dbline -2
L1:
adiw R28,11
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r handleok 20 c
.dbsym l ipcksum 0 i
.dbsym r sou_ip0 14 c
.dbsym r sou_ip1 22 c
.dbsym r sou_ip2 10 c
.dbsym r sou_ip3 12 c
.dbsym l ipheadlen 10 c
.dbsym l offset 8 i
.dbsym l ippackid 6 i
.dbsym r protocol 20 c
.dbsym l totallen 4 i
.dbsym r ipbegin 4 pc
.dbend
.dbfunc e ip_buildpack _ip_buildpack fV
; i -> R10
; sum -> R10,R11
; des_ip0 -> y+22
; des_ip1 -> y+20
; des_ip2 -> y+18
; des_ip3 -> y+16
; protocol -> y+14
; ipid -> y+12
; totallen -> R22,R23
; ipsendbuffer -> R20,R21
.even
_ip_buildpack::
xcall push_gset3
movw R22,R18
movw R20,R16
sbiw R28,6
.dbline -1
.dbline 120
; }
;
; void ip_buildpack(unsigned char *ipsendbuffer,
; unsigned int totallen,
; unsigned int ipid,
; unsigned char protocol,
; unsigned char des_ip3,
; unsigned char des_ip2,
; unsigned char des_ip1,
; unsigned char des_ip0
; )
; {
.dbline 121
; unsigned char i=0;
clr R10
.dbline 122
; unsigned int sum=0;
clr R11
.dbline 123
; ip_id++; //生成IP标识
lds R24,_ip_id
lds R25,_ip_id+1
adiw R24,1
sts _ip_id+1,R25
sts _ip_id,R24
.dbline 124
; *ipsendbuffer=0x45; //版本4,头部长20
ldi R24,69
movw R30,R20
std z+0,R24
.dbline 125
; *(ipsendbuffer+1)=0x00; //服务类型
clr R2
std z+1,R2
.dbline 126
; *(ipsendbuffer+2)=totallen>>8;
movw R2,R22
mov R2,R3
clr R3
movw R30,R20
std z+2,R2
.dbline 127
; *(ipsendbuffer+3)=(totallen&0xFF);
movw R24,R22
andi R25,0
movw R30,R20
std z+3,R24
.dbline 128
; *(ipsendbuffer+4)=ipid>>8;
ldd R2,y+12
ldd R3,y+13
mov R2,R3
clr R3
movw R30,R20
std z+4,R2
.dbline 129
; *(ipsendbuffer+5)=(ipid&0xFF);
ldd R24,y+12
ldd R25,y+13
andi R25,0
movw R30,R20
std z+5,R24
.dbline 130
; *(ipsendbuffer+6)=0;
clr R2
movw R30,R20
std z+6,R2
.dbline 131
; *(ipsendbuffer+7)=0;
movw R30,R20
std z+7,R2
.dbline 132
; *(ipsendbuffer+8)=128;
ldi R24,128
movw R30,R20
std z+8,R24
.dbline 133
; *(ipsendbuffer+9)=protocol;
movw R30,R20
ldd R0,y+14
std z+9,R0
.dbline 134
; *(ipsendbuffer+10)=0;
movw R30,R20
std z+10,R2
.dbline 135
; *(ipsendbuffer+11)=0;
movw R30,R20
std z+11,R2
.dbline 136
; *(ipsendbuffer+12)=myip_3;
ldi R24,192
movw R30,R20
std z+12,R24
.dbline 137
; *(ipsendbuffer+13)=myip_2;
ldi R24,168
movw R30,R20
std z+13,R24
.dbline 138
; *(ipsendbuffer+14)=myip_1;
movw R30,R20
std z+14,R2
.dbline 139
; *(ipsendbuffer+15)=myip_0;
ldi R24,99
movw R30,R20
std z+15,R24
.dbline 140
; *(ipsendbuffer+16)=des_ip3;
movw R30,R20
ldd R0,y+16
std z+16,R0
.dbline 141
; *(ipsendbuffer+17)=des_ip2;
movw R30,R20
ldd R0,y+18
std z+17,R0
.dbline 142
; *(ipsendbuffer+18)=des_ip1;
movw R30,R20
ldd R0,y+20
std z+18,R0
.dbline 143
; *(ipsendbuffer+19)=des_ip0;
movw R30,R20
ldd R0,y+22
std z+19,R0
.dbline 145
;
; sum=tsum((unsigned int *)ipsendbuffer,20); //校验和的求法
ldi R18,20
ldi R19,0
movw R16,R20
xcall _tsum
movw R10,R16
.dbline 146
; *(ipsendbuffer+10)=(sum&0xFF);
movw R24,R10
andi R25,0
movw R30,R20
std z+10,R24
.dbline 147
; *(ipsendbuffer+11)=(sum>>8)&0xFF;
movw R24,R10
mov R24,R25
clr R25
andi R25,0
movw R30,R20
std z+11,R24
.dbline 149
;
; totallen-=20;
subi R22,20
sbci R23,0
.dbline 151
;
; switch(protocol)
ldd R2,y+14
clr R3
std y+5,R3
std y+4,R2
movw R24,R2
cpi R24,17
ldi R30,0
cpc R25,R30
breq L23
xjmp L21
X5:
.dbline 152
; {
L23:
.dbline 154
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,16
std y+1,R25
std y+0,R24
movw R18,R22
movw R16,R20
subi R16,236 ; offset = 20
sbci R17,255
xcall _udp_buildpack
.dbline 155
movw R24,R22
sbiw R24,8
std y+1,R25
std y+0,R24
ldi R18,<_udpsendbuffer_ex
ldi R19,>_udpsendbuffer_ex
movw R16,R20
subi R16,236 ; offset = 20
sbci R17,255
xcall _udp_builddata
.dbline 156
.dbline 158
L21:
.dbline -2
L19:
adiw R28,6
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbsym r sum 10 i
.dbsym l des_ip0 22 c
.dbsym l des_ip1 20 c
.dbsym l des_ip2 18 c
.dbsym l des_ip3 16 c
.dbsym l protocol 14 c
.dbsym l ipid 12 i
.dbsym r totallen 22 i
.dbsym r ipsendbuffer 20 pc
.dbend
.area bss(ram, con, rel)
.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\ip.c
_tempip_d0::
.blkb 1
.dbsym e tempip_d0 _tempip_d0 c
_tempip_d1::
.blkb 1
.dbsym e tempip_d1 _tempip_d1 c
_tempip_d2::
.blkb 1
.dbsym e tempip_d2 _tempip_d2 c
_tempip_d3::
.blkb 1
.dbsym e tempip_d3 _tempip_d3 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -