用汇编语言编写一个打字练习计时程序

用汇编语言编写一个打字练习计时程序,第1张

stacksegment para stack 'stack' 定义堆栈段 db 256 dup(0) 开辟256个字节的空间top label word 定义top与紧接下来的一个字单元的段唯薯值和偏移相同stackends stack部分定义完毕data segment para public 'data' 开辟数液山旁据段buffer db 16h dup(0)自定义一个长度为十六进制长度为16h的字节bufpt1 dw 0 自定义一个长度为1的字bufpt2 dw 0 自定义一个长度为1的字kbflag db 0自定义一个长度为1的字节prompt db ' *please practise typing*',0dh,0ah,'$'scantab db 0,0,'1234567890-=',8,0 db 'qwertyuiop[]',0dh,0 db 'asdfghjkl',0,0,0,0 db 'zxcvbnm,./',0,0,0 db ' ',0,0,0,0,0,0,0,0,0,0,0,0,0 db '789-456+1230.'evenoldcs9 dw ?oldip9 dw ?str1 db 'abcd efgh ijkl mnop qrst uvwx yz.' 预设一段字母abcd efgh ijkl mnop qrst uvwx

yz. db 0dh,0ah,'$'str2 db 'there are some newspapers on the table.' 预设一段字母there are some

newspapers on the table. db 0dh,0ah,'$'str3 db 'there are some clouds in the sky.'预设一段字母there are some clouds in

the sky. db 0dh,0ah,'$'str4 db 'she always eats her lunch at noon.' 预设一段字母she always eats her

lunch at noon. db 0dh,0ah,'$'闹橡str5 db 'i do not like autumn and winter.' 预设一段字母i do not like autumn and

winter.crlf db 0dh,0ah,'$'colondb ':','$'evensaddrdw str1,str2,str3,str4,str5countdw 0sec dw 0min dw 0hoursdw 0save_lc dw 2 dup(?)data endscode segment assume cs:code,ds:data,es:data,ss:stackmain proc far段内的程序调用start: mov ax,stackmov ss,ax mov sp,offset top

push ds 将ds入栈 sub ax,ax将ax清零 push ax 将ax入栈 mov ax,data 将data里面的数据存到ax中 mov ds,ax mov es,ax

mov ah,0mov al,4int 21hmov ah,0bhmov bh,0mov bl,4int 11h mov ah,35h mov al,09h int 21h mov oldcs9,es mov oldip9,bx

push ds mov dx,seg kbint mov ds,dx mov dx,offset kbint mov al,09h mov ah,25h int 21h pop ds

mov ah,35h mov al,1ch int 21h mov save_lc,bx mov save_lc+2,es

push ds mov dx,seg clint mov ds,dx mov dx,offset clint mov al,1ch mov ah,25h int 21h pop ds

in al,21h and al,11111100b out 21h,alfirst: mov ah,0 mov al,3 int 10h

mov dx,offset prompt mov ah,9 int 21h

mov si,0next:mov dx,saddr[si] mov ah,09h int 21h

mov count,0 mov sec,0 mov min,0 mov hours,0

stiforever: call kbget test kbflag,80h jnz endint push ax call dispchar pop ax cmp al,0dh jnz forever mov al,0ah call dispchar

call disptime lea dx,crlf mov ah,09h int 21h add si,2 cmp si,5*2 jne next jmp firstendint: cli push ds mov dx,save_lc mov ax,save_lc+2 mov ds,ax mov al,1ch mov ah,25h int 21h pop ds

push ds mov dx,oldip9 mov ax,oldcs9 mov ds,ax mov al,09h mov ah,25h int 21h pop ds

sti retmain endpclintproc near push ds mov bx,data mov ds,bx

lea bx,count inc word ptr[bx] cmp word ptr[bx],18 jne return call inctadj: cmp hours,12 jle return sub hours,12return: pop ds sti iretclintendpinct proc near mov word ptr[bx],0 add bx,2 inc word ptr[bx] cmp word ptr[bx],60 jne exit call inctexit:retinct endpdisptime proc near mov ax,min call bindec

mov bx,0 mov al,':' mov ah,0eh int 10h mov ax,sec call bindec

mov bx,0 mov al,':' mov ah,0eh int 10h

mov bx,count mov al,55d mul bl call bindec

