📄 final.asm
字号:
inc DPTR
mov A,R7
movx @DPTR,A
inc DPTR
clr A
movx @DPTR,A
inc DPTR
movx @DPTR,A
mov A,6Fh
jz L463 ;不需要进行UDP 校验
mov A,R7
add A,#12 ;UDP长度+伪头部长度
mov R3,A
mov A,R6
addc A,#0
mov R2,A
mov B,#16h ;校验开始位置
call add_dptr
call checksum
mov B,#28h
call add_dptr
mov A,R4
movx @DPTR,A
inc DPTR
mov A,R5
movx @DPTR,A
L463:
ret
ip_pack:
;--------加上ip报头
;----from DPTR || length :R6,R7 || src_ip&des_ip :060H-067H || protocal :06CH
mov 22H,DPH
mov 23H,DPL
mov A,#45h
movx @DPTR,A
inc DPTR
mov A,#00h
movx @DPTR,A
inc DPTR
mov A,R6 ;总长度
movx @DPTR,A
inc DPTR
mov A,R7
movx @DPTR,A
inc DPTR
mov A,TH0
movx @DPTR,A ;标识
inc DPTR
mov A,TL0
movx @DPTR,A
inc DPTR
clr A
movx @DPTR,A ;分片标志 及片偏移
inc DPTR
movx @DPTR,A
inc DPTR
mov A,#64 ;TTL=64
movx @DPTR,A
inc DPTR
mov A,6Ch ;协议
movx @DPTR,A
inc DPTR
clr A
movx @DPTR,A ;校验和,先设为0
inc DPTR
movx @DPTR,A
inc DPTR
mov R1,#8
mov R0,#60H ;写入IP信息
waitdd:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,waitdd
mov R2,#0
mov R3,#20
mov DPH,22H
mov DPL,23H
call checksum
mov DPH,22H
mov DPL,23H
mov A,DPL
add A,#0AH ;checksum在IP数据包中的偏移量
mov DPL,A
mov A,DPH
addc A,#0
mov DPH,A
mov A,R4
movx @DPTR,A
inc DPTR
mov A,R5
movx @DPTR,A
ret
checksum:
;------------起始地址DPTR,数据长度放在R2,R3中
mov B,#2
mov A,R2
DIV AB
mov R2,A
mov A,B
jz con780
setb F0
con780:
mov A,R3
mov B,#2
DIV AB
jnb F0,con789
setb ACC.7
clr F0
con789:
mov R3,A
clr A
mov R4,A
mov R5,A
clr C
inc R2
loop201:
movx A,@DPTR
addc A,R4
mov R4,A
inc DPTR
movx A,@DPTR
addc A,R5
mov R5,A
inc DPTR
djnz R3,loop201
djnz R2,loop201
mov A,B
jZ loop202
movx A,@DPTR
addc A,R4
mov R4,A
mov A,#0
addc A,R5
mov R5,A
loop202:
mov A,R4
addc A,#0
mov R4,A
mov A,R5
addc A,#0
mov R5,A
jc loop202
mov A,R4
CPL A
mov R4,A
mov A,R5
CPL A
mov R5,A
ret
;----------------------------------------
arp:
;--------完成IP到对应MAC的转换
;参数放在64H-67H,返回值放到50H-55H
;首先判断是否在同一子网内
mov R0,#60h
mov R1,#74h
mov R2,#4
Loop772:
mov A,@R0
anl A,@R1
mov B,A
inc R0
inc R0
inc R0
inc R0
mov A,@R0
anl A,@R1
cjne A,B,L781
inc R1
dec R0
dec R0
dec R0
djnz R2,Loop772
;--在同一子网内
mov 7CH,64h
mov 7DH,65H
mov 7Eh,66H
mov 7Fh,67H
sjmp L793
L781:
;---解析网关地址
mov 7cH,78H
mov 7DH,79H
mov 7Eh,7AH
mov 7fh,7Bh
L793:
mov DPTR,#7000h
movx A,@DPTR ;7000h存放ARP记录的条数
mov 03H,A
mov R2,#0
again112:
mov A,R2
cjne A,03H,L621
sjmp arp_request ;缓存中没有匹配的ip
L621:
inc R2
mov A,dpl
anl A,#0F0h
l626:
add A,#10h
jz l626
mov dpl,A
mov R0,#7Ch
mov R1,#4
loop631:
mov A,@R0
mov B,A
movx A,@DPTR
cjne A,B,again112 ;不匹配,继续查找下一条
inc R0
inc dpl
djnz R1,loop631
mov R0,#50H
mov R1,#6
loop639:
movx A,@DPTR
mov @R0,A
inc R0
inc dpl
djnz R1,loop639
mov B,2Dh ;上次更新时间超过15min or above ,更新
movx A,@DPTR
clr C
subb A,B
jnz arp_request
inc DPTR
mov B,2Eh
movx A,@DPTR
clr C
XCH A,B
subb A,B
mov B,#50h
clr C
subb A,B
jnc arp_request
ret
arp_request:
mov DPH,20h
mov DPL,21h
mov A,#0FFh
mov R1,#6
loop672:
movx @DPTR,A
inc DPTR
djnz R1,loop672
mov R0,#56h
mov R1,#6
loop676:
mov A,@R0
movx @DPTR,A
inc DPTR
inc R0
djnz R1,loop676
PUSH DPH
PUSH DPL
mov R0,#80h ; 80-8AH 存放一段arp 报文
mov R1,#10
mov DPTR,#arp_data
loop689:
clr A
movc A,@A+DPTR
mov @R0,A
inc DPTR
inc R0
djnz R1,loop689
POP DPL
POP DPH
mov R0,#80h
mov R1,#10
loop698:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop698
mov R0,#56h
mov R1,#6
loop707:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop707
mov R0,#60h
mov R1,#4
loop717:
mov A,@R0
movx @DPTR,A
inc DPTR
inc R0
djnz R1,loop717
clr A
mov R1,#6
loop723:
movx @DPTR,A
inc DPTR
djnz R1,loop723
mov R0,#7Ch
mov R1,#4
loop730:
mov A,@R0
movx @DPTR,A
inc DPTR
inc R0
djnz R1,loop730
mov R6,#00h
mov R7,#60
mov DPH,20h
mov DPL,21h
call pac_send ;发送一个ARP请求
mov A,2FH
mov B,A
wait747:
mov A,2FH
clr C
subb A,B
jz wait747
mov DPTR,#7001h
movx A,@DPTR
inc A
movx @DPTR,A
clr C
subb A,#03
jnc exit1203 ;超过3次
Ljmp arp
exit1203: ;ARP失败
mov dPTR,#s20
mov R0,#17
call cout
mov DPTR,#7001h
clr A
movx @DPTR,A
ret
;------------------------------------
arp_update:
;----------90-95 96-99H 中存放mac + ip
mov DPTR,#7000h
movx A,@DPTR ;7000h存放ARP记录的条数
mov 03H,A
mov R2,#0
again780:
mov A,R2
cjne A,03H,L768
sjmp arp_add ;缓存中没有匹配的ip
L768:
inc R2
mov A,dpl
anl A,#0F0h
l772:
add A,#10h
jz l772
mov dpl,A
mov R0,#96h
mov R1,#4
loop776:
mov A,@R0
mov B,A
movx A,@DPTR
cjne A,B,again780 ;不匹配,继续查找下一条
inc R0
inc dpl
djnz R1,loop776
sjmp L788
arp_add:
mov A,dpl
anl A,#0F0h
l791:
add A,#10h
jz l791
mov dpl,A
mov R0,#96h
mov R1,#4
loop799:
mov A,@R0
movx @DPTR,A
inc DPTR
inc R0
djnz R1,loop799
push DPL
mov dpl,#0
inc 03H
mov A,03H
movx @DPTR,A
POP DPL
L788:
mov R0,#90h
mov R1,#6
loop786:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop786
mov A,2DH
movx @DPTR,A
inc DPTR
mov A,2EH
movx @DPTR,A
inc DPTR
mov A,2FH
movx @DPTR,A
ret
arp_rec:
;-----参数DPTR为ARP信息开始处,不包括前面的14字节以头网帧头部----------
mov R1,#7
loop762:
inc DPTR
djnz R1,loop762
movx A,@DPTR
mov B,A
inc DPTR
mov R0,#90h ;将发送者地址信息放入90-99H
mov R1,#10
loop814:
movx A,@DPTR
mov @R0,A
inc R0
inc DPTR
djnz R1,loop814
mov A,B
clr C
subb A,#1
jz arp_reply ;01 ARP请求, 比较是不是本机ip 若是,将其mac 写入缓存并回送一个应答
clr C
subb A,#1 ;02 ARP应答
jz update_arp
sjmp exit00
arp_reply:
mov A,DPl
add A,#6h
mov DPL,A
mov A,DPH
addc A,#0
mov DPH,A
mov R0,#60h
mov R1,#4
loop793:
mov A,@R0
mov B,A
movx A,@DPTR
clr C
subb A,B
jnz exit00 ;不是本机ip
inc R0
inc DPTR
djnz R1,loop793
mov A,DPL
clr C
subb A,#2Ah
mov DPL,A
mov A,DPH
subb A,#0
mov dPH,A ;回到首部
PUSH DPH
PUSH DPL
mov R0,#90h ;dst_mac
mov R1,#6
loop832:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop832
mov R0,#56h ;src_mac
mov R1,#6
loop840:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop840
mov A,DPl
add A,#09h
mov DPL,A
mov A,DPH
addc A,#0
mov DPH,A
mov A,#2
movx @DPTR,A
inc DPTR
mov R0,#56h ;src_mac
mov R1,#6
loop858:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop858
mov R0,#60h ;src_ip
mov R1,#4
loop863:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop863
mov R0,#90h
mov R1,#10
loop875:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loop875
POP DPL
POP DPH
mov R6,#0
mov R7,#60
call pac_send
update_arp:
call arp_update
exit00:
ret
;-----------
;××××××××××××××IP 报头处理××××××××××
ip_rec:
;---------收到一个ip数据包
mov 28h,DPH
mov 29h,DPL
movx A,@DPTR
mov B,A
swap A
anl A,#0Fh
cjne A,#4,return1001
mov A,B
anl A,#0Fh
RL A ;A*4
RL A
mov R2,#0
mov R3,A ;ip 头部长度
inc DPTR
movx A,@DPTR
cjne A,#0,return1001
inc DPTR
movx A,@DPTR
mov R6,A
inc DPTR
movx A,@DPTR
clr C
subb A,R3
mov R7,A
jnc L1011
dec R6
L1011:
inc DPTR
inc DPTR
inc DPTR
inc DPTR
inc DPTR
movx A,@DPTR
mov 5Eh,A ;TTL
inc DPTR
movx A,@DPTR
mov 5Fh,A ;Protocal
mov A,DPL
add A,#07h
mov DPL,A
mov A,DPH
addc A,#0
mov DPH,A
mov R0,#60h
mov R1,#4
L1028:
mov A,@R0
mov B,A
movx A,@dPTR
clr C
subb A,B
jnz return1001
inc R0
inc DPTR
djnz R1,L1028
mov DPh,28h
mov DPL,29h
call checksum ;对ip 数据包进行校验
mov A,R4
jnz return1001
mov A,R5
jnz return1001
mov A,5Fh
cjne A,#01h,con1051
call icmp_rec ;icmp
ret
con1051:
cjne A,#11h,con1053 ;udp
call udp_rec
ret
con1053:
cjne A,#07h,con1056
call tcp_rec ;tcp
ret
con1056:
mov R0,#3
mov R1,#2 ;协议不可达
call icmp_send
return1001:
ret
;××××××××××××IP报头处理××××××××××××
;-----------ICMP----------------
icmp_rec:
;-----收到一个icmp数据包----
mov 2Ah,DPH
mov 2Bh,DPL
movx A,@DPTR
mov R0,A
inc DPTR
movx A,@DPTR
mov R1,A
mov A,R0
cjne A,#0,L1077
mov A,R1
jnz return1103
;icmp 应答报文
call ping_return
ret
L1077:
cjne A,#08,L1086
mov A,R1
jnz return1103
;icmp 请求报文
mov R0,#0
mov R1,#0
call icmp_send
ret
L1086:
mov A,B
cjne A,#03,return1103
mov A,R1
cjne A,#02,L10905
sjmp L10906
L10905:
mov A,R1
cjne A,#3,return1103
L10906:
;send com :con't connect or be quiet
ret
return1103:
ret
icmp_send:
;--------- 参数 R0,R1 DPTR位于代码位置
mov A,R0
cjne A,#0,L1083
mov A,R1
jnz return1084
;echo应答
jmp ping_reply
L1083:
cjne A,#08,L1090
mov A,R1
jnz return1084
sjmp ping_request
ret
L1090:
cjne A,#03,return1084
mov A,R1
cjne A,#02,L1094
sjmp L1095
L1094:
mov A,R1
cjne A,#3,return1084
L1095:
return1084:
ret
ping:
;----------
mov DPTR,#s16
mov R0,#8
call cout
mov R0,#0C0h
mov R2,#4
call i_to_s
mov DPTR,#s17
mov R0,#25
call cout
mov R2,#4
Loop1621:
PUSH 02H
mov R0,#0C8h ;保存时间信息
mov R1,#02Eh
mov A,@R1
mov @R0,A
inc R0
mov A,@R1
mov @R0,A
mov DPTR,#3000h
mov R0,#0CAh ;ping 标志位,是否收到回应
clr A
mov @R0,A
mov R0,#8
mov R1,#0
call icmp_send ;发送一个ping 请求
mov R0,#0C9h ;
mov A,@R0
add A,#10h
mov B,A
loop1614:
mov R0,#0CAH
mov A,@R0
jnz ret1624
mov A,02FH
cjne A,B,loop1614 ;等3秒
mov DPTR,#s18
mov R0,#16 ;超时
call cout
ret1624:
POP 02H
djnz R2,loop1621
mov A,#0Dh
call com_send
mov A,#0Ah
call com_send
ret
ping_request:
;ping 主机,ip在0C0-0C3h中
mov R0,#64h
mov R1,#0D4h
mov R2,#4
lop158:
mov A,@R0
mov @R1,A
inc R0
inc R1
djnz R2,lop158
mov R0,#0C0h
mov R1,#64h
mov R2,#4
lop159:
mov A,@R0
mov @R1,A
inc R0
inc R1
djnz R2,lop159
mov 20H,DPH
mov 21H,DPL
call arp
mov DPH,20h
mov DPL,21h
call ether_pack ;以太网帧头部
mov B,#22h
call add_dptr
mov A,#8
movx @DPTR,A
inc DPTR
clr A
movx @DPTR,A
inc DPTR
movx @DPTR,A
inc DPTR
movx @DPTR,A
inc DPTR
mov A,#12h
movx @DPTR,A
inc DPTR
mov A,#34h
movx @DPTR,A
inc DPTR
mov A,TH0
movx @DPTR,A
inc DPTR
mov A,TL0
movx @DPTR,A
mov B,#22h
call add_dptr
mov R2,#00
mov R3,#40 ;40字节
call checksum
mov B,#24h
call add_dptr
mov A,R4
movx @DPTR,A
inc DPTR
mov A,R5
movx @DPTR,A
mov R6,#0
mov R7,#60
mov B,#0EH
call add_dptr
mov 6CH,#01h ;协议类型:01 ICMP
call ip_pack
mov 6CH,#11h
mov A,R7
add A, #14 ;IP长度 + 14 = 总长度
mov R7,A
mov A,R6
addc A,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -