⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 final.asm

📁 汇编语言编写的串口服务器 适用于51系列单片机
💻 ASM
📖 第 1 页 / 共 3 页
字号:
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 + -