retdisptime endpbindec proc near mov cx,100d call decdiv mov cx,10d call decdiv mov cx,1 call decdiv retbindec endpdecdiv proc near mov dx,0div cx

mov bx,0 add al,30h mov ah,0eh int 10h

mov ax,dx retdecdiv endpkbgetproc near push bx cli mov bx,bufpt1 cmp bx,bufpt2 jnz kbget2 cmp kbflag,0 jnz kbget3 sti pop bx jmp kbgetkbget2: mov al,[buffer+bx] inc bx cmp bx,16h jc kbget3 mov bx,0kbget3: mov bufpt1,bx pop bx retkbgetendpkbintproc near push bx push ax

in al,60h push ax in al,61h or al,80h out 61h,al and al,7fh out 61h,al

pop ax test al,80h jnz kbint2 mov bx,offset scantab xlat scantab cmp al,0 jnz kbint4 mov kbflag,80h jmp kbint2kbint4: mov bx,bufpt2 mov [buffer+bx],al inc bx cmp bx,16h jc kbint3 mov bx,0kbint3: cmp bx,bufpt1 jz kbint2 mov bufpt2,bxkbint2: cli mov al,20h out 20h,al pop ax pop bx sti iretkbintendpdispchar proc near push bx mov bx,0 mov ah,0eh int 10h pop bx retdispchar endpcode ends end start

代码:

出现菜单主界面,按回车键出现由26个字母组成

的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如宏轮果输入正确,卜冲字母

消失;按ESC键返回主界面;按空格见暂停;按‘E’退出。

Init_game macro op1,op2,op3,op4,op5,op6 屏幕初始化

mov cx,00h

mov dh,op1

mov dl,op2

op6:mov ah,02h

mov bh,00h

int 10h

push cx

mov ah,0ah

mov al,op3

mov bh,00h

mov cx,01h

int 10h

pop cx

inc cx

inc op4

cmp cx,op5

jne op6

endm

clear_screen macro op1,op2,op3,op4 清屏宏定义

mov ah,06h

mov al,00h

mov bh,07h

mov ch,op1

mov cl,op2

mov dh,op3

mov dl,op4

int 10h

mov ah,02h

mov bh,00h

mov dh,00h

mov dl,00h

int 10h

endm

menu macro op1,op2,op3 菜单显示宏定义

mov ah,02h

mov bh,00h

mov dh,op1

mov dl,op2

int 10h

mov ah,09h

lea dx,op3

int 21h

endm

cursor macro op1,op2 置光标宏定义

mov ah,02h

mov bh,00h

mov dh,op1

mov dl,op2

int 10h

endm

hidden macro 字母消隐宏定义。在当前光标位置写空格

mov ah,0ah

mov al," "

mov bh,00h

mov cx,01h

int 10h

endm

display macro ;显示蔽弊信字母宏定义

mov ah,0ah

mov bh,00h

mov cx,01h

int 10h

endm

data segment

ZK db "WELCOME TO PLAY$"

no db "date:2005/4/24$"

meg db "press Enter key to continue.......$"

meg1 db "when a letter is dropping,please hit it!$"

meg2 db "press space key to pause!$"

meg3 db "press ESC key to return main interface!$"

meg4 db "press letter 'E' to exit!$"

speed dw 600d

letters db "jwmilzoeucgpravskntxhdyqfb"

db "iytpkwnxlsvxrmofzhgaebudjq"

db "nwimzoexrphysfqtvdcgljukda"

letters_bak db "jwmilzoeucgpravskntxhdyqfb"

db "iytpkwnxlsvxrmofzhgaebudjq"

db "nwimzoexrphysfqtvdcgljukda"

letter_counter db 0

life_flag db 78 dup(0)

position_flag db 78 dup(0)

present_position db 1

data ends

stack segment para stack 'stack'

db 64 dup(0)

stack ends

code segment

main proc far

assume cs:code,ds:data,ss:stack

start:mov ax,data

mov ds,ax

clear_screen 00d,00d,24d,79d 清屏

Init_game 00d,00d,0ah,dl,80d,nextsign1 ;屏幕初始化

Init_game 24d,00d,0ah,dl,80d,nextsign2

Init_game 00d,00d,0ah,dh,25d,nextsign3

