📄 arp.s
字号:
.module arp.c
.area text(rom, con, rel)
.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\arp.c
.dbfunc e arp_response _arp_response fV
; ip_sou3 -> R14
; ip_sou2 -> R12
; ip_sou1 -> R10
; ip_sou0 -> R20
; mac_sou5 -> R22
; mac_sou4 -> y+28
; mac_sou3 -> y+27
; mac_sou2 -> y+26
; mac_sou1 -> y+25
; mac_sou0 -> y+24
; arpbegin -> R4,R5
.even
_arp_response::
xcall push_gset5
movw R4,R16
sbiw R28,29
.dbline -1
.dbline 9
; #include "main.h"
; #include "rtl8019as.h"
; #include "arp.h"
; #include "ip.h"
; #include "icmp.h"
; #include "udp.h"
;
; void arp_response(unsigned char *arpbegin)
; {
.dbline 10
; unsigned char mac_sou0=0;
clr R0
std y+24,R0
.dbline 11
; unsigned char mac_sou1=0;
std y+25,R0
.dbline 12
; unsigned char mac_sou2=0;
std y+26,R0
.dbline 13
; unsigned char mac_sou3=0;
std y+27,R0
.dbline 14
; unsigned char mac_sou4=0;
std y+28,R0
.dbline 15
; unsigned char mac_sou5=0;
clr R22
.dbline 16
; unsigned char ip_sou0=0;
clr R20
.dbline 17
; unsigned char ip_sou1=0;
clr R10
.dbline 18
; unsigned char ip_sou2=0;
clr R12
.dbline 19
; unsigned char ip_sou3=0;
clr R14
.dbline 22
;
;
; if((*arpbegin==0) && (*(arpbegin+1))==1 && //只处理以太网数据包
movw R30,R4
ldd R2,z+0
tst R2
breq X1
xjmp L1
X1:
ldd R24,z+1
cpi R24,1
breq X2
xjmp L1
X2:
movw R30,R4
ldd R24,z+2
cpi R24,8
breq X3
xjmp L1
X3:
movw R30,R4
ldd R2,z+3
tst R2
breq X4
xjmp L1
X4:
.dbline 24
; (*(arpbegin+2)==0x08) && (*(arpbegin+3))==0x00) //只处理IPv4数据包
; {
.dbline 25
; if((*(arpbegin+24)!=myip_3) || //匹配本地IP,不匹配者忽略
movw R30,R4
ldd R24,z+24
cpi R24,192
brne L8
movw R30,R4
ldd R24,z+25
cpi R24,168
brne L8
movw R30,R4
ldd R2,z+26
tst R2
brne L8
movw R30,R4
ldd R24,z+27
cpi R24,99
breq L4
L8:
.dbline 30
; (*(arpbegin+25)!=myip_2) ||
; (*(arpbegin+26)!=myip_1) ||
; (*(arpbegin+27)!=myip_0)
; )
; {
.dbline 31
; return;
xjmp L1
L4:
.dbline 33
; }
; switch(*(arpbegin+7))
movw R30,R4
ldd R2,z+7
clr R3
std y+23,R3
std y+22,R2
movw R24,R2
cpi R24,1
ldi R30,0
cpc R25,R30
breq L12
cpi R24,2
ldi R30,0
cpc R25,R30
brne X5
xjmp L1
X5:
cpi R24,3
ldi R30,0
cpc R25,R30
brne X6
xjmp L1
X6:
cpi R24,4
ldi R30,0
cpc R25,R30
brne X7
xjmp L1
X7:
xjmp L1
X0:
.dbline 34
; {
L12:
.dbline 36
; case 0x01: //处理ARP请求
; mac_sou5=*(arpbegin+8);
movw R30,R4
ldd R22,z+8
.dbline 37
; mac_sou4=*(arpbegin+9);
movw R30,R4
ldd R2,z+9
std y+28,R2
.dbline 38
; mac_sou3=*(arpbegin+10);
movw R30,R4
ldd R2,z+10
std y+27,R2
.dbline 39
; mac_sou2=*(arpbegin+11);
movw R30,R4
ldd R2,z+11
std y+26,R2
.dbline 40
; mac_sou1=*(arpbegin+12);
movw R30,R4
ldd R2,z+12
std y+25,R2
.dbline 41
; mac_sou0=*(arpbegin+13);
movw R30,R4
ldd R2,z+13
std y+24,R2
.dbline 42
; ip_sou3=*(arpbegin+14);
movw R30,R4
ldd R14,z+14
.dbline 43
; ip_sou2=*(arpbegin+15);
movw R30,R4
ldd R12,z+15
.dbline 44
; ip_sou1=*(arpbegin+16);
movw R30,R4
ldd R10,z+16
.dbline 45
; ip_sou0=*(arpbegin+17);
movw R30,R4
ldd R20,z+17
.dbline 46
; buildpack(mac_sou5,mac_sou4,mac_sou3,mac_sou2,mac_sou1,mac_sou0,
ldi R24,2054
ldi R25,8
std y+21,R25
std y+20,R24
ldi R24,69
std y+18,R24
ldi R24,67
std y+16,R24
ldi R24,73
std y+14,R24
ldi R24,70
std y+12,R24
std y+10,R24
ldi R24,79
std y+8,R24
mov R0,R2
std y+6,R0
ldd R0,y+25
std y+4,R0
ldd R0,y+26
std y+2,R0
ldd R0,y+27
std y+0,R0
ldd R18,y+28
mov R16,R22
push R4
push R5
xcall _buildpack
pop R5
pop R4
.dbline 49
; mynodeid_0,mynodeid_1,mynodeid_2,mynodeid_3,mynodeid_4,mynodeid_5,
; 0x0806);
; *(arpbegin-4)=0x00;
clr R2
movw R30,R4
sbiw R30,4
std z+0,R2
.dbline 50
; *(arpbegin-3)=0x01;
ldi R24,1
movw R30,R4
sbiw R30,3
std z+0,R24
.dbline 51
; *(arpbegin-2)=0x08;
ldi R24,8
movw R30,R4
sbiw R30,2
std z+0,R24
.dbline 52
; *(arpbegin-1)=0x00;
movw R30,R4
sbiw R30,1
std z+0,R2
.dbline 53
; *(arpbegin)=0x06;
ldi R24,6
movw R30,R4
std z+0,R24
.dbline 54
; *(arpbegin+1)=0x04;
ldi R24,4
std z+1,R24
.dbline 55
; *(arpbegin+2)=0x00;
movw R30,R4
std z+2,R2
.dbline 57
;
; *(arpbegin+3)=0x02;
ldi R24,2
movw R30,R4
std z+3,R24
.dbline 59
;
; *(arpbegin+4)=mynodeid_0;
ldi R24,79
movw R30,R4
std z+4,R24
.dbline 60
; *(arpbegin+5)=mynodeid_1;
ldi R24,70
movw R30,R4
std z+5,R24
.dbline 61
; *(arpbegin+6)=mynodeid_2;
movw R30,R4
std z+6,R24
.dbline 62
; *(arpbegin+7)=mynodeid_3;
ldi R24,73
movw R30,R4
std z+7,R24
.dbline 63
; *(arpbegin+8)=mynodeid_4;
ldi R24,67
movw R30,R4
std z+8,R24
.dbline 64
; *(arpbegin+9)=mynodeid_5;
ldi R24,69
movw R30,R4
std z+9,R24
.dbline 66
;
; *(arpbegin+10)=myip_3;
ldi R24,192
movw R30,R4
std z+10,R24
.dbline 67
; *(arpbegin+11)=myip_2;
ldi R24,168
movw R30,R4
std z+11,R24
.dbline 68
; *(arpbegin+12)=myip_1;
movw R30,R4
std z+12,R2
.dbline 69
; *(arpbegin+13)=myip_0;
ldi R24,99
movw R30,R4
std z+13,R24
.dbline 71
;
; *(arpbegin+14)=mac_sou5;
movw R30,R4
std z+14,R22
.dbline 72
; *(arpbegin+15)=mac_sou4;
movw R30,R4
ldd R0,y+28
std z+15,R0
.dbline 73
; *(arpbegin+16)=mac_sou3;
movw R30,R4
ldd R0,y+27
std z+16,R0
.dbline 74
; *(arpbegin+17)=mac_sou2;
movw R30,R4
ldd R0,y+26
std z+17,R0
.dbline 75
; *(arpbegin+18)=mac_sou1;
movw R30,R4
ldd R0,y+25
std z+18,R0
.dbline 76
; *(arpbegin+19)=mac_sou0;
movw R30,R4
ldd R0,y+24
std z+19,R0
.dbline 78
;
; *(arpbegin+20)=ip_sou3;
movw R30,R4
std z+20,R14
.dbline 79
; *(arpbegin+21)=ip_sou2;
movw R30,R4
std z+21,R12
.dbline 80
; *(arpbegin+22)=ip_sou1;
movw R30,R4
std z+22,R10
.dbline 81
; *(arpbegin+23)=ip_sou0;
movw R30,R4
std z+23,R20
.dbline 82
; rtl8019_sendpack(60,0);
clr R18
ldi R16,60
ldi R17,0
xcall _rtl8019_sendpack
.dbline 83
; break;
.dbline 86
;
; case 0x02: //处理ARP应答
; break;
.dbline 89
;
; case 0x03: //处理RARP请求
; break;
.dbline 92
;
; case 0x04: //处理RARP应答
; break;
.dbline 94
;
; default:break;
.dbline 96
; }
; }
.dbline 97
; return;
.dbline -2
L1:
adiw R28,29
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r ip_sou3 14 c
.dbsym r ip_sou2 12 c
.dbsym r ip_sou1 10 c
.dbsym r ip_sou0 20 c
.dbsym r mac_sou5 22 c
.dbsym l mac_sou4 28 c
.dbsym l mac_sou3 27 c
.dbsym l mac_sou2 26 c
.dbsym l mac_sou1 25 c
.dbsym l mac_sou0 24 c
.dbsym r arpbegin 4 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -