|
“没有风”的汇编实验报告专题(更新至10)
由于拖了几天,太过勿忙了,想快点完成报告,所以如果我的报告有什么错误的话,请原谅。 |
|
“没有风”的汇编实验报告专题(更新至10)
总结:经过实验5,我掌握了以下知识: ①我学会了如何将一个段和附加寄存器关联,并将之设置为附加数据段 ②我学会了如何使用END伪指令设置IP为一个程序的入口的偏移地址 ③我学会了如何程序的数据的段并不是一定要放在程序的前面,它也可以放在程序的末尾,只是这时程序的IP即为程序的入口的偏移地址。 ④我学会了如何依次将两个数组的元素相加,并把结果依次存储到另一个数组中去。 ⑤我学会了如何使用MOV指令将一个字节单元的内存传送到8位寄存器中去。 ⑥我学会了如何使用ADD指令将一个字节型单元的内容加到一个8位寄存器中去。 ⑦我学会了如何读取附加段字节型单元的内容到一个8位寄存器中去。 ⑧我学会了如何使用循环(至少执行一次的循环)。 ⑨我学会了如何使用PUSH指令将一个数组的元素逆序COPY到一个堆栈(或说为数组应该也没什么大碍吧)中去。 心得:在这次实验当中,可以说作为一个初学者该犯的错误我都犯了,比如:试图将一个字型单元的内容读取到一个堆栈中去(这明显是不支持的嘛,PUSH指令怎么说也是一个字操作指令:),还有就是试图使用字操作指令进行字节操作(这明显是不能实现的嘛:),不过只要想相应的寄存器改为8位寄存器就支持了,还有就是忘了在程序的最后加上返回系统的指令(一个程序运行结束之后如果不返回调用它的程序,或操作系统或DEBUG,那么它该去哪里呢?我不知道,也许会发生意想不到的事情吧:)。 这次实验最大的收获就是终于掌握了独立编写一个汇编程序的能力,能解决一些日常遇到的小问题,如将一个数组逆序,将一个数组的元素COPY到另一个数组中去。在使用PUSH指令的过程中也让我更加深刻理解了堆栈的运行机制。 |
|
“没有风”的汇编实验报告专题(更新至10)
实验5 编写、调试具有多个段的程序 (1) 将下面的程序编译连接,用debug加载、跟踪,然后回答问题: ;---------------------------------------------------------- ;ex5a1.asm ;------------------------------------------------------------ ;AUTHOR:IT007 ;DATE:2007/11/11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ①cpu执行程序,程序返回前,data段中的数据为多少? 答: 0123h,0456h,0789h,0abch,0defh,0fedh,0cabh,0987h ②CPU执行程序,程序返回前,cs=13D5,ss=13D4,ds=13D3. ③设程序加载后,code段的段地址为x,则data段的段地址为x-12h,stack段的段地址为x-2h. (2) 将下面的程序编译连接,用debug加载、跟踪,然后回答问题: ;---------------------------------------------------------- ;ex5a2.asm ;------------------------------------------------------------ ;AUTHOR:IT007 ;DATE:2007/11/11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h data ends stack segment dw 0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data push ds:[0] mov ax,4c00h int 21h code ends end start ①cpu执行程序,程序返回前,data段中的数据为多少? 答:23 01 56 04 ②cpu执行程序,程序返回前, cs=13D5,ss=13D4,ds=13D3 . ③设程序加载后,code段的段地址为x,则data段的段地址为x-12h,stack段的段地址为x-2h. ④对于如下定义的段: name segment ……… name ends 如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为n个字节. (3) 将下面的程序编译连接,用debug加载、跟踪,然后回答问题: ;---------------------------------------------------------- ;ex5a3.asm ;------------------------------------------------------------ ;AUTHOR:IT007 ;DATE:2007/11/11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code,ds:data,ss:stack code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h,0456h data ends stack segment dw 0,0 stack ends end start ①cpu执行程序,程序返回前,data段中的数据为多少? 答:23 01 56 04 ②cpu执行程序,程序返回前,cs=13D3H,ss=13D7H,ds=13D6H. ③设程序加载后,code段的段地址为x,则段的段地址为x-10h,stack段的段地址为x-10h。 (4) 如果将1、2、3题中的最后一条伪指令”end start”改为”end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。 答:第3个程序可以正常运行,因为在前两个程序都未指定程序的入口, 而程序的前面一部分为数据,即非程序,当程序被加载入内存时,CS: IP指 向这些数据,即把这些数据当作指令来执行,这样可能会引发 意想 不到的后果, 严重的甚至可能导致死机。而第3个程序CS: IP指向程序的第一条指令,因 为数据段定义在程序的末尾,因而程 序可以正常执行。 (5) 程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。 ;---------------------------------------------------------- ;ex5a5.asm ;------------------------------------------------------------ ;AUTHOR:IT007 ;DATE:2007/11/11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assuem cs:code,ds:a,es:b a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下为我添加的代码 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax,a mov ds,ax mov ax,b mov es,ax mov bx,0 mov di,0 mov cx,8 mov ax,0 s: mov al,[bx] add al,es:[bx] mov [bx+32],al inc bx loop s mov ax,4c00h int 21h code ends end start (6) 程序如下,编写code段中的代码,用push指令将a段中word数据,逆序存储到b段中。 ;---------------------------------------------------------- ;ex5a6.asm ;------------------------------------------------------------ ;AUTHOR:IT007 ;DATE:2007/11/11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code a segment dw 1,2,3,4,5,6,7,8 a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下为我添加的代码 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax,a mov ds,ax mov ax,b mov ss,ax mov sp,10h mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start 总结:经过实验5,我掌握了以下知识: ①我学会了如何将一个段和附加寄存器关联,并将之设置为附加数据段 ②我学会了如何使用END伪指令设置IP为一个程序的入口的偏移地址 ③我学会了如何程序的数据的段并不是一定要放在程序的前面,它也可以放在程序的末尾,只是这时程序的IP即为程序的入口的偏移地址。 ④我学会了如何依次将两个数组的元素相加,并把结果依次存储到另一个数组中去。 ⑤我学会了如何使用MOV指令将一个字节单元的内存传送到8位寄存器中去。 ⑥我学会了如何使用ADD指令将一个字节型单元的内容加到一个8位寄存器中去。 ⑦我学会了如何读取附加段字节型单元的内容到一个8位寄存器中去。 ⑧我学会了如何使用循环(至少执行一次的循环)。 ⑨我学会了如何使用PUSH指令将一个数组的元素逆序COPY到一个堆栈(或说为数组应该也没什么大碍吧)中去。 心得:在这次实验当中,可以说作为一个初学者该犯的错误我都犯了,比如:试图将一个字型单元的内容读取到一个堆栈中去(这明显是不支持的嘛,PUSH指令怎么说也是一个字操作指令:),还有就是试图使用字操作指令进行字节操作(这明显是不能实现的嘛:),不过只要想相应的寄存器改为8位寄存器就支持了,还有就是忘了在程序的最后加上返回系统的指令(一个程序运行结束之后如果不返回调用它的程序,或操作系统或DEBUG,那么它该去哪里呢?我不知道,也许会发生意想不到的事情吧:)。 这次实验最大的收获就是终于掌握了独立编写一个汇编程序的能力,能解决一些日常遇到的小问题,如将一个数组逆序,将一个数组的元素COPY到另一个数组中去。在使用PUSH指令的过程中也让我更加深刻理解了堆栈的运行机制。 |
|
“没有风”的汇编实验报告专题(更新至10)
实验4 [BX]和loop的使用 (1) 编程,向内存0:200~0:23F依次传送数据0~63(3FH). ;---------------------------------------------- ;ex5-1.asm ;----------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code ;; code segment ;; mov ax,20h ;; mov ds,ax ;; mov bx,0 ;; mov ax,0 ;; mov cx,0ffh ;; s: mov [bx],ax ;; inc bx ;; inc ax ;; loop s ;; mov ax,4c00h ;; int 21h ;; code ends ;; end ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“MOV AX,4C00H”和“INT 21H”。 ;------------------------------------------- ;ex5-2.asm ;------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code ; code segment ; mov ax,20h ; mov ds,ax ; mov bx,0 ; mov cx,0ffh ; s: mov [bx],bx ; inc bx ; loop s ; mov ax,4c00h ; int 21h ; code ends ; end ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (3) 下面的程序的功能是将“MOV AX,4C00H”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。 ;------------------------------------------------ ;;ex5-3.asm ;------------------------------------------------ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume cs:code ;;;;; code segment ;;;;; mov ax,code ;;;;; mov ds,ax ;;;;; mov ax,0020h ;;;;; mov es,ax ;;;;; mov bx,0 ;;;;; mov cx,18h ;;;;; s:mov al,[bx] ;;;;; mov es:[bx],al ;;;;; inc bx ;;;;; loop s ;;;;; mov ax,4c00h ;;;;; int 21h ;;;;; code ends ;;;;; end ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1.把EX5-3.EXE加载入内存中 $debug ex5-3.exe -r AX=0000 BX=0000 CX=001D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13C7 ES=13C7 SS=13D7 CS=13D7 IP=0000 NV UP EI PL NZ NA PO NC 13D7:0000 B8D713 MOV AX,13D7 -u 13D7:0000 B8D713 MOV AX,13D7 13D7:0003 8ED8 MOV DS,AX 13D7:0005 B82000 MOV AX,0020 13D7:0008 8EC0 MOV ES,AX 13D7:000A BB0000 MOV BX,0000 13D7:000D B91800 MOV CX,0018 13D7:0010 8A07 MOV AL,[BX] 13D7:0012 26 ES: 13D7:0013 8807 MOV [BX],AL 13D7:0015 43 INC BX 13D7:0016 E2F8 LOOP 21 13D7:0018 B8004C MOV AX,4C00 13D7:001D 00FF ADD BH,BH 13D7:001F 50 PUSH AX 2.把0:200的内容反汇编结果如下: 13D7:000D B91800 MOV CX,0018 13D7:0010 8A07 MOV AL,[BX] 13D7:0012 26 ES: 13D7:0013 8807 MOV [BX],AL 13D7:0015 43 INC BX 13D7:0016 E2F8 LOOP 0010 13D7:0018 B8004C MOV AX,4C00 13D7:001B CD21 INT 21 13D7:001D 00FF ADD BH,BH 13D7:001F 50 PUSH AX -u 0:200 0000:0200 46 INC SI 0000:0201 07 POP ES 0000:0202 07 ADC [BP+SI],AL 0000:0204 0A04 OR AL,[SI] 0000:0206 1002 ADC [BP+SI],AL 0000:0208 3A00 CMP AL,[BX+SI] 0000:020A A30354 MOV [5403],AX 0000:020D 00A3036E ADD [BP+DI+6E03],AH 0000:0301 00A30388 ADD [BP+DI+8803],AH 0000:0305 00A303A2 ADD [BP+DI+A203],AH 0000:0309 00A303FF ADD [BP+DI+FF03],AH 0000:0303 0310 ADD DX,[BX+SI] 0000:030F 02A90810 ADD CH,[BX+DI+1008] - 3.运行程序至正常结束 13D7:001D 00FF ADD BH,BH 13D7:001F 50 PUSH AX -u 0:200 0000:0200 46 INC SI 0000:0201 07 POP ES 0000:0202 07 ADC [BP+SI],AL 0000:0204 0A04 OR AL,[SI] 0000:0206 1002 ADC [BP+SI],AL 0000:0208 3A00 CMP AL,[BX+SI] 0000:020A A30354 MOV [5403],AX 0000:020D 00A3036E ADD [BP+DI+6E03],AH 0000:0301 00A30388 ADD [BP+DI+8803],AH 0000:0305 00A303A2 ADD [BP+DI+A203],AH 0000:0309 00A303FF ADD [BP+DI+FF03],AH 0000:0303 0310 ADD DX,[BX+SI] 0000:030F 02A90810 ADD CH,[BX+DI+1008] -g 1d Program terminated normally - 4.再次将0:200的内容反汇编结果如下: 0000:0301 00A30388 ADD [BP+DI+8803],AH 0000:0305 00A303A2 ADD [BP+DI+A203],AH 0000:0309 00A303FF ADD [BP+DI+FF03],AH 0000:0303 0310 ADD DX,[BX+SI] 0000:030F 02A90810 ADD CH,[BX+DI+1008] -g 1d Program terminated normally -u 0:200 0000:0200 B8D713 MOV AX,13D7 0000:0203 8ED8 MOV DS,AX 0000:0205 B82000 MOV AX,0020 0000:0208 8EC0 MOV ES,AX 0000:020A BB0000 MOV BX,0000 0000:020D B91800 MOV CX,0018 0000:0210 8A07 MOV AL,[BX] 0000:0212 26 ES: 0000:0213 8807 MOV [BX],AL 0000:0215 41 INC BX 0000:0216 E2F8 LOOP 0210 0000:021B CD21 INT 21 0000:021D 0AC4 OR AL,AH 0000:021F 5E POP SI 对比图1和图4,我们可以看出mov ax,4c00h前的指令序列已经被复制到了0:200处 实验总结:经过这次实验,我掌握了如何将一段内存的数据复制到另一段内存中去,以及如何将程序自身的指令序列复制到另一段内存中去.掌握了如何优化程序来将内存的内容复制到另一段内存去。 这次实验,花费我大量的时间和心血,终于完成了。 |
|
[分享]诛仙飞天外挂。。源码公布 VB
黑客精神啊!!!!!!!!!!严重支持。 |
|
[原创]发一个我写的汇编编译器:虫虫汇编器v0.2
什么都不想说,只想说:严重支持一下。 |
|
“没有风”的汇编实验报告专题(更新至10)
32位我也想转啊,可是一转的话我就要学很多API了,其实16位和32位汇编的基础都是相通的。何必分得那么清楚呢。我现在学习16位,我并没有放弃32位啊,只是一个过渡而已,现在就转32位,我可不想抢跑。 |
|
“没有风”的汇编实验报告专题(更新至10)
因为它简单啊,学起来容易上手啊,而且有成就感。 |
|
“没有风”的汇编实验报告专题(更新至10)
总结:经过这次实验我学到了许多有用的东西:分别是: 1.我掌握了使用D、U、E、A命令中可以直接使用段寄存器作为表示段地址 2。我明白了在使用T命令执行修改SS段寄存器的指令时,它会紧接着执行后面的一条指令,即是说执行一次T命令将会连续执行两条指令。 不过有一点不明白的就是,为什么在定义一个堆栈段的时候,堆栈的内容会发生变化,难道是因为系统自动对它进行初始化了吗?有人可以告诉我吗?我的QQ是420716701. |
|
“没有风”的汇编实验报告专题(更新至10)
实验2 用机器指令和汇编指令编程 1. 预备知识:DEBUG的使用 前面实验中,讲了DEBUG一些主要命令的用法,这里,我们再补充一些关于DEBUG的知识。 (1) 关于D命令 从上次实验中,我们知道,D命令是查看内存单元的命令,可以用: D 段地址:偏移地址的格式查看指定的内存单元的内容,上次实验中,D命令后面的段地址和偏移地址都是直接给出的。 现在,我们知道段地址是放在段寄存器中的,在D命令后面直接给出段地址,是DEBUG提供的一种直观的操作方式。D命令是由DEBUG执行的,DEBUG在执行“D 1000:0”这样的命令时,也会先将段地址1000送入段寄存器中。 DEBUG是靠什么来执行D命令的?当然是一段程序。 谁来执行这段程序?当然是CPU。 所以,DEBUG在其处理D命令的程序段中,必须有将段地址送入段寄存器中的代码。 段寄存器有4个:CS、DS、SS、ES,将段地址送入哪个段寄存器呢? 首先不能是CS,因为CS:IP必须指向DEBUG处理D命令的代码,也不能是SS,因为SS:SP要指向栈顶。这样只剩下DS和ES可以选择,放在哪里呢?我们知道,访问内存的指令如“MOV AX,[0]”等一般都默认段地址在DS中,所以DEBUG在执行如:“D 段地址:偏移地址”这种D命令时,将段地址送入DS中比较方便。 D命令也提供了一种符合CPU机理的格式:“D 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。以下是4个例子: ①-R DS :1000 -D DS:0 ;查看从1000:0开始的内存区间中的内容 ②-R DS :1000 -D DS:10 18 ;查看从1000:10~1000:18中的内容 ③-D CS:0 ;查看当前代码段中的指令代码 ④-D SS:0 ;查看当前栈段中的内容 (2) 在E、A、U命令中使用段寄存器 在E、A、U这些可以带有内存单元地址的命令中,也可以同D命令一样,用段寄存器表示内存单元的段地址。以下是3个例子: ①-R DS :1000 -E DS:0 11 22 33 44 55 6 ;在从1000:0开始的内存区间中写入数据 ②-U CS:0 ;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址 ③-R DS :1000 -A DS:0 ;以汇编指令的形式,向从1000:0开始的内存单元中写入指令 (3) 下一条指令执行了吗? 在DEBUG中,用A命令写一段程序: MOV AX,2000 MOV SS,AX MOV SP,10 ;安排2000:0~2000:F为栈空间,初始化栈顶。 MOV AX,3123 PUSH AX MOV AX,3366 PUSH AX ;在栈中压入两个数据 仔细看一下图3.18中单步执行的结果,读者发现了什么问题? 在用T命令单步执行MOV AX,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:MOV SS,AX; 在用T命令单步执行MOV SS,AX后,显示出当前CPU各个寄存器的状态和下一步要执行的指令。。。。。,在这里我们发现了一个问题:MOV SS,AX的下一条指令应该是MOV SP,10,怎么变成了MOV AX,3123H MOV SP,10到哪里去了?它被执行了吗? 我们再仔细观察,发现: 在程序执行前,AX=0000,SS=0B39,SP=FFEE 在用T命令单步执行MOV AX,2000后,AX=2000;SS=0B39;SP=FFEE 在用T命令单步执行MOV SS,AX后,AX=2000;SS=2000;SP=0010 注意,在用T命令单步执行MOV SS,AX前,SS=0B39,SP=FFEE,而执行后SS=2000,SP=0010,SS变为2000是正常的,这正是MOV SS,AX的执行结果。可是SP变为0010是怎么回事?在这期间,能够将SP设为0010的只有指令MOV SP,10,看来,MOV SP,10一定是得到了执行。 那么,MOV SP,10是在什么时候被执行的呢?当然是在MOV SS,AX之后,因为它就是MOV SS,AX的下一条指令。显然,在用T命令执行MOV SS,AX的时候,它的下一条指令MOV SP,10也紧接着被执行了。 整理一下我们分析的结果:在用T命令执行MOV SS,AX的时候,它的下一条指令MOV SP,10也紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但T命令执行MOV SS,AX的时候,没有做到这一点。 不单是MOV SS,AX,对于如:MOV SS,BX,MOV SS,[0],POP SS等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器SS的指令。 为什么会这样呢?要想彻底说清楚这里面来龙去脉,在这里还为时过早,因为这涉及到我们在以后的课程中要深入研究的内容:中断机制,它是我们后半部分课程中的一个主题。现在我们只要知道这一点就可以了:DEBUG的T命令在执行修改寄存器SS的指令时,一条指令也紧接着被执行。 2 实验任务 (1) 使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。 MOV AX,FFFF MOV DS,AX MOV AX,2200 MOV SS,AX MOV SP,0100 MOV AX,[0] AX=5BEAH ADD AX,[2] AX=5CCAH MOV BX,[4] BX=30FCH ADD BX,[6] BX=6022H PUSH AX SP=00FEH,修改的是字单元2200:00FE PUSH BX SP=00FCH,修改的是字单元2200:00FC POP AX SP=00FEH,AX=6022H POP BX SP=0100H,BX=5CCAH PUSH [4] SP=00FEH,修改的是字单元2200:00FE,内容是30F0H PUSH [6] SP=00FCH,修改的是字单元2200:00FC,内容是2F32H (2) 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变? 可能要再便有些实验才能发现其中的规律。如果读者在这里就正确回答了这个问题,那么要恭喜读者,因为读者有很好的惜玉怜香。大多数的读者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。 图3.19用DEBUG进行实验的示例 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值