Init_game 00d,79d,0ah,dh,25d,nextsign4

menu 05d,15d,ZK 菜单信息的宏调用

menu 07h,15d,no

menu 09d,15d,meg

menu 11d,15d,meg1

menu 13d,15d,meg2

menu 15d,15d,meg3

menu 17d,15d,meg4

cursor 22,33 设置光标位置

mov ah,00h

lea si,life_flag

mov cx,00h

init_life_flag:

mov [si],ah

inc si

inc cx

cmp cx,78d

jne init_life_flag

mov cx,00h

mov ah,01h

or ch,00010000b

int 10h

mov ah,01h 从键盘输入任意字符

int 21h

cmp al,0dh 回车开始

je gamebegin

exit: mov ah,4ch 其它键结束

int 21h

gamebegin:

mov ax,speed+12

mov speed,ax

clear_screen 01d,01d,23d,78d 清屏宏调用

Init_game 23d,01d,01h,dl,78d,nextsign5 最下一行显示小花脸

cursor 1,1 设置光标位置

mov cx,00h

lea si,letters

nextletter:

mov ah,02h逐个显示最上面一行字母

mov dl,[si]

int 21h

inc si

inc cx

cmp cx,78d

je nextcycle

jmp nextletter

nextcycle:字母下落过程

lea di,letters

lea si,position_flag

add present_position,31d 随机选择下一个字母

cmp present_position,78

ja from_front

gobackto_si:

add si,word ptr present_position

dec si

mov ah,[si]

cmp ah,01h

je find_zero

gobackto_di:

mov ah,01h

mov [si],ah

add di,word ptr present_position

dec di

cursor 1,present_position设置光标位置

mov cx,00h

nextrow: push cx

mov cx,00h

out_cycle: 延迟

push cx

mov cx,00h

in_cycle:

inc cx

cmp cx,1000

jne in_cycle

push dx

mov ah,06h 从键盘输入字符

mov dl,0ffh

int 21h

pop dx

jz pass

cmp al,1bh 如果键入ESC,则返回主菜单

je to_start1

cmp al," " 如果键入SPACE,则游戏暂停

je pause

cmp al,[di]输入字母正确!则字母消失

je disappear

pass:pop cx

inc cx

cmp cx,speed

je print

jmp out_cycle

to_start1: 返回主菜单

jmp start

pause: push dx暂停处理

mov ah,06h 等待再次按空格

mov dl,0ffh

int 21h

pop dx

cmp al," "

jne pause

jmp pass

disappear: 击中字母后输出空格

pop cx

pop cx

hidden 消隐

jmp hit

from_front:

sub present_position,78d

jmp gobackto_si

find_zero:

cmp letter_counter,78d

je recycle

cmp present_position,78d

je from_one

mov ah,00h

nextsi: add present_position,01h

inc si

cmp [si],ah

je equl

cmp present_position,78d

je from_one

jmp nextsi

equl : jmp gobackto_di

from_one:mov present_position,01h

jmp gobackto_si

recycle:mov letter_counter,00h

mov present_position,01d

lea si,position_flag

mov cx,00h

mov ah,00h

clearsi: mov [si],ah

inc cx

cmp cx,78d

jne no_equl

jmp nextcycle

no_equl: inc si

jmp clearsi

print: hidden 消隐

inc dh

cursor dh,present_position 改变光标位置

mov al,[di]在当前光标位置显示字母

display显示该字母

pop cx

inc cx

cmp cx,21d

je print_next_letter

jmp nextrow 下一行

print_next_letter:字母落到底部

lea si,life_flag

add si,word ptr present_position

dec si

hidden 消隐

inc dh

cursor dh,present_position 改变光标位置

hidden 消隐

mov ah,1

mov [si],ah

hit: cursor 1,present_position 光标位置回到第1行

mov al,[di] 出现下一个新字母

add al,7 刚敲的字母加7,生成新字母

cmp al,7ah超过小写字母z?

ja convey_letter

display显示该字母

mov [di],al

add letter_counter,01h

jmp nextcycle

convey_letter:

sub al,7ah 使该字母>a

add al,61h

display 显示该字母

mov [di],al

add letter_counter,01h

jmp nextcycle

main endp

code ends

end start

*********************************************************

带有时间设置和拦滚秒显示的数字闹钟

Date : 2007.10.26 12MHZ晶振

Create by :星星 缘木求鱼

P3.2设置键 P3.3小时调整键 P3.5分钟调整键 P3.7定时输出指示

**************************************************************

*********************************************************

变量地址分配

*********************************************************

SwDelay equ 2 设置按键时去抖动时间

DisplayBuffer equ 30h设置显示缓冲区的地址为30h-35h共6个字节

BeepVal equ 38h蜂鸣时间长短存储器地址

OneSecondCounterequ 39h设置1秒计数器的地址,1秒计数器是用来计数1秒内计时器的中断次数

Hourequ 3ah设置小时计数器的地址

Minute equ 3bh设置分钟计数器的地址

Second equ 3ch设置秒计数器的地址

Yearequ 3dh设置月日年计数器的地址

Month equ 3eh

Day equ 3fh

P1Val equ 40h设置数码管位驱动值的地址

ClockMode equ 20h.0 模式(正常走时/闹时)设置寄存器地址,值为0时正常走时,为1时闹时设定

AlarmOnOff equ 20h.1 闹钟开启/关闭标志,为0关闭,为1开启

AlarmTimeOn equ 20h.2 此位为1时表示闹时时间到

DataModeequ 20h.3

DispHourequ 21h设置小时显示寄存器的地址

DispMinute equ 22h设置分钟显示寄存器简码余的地址

DispSecond equ 23h设置秒显示寄存器的地模厅址

Dnumequ 24h

AlarmHour equ 2eh设置闹时小时计数器的地址

AlarmMinute equ 2fh设置闹时分钟计数器的地址

AlarmSetKey bit P3.2 闹钟设置键

MinuteKey bit P3.3 定义分设置键

HourKey bit P3.4 定义小时设置键

DataSetKey bit p3.5

RelayOutequ P3.7 定义输出引脚

**********************************************************************

程序开始

**********************************************************************

org 00h

ajmp Reset程序开始

org 0bh Timer0中断向量地址

ajmp TimeInt跳到中断处理程序

org 0020h

Reset: 以下为初始化程序,为各个变量赋初值

mov sp,#70h

setb RelayOut

mov OneSecondCounter,#125

mov Hour,#23

mov Minute,#59

mov Second,#30设置上电时时钟显示的初值

mov Year,#07

mov Month,#12

mov Day,#27

mov AlarmHour,#00

mov AlarmMinute,#00设置上电时闹时时间的初值

clr AlarmOnOff 上点复位后闹时功能处于关闭状态

clr ClockMode 正常走时模式

clr AlarmTimeOn

setb RelayOut 清闹时输出

clr DataMode

mov 36h,#10

mov 37h,#11

************************************

Use Timer 0 Mode 1

400us interrupt

************************************

mov tmod,#00000001b

mov th0,#0E3h

mov tl0,#5Dh

mov ie, #82h开全局中断

SETB EA

SETB ET0

setb tr0 开定时中断

*****************************************

以下为主程序

*****************************************

MainLoop:

jb AlarmSetKey,CheckMinuteKey 闹时设置键按下了吗?没有则转去检测秒设置键

call Delay

jb AlarmSetKey,CheckMinuteKey 按下的时间超过500ms吗?

setb ClockMode 置为闹时设置模式

call AlarmSet

CheckMinuteKey:

jb MinuteKey,CheckHourKey 分设置键按下了吗?没有则转去检测小时设置键

如按下调用蜂鸣器发音程序

mov a,Minute

add a,#1 如果按下则将分钟加一 十进制调整

mov Minute,a

cjne a,#3ch,NotOver1 到60分钟了吗?

mov Minute,#0 到60分钟则将分钟清0

NotOver1:以下等待按键释放及防抖动

jnb MinuteKey,$

CheckHourKey:

jb HourKey,CheckDataKey

如按下调用蜂鸣器发音程序

mov a,Hour

add a,#1 如果按下则将小时加1

mov Hour,a

cjne a,#18h,NotOver2

mov Hour,#0 到24小时则将小时清0

NotOver2:以下等待按键释放及防抖动

jnb HourKey,$

CheckDataKey:

jb DataSetKey,CheckAlarm

call Delay

jb DataSetKey,CheckAlarm

setb DataMode

call Dataset

CheckAlarm:

jnb AlarmTimeOn,ToReturn

call AlarmProcess

ToReturn:

ajmp MainLoop

**********************************************

定时器Timer0中断服务程序(此程序每8ms执行一次)

**********************************************

TimeInt:

mov th0,#0E3h 重新加载定时参数

mov tl0,#5Dh

push acc

push psw 保护累加器及程序状态字的内容

setb rs0 选择工作寄存器组1,

clr rs1 这样可保护原工作寄存器组(0组)的内容

djnz OneSecondCounter,NotoneSecond中断了125次了吗?即够1秒了吗?

mov OneSecondCounter,#125 如够1秒则重新设置"OneSecondCounter"计数器

call Clock调用将时钟内容加1秒的子程序

call Daynum

call ConvertoBuffer 调用将时钟内容转换到显示缓冲区子程序

NotoneSecond:

call ScanDisplay 调用扫描显示子程序

pop psw

pop acc 恢复累加器及程序状态字的内容

reti 中断返回

*********************************************

扫描显示子程序

*********************************************

ScanDisplay:

MOV R1,#DisplayBuffer指向显示数据首址

MOV R5,#0FEH扫描控制字初值

PLAY:

MOV A,R5 扫描字放入A

MOV P2,A 从P2口输出

MOV A,@R1取显示数据到A

MOV DPTR,#TAB取段码表地址

MOVC A,@A+DPTR查显示数据对应段码

MOV P1,A 段码放入P1口

LCALL Delay

INC R1 指向下一地址

MOV A,R5扫描控制字放入A

JNB ACC.7,ENDOUT 扫到第六位时结束

RL A A中数据循环左移

MOV R5,A 放回R5内

AJMP PLAY 跳回PLAY循环

ENDOUT: MOV P2,#0FFH一次显示结束,P2口复位

MOVP1,#00HP1口复位

RET子程序返回

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,39h

共阴段码表"0""1""2" "3""4""5""6""7" "8""9""-""c"

****************************************************

时钟内容加1秒的子程序

****************************************************

Clock:

mov a,Second将原秒值送入a

add a,#1加1秒

mov Second,a

cjne a,#3cH,NotOverFlow 够60秒了吗?

mov Second,#0 够了则将秒值清0

mov a,Minute

add a,#1

mov Minute,a分钟加1

cjne a,#3cH,NotOverFlow 够60分了吗?

mov Minute,#0 够了则将分值清0

mov a,Hour

add a,#1

mov Hour,a 小时加1

cjne a,#18H,NotOverFlow 够24小时吗?

mov Hour,#0 够了则将小时值清0

mov a,Day

add a,#1

mov Day,a

cjne a,Dnum,NotAlarm

mov Day,#1

mov a,Month

add a,#1

mov Month,a

cjne a,#13,NotAlarm

mov Month,#1

mov a,Year

add a,#1

mov Year,a

cjne a,#11,NotAlarm

mov Year,#0

NotOverFlow:

jnb AlarmOnOff,NotAlarm 闹钟开启了吗?如没有开启则无需理会是否到闹时时间

mov a,Second

jnz NotAlarm秒为零吗?

mov a,Minute

cjne a,AlarmMinute,NotAlarm 时间分钟值和闹时设置分钟值相等吗?

mov a,Hour

cjne a,AlarmHour,NotAlarm 时间小时值和闹时设置小时值相等吗?

setb AlarmTimeOn到了闹时时间则将“闹时时间到”标志设为1

NotAlarm:

ret

**************************************************************************

将时钟内容或闹时设置值转换到显示缓冲区子程序

**************************************************************************

ConvertoBuffer:

mov r1,#DisplayBuffer

jnb dataMode,TimeDisp

mov a,Day

mov DispSecond,a

mov a,Month

mov DispMinute,a

mov a,Year

mov DispHour,a

ajmp Convert

TimeDisp: jb ClockMode,DispAlarmSet 判断时钟模式,以决定是显示实时时间还是闹时时间

mov a,Second

mov DispSecond,a

mov a,Minute

mov Dispminute,a

mov a,Hour

mov DispHour,a 显示实时时间

ajmp Convert

DispAlarmSet:

jb AlarmOnOff,AlarmOn

mov DispSecond,#00h

ajmp Next

AlarmOn:

mov DispSecond,#11 显示闹时时间及显示闹钟状态:显示“00”表示关闭闹钟,

Next: “11”表示开启闹钟

mov a,AlarmMinute

mov Dispminute,a

mov a,AlarmHour

mov DispHour,a

Convert:

mov a,DispSecond 取秒值

mov b,#10

div ab

mov @r1,b

inc r1 缓冲寄存器的地址加1

mov @r1,a 将秒值的十位值存入缓冲区

inc r1

mov a,DispMinute

mov b,#10

div ab

mov @r1,b

inc r1 缓冲寄存器的地址加1

mov @r1,a 将秒值的十位值存入缓冲区

inc r1

mov a,DispHour

mov b,#10

div ab

mov @r1,b

inc r1 缓冲寄存器的地址加1

mov @r1,a 将秒值的十位值存入缓冲区

ret

*******************************************************

天数判断,平年,闰年

*******************************************************

Daynum:mov a,Month

mov dptr,#TABL

movc a,@a+dptr

mov Dnum,a

mov a,Year

mov b,#4

div ab

mov a,b

cjne a,#0,BB

mov a,Month

cjne a,#2,BB

inc Dnum

BB: RET

TABL: DB 31,32,29,32,31,32,31,32,32,31,32,31,32

**************************************************

闹时设置子程序

**************************************************

AlarmSet:

jnb AlarmSetKey,$

call Delay等待“AlarmSetKey”键释放

CheckArmMinuteKey:

jb MinuteKey,CheckArmHourKey 分设置键按下了吗?没有则转去检测小时设置键

setb AlarmOnOff

mov 37h,#0

mov a,AlarmMinute

add a,#1 如果按下则将分钟加1十进制调整

mov AlarmMinute,a

cjne a,#3ch,ArmNotOver1 到60分钟了吗?

mov AlarmMinute,#0到60分钟则将分钟清0

ArmNotOver1: 以下等待按键释放及防抖动

jnb MinuteKey,$

CheckArmHourKey:

jb HourKey,AlarmSetEnd小时设置键按下了吗?没有则返回反复检测

setb AlarmOnOff

mov a,AlarmHour

add a,#1 如果按下则将小时加1

mov AlarmHour,a

cjne a,#18h,ArmNotOver2

mov AlarmHour,#0 到24小时则将小时清0

ArmNotOver2: 以下等待按键释放及防抖动

jnb HourKey,$

AlarmSetEnd:

jb AlarmSetKey,AlarmSet 设置完毕了吗?

jnb AlarmSetKey,$

clr ClockMode 从设置模式转为走时模式

ret

*********************************************

日期调整

*********************************************

DataSet:

jnb DataSetKey,$

call Delay

CheckDataYearKey:

jb HourKey,CheckDataMonthKey

mov a,Year

add a,#1

mov Year,a

cjne a,#11,DataNotOver1

mov Year,#0

DataNotOver1:

jnb HourKey,$

CheckDataMonthKey:

jb MinuteKey,CheckDataDayKey

mov a,Month

add a,#1

mov Month,a

cjne a,#13,DataNotOver2

mov Month,#1

DataNotOver2:

jnb MinuteKey,$

CheckDataDayKey:

jb AlarmSetKey,DataSetEnd

mov a,day

add a,#1

mov Day ,a

cjne a,Dnum,DataNotOver3

mov Day,#1

DataNotOver3:

jnb AlarmSetKey,$

DataSetEnd:

jb DataSetKey,DataSet

jnb DataSetKey,$

clr DataMode

ret

**************************************************

闹时服务子程序

**************************************************

AlarmProcess:

clr RelayOut

jb AlarmSetKey,AlarmReturn 停止闹时键(即闹时设置键)按下了吗?

clr AlarmOnOff

jnb AlarmSetKey,$

setb RelayOut 如停止闹时键按下则停止闹时

clr AlarmTimeOn

mov 37h,#11

mov AlarmMinute,#00

mov AlarmHour,#00

AlarmReturn:

ret

**************************************************

延时子程序

**************************************************

Delay:

mov r6,#2

Del:

mov r7,#124

djnz r7,$

djnz r6,Del

ret

DL1s: mov r3,#4

dd: call Delay

djnz r3,dd

ret

end


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12352797.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存