汇编(学习笔记)

第二讲 内存与寄存器

1.2 机器语言到汇编语言

1.3 计算机的组成

  1. 总线
    在这里插入图片描述
    在这里插入图片描述

1.4 内存的读写与地址空间

第五讲 循环程序与多段程序

5.1 段前缀的使用

  1. 引入段前缀原因
    mov al,[0] //将【0】当作常熟0 引用
    对策:段前缀 ds:[bx]

  2. 访问连续单元8位累加
    解决

     	mov al, ds:[addr]
     	mov ah,0
     	add dx,ax
    
  3. es 扩展段寄存器

5.2 在代码段中使用数据

  1. 程序中直接写地址 危险!
    在段中存放数据
    dw 字型数据 db字节型数据
  2. 例:编程计算以下8个数的和,结果放入ax中
assume  cs:code
code segment
	dw 0123H,0456H,0789H,0abcH,0defH,0fedH //dw 字型数据  db字节型数据
start:	mov bx,0						   //程序入口
		mov ax,0
		mov cx,6
 	s: add ax,cs:[bx]
 		add bx,2
 		loop s
		mov ax,4c00h
		int 21h
code ends
end start
	

5.2 在代码段中使用栈

  1. 栈的使用
  2. 逆序存放数据
assume  cs:code
code segment
	dw 0123H,0456H,0789H,0abcH,0defH,0fedH //dw 自行数据  db字节型数据
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:	mov ax,cs						   
		mov ss,ax							//栈底指针 
		mov sp,30h							//栈指针			
 		
 		mov bx,0
 		mov cx,6
 	s: push cs:[bx]
 		add bx,2
 		loop s
 		
 		mov bx,0
 		mov cx,6
 	ss: pop cs:[bx]
 		add bx,2
 		loop ss
 		
		mov ax,4c00h
		int 21h
code ends
end start

5.3把数据、代码、栈、放入不同段

assume  cs:code, ds:data, ss:stack
data segment
	dw 0123H,0456H,0789H,0abcH,0defH,0fedH //dw 自行数据  db字节型数据
data ends
stack segment
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start:	mov ax,stack		//初始化各寄存器				   
		mov ss,ax			//栈底指针 
		mov sp,30h			//栈指针	
		mov ax,data
		mov ds,ax		
 		
 		mov bx,0
 		mov cx,6
 	 s: push [bx]			//入栈
 		add bx,2
 		loop s
 		
 		mov bx,0
 		mov cx,6
     s: pop [bx]			//出栈
 		add bx,2
 		loop s
 		
		mov ax,4c00h
		int 21h
code ends
end start

第六讲 寻址方式

6.1 处理字符问题

  1. 用 ’ ’ 的方式指明数据以字符方式给出,编译器将他们转化为相应的ACSCII码。
  2. 大小写转换
    ASCII值 小写 比 大写 大 20H(10 0000‬)
  3. 小写转大写:
    and al,11011111B
    大写转小写:
    or al,00100000B

6.2 [bx+idata]寻址

  1. [bx+idata]的含义
    (1)mov ax,[bx+200] / mov ax,[200+bx]
    (ds)*16+200+bx
    (2)其他写法
    mov ax,[200+bx]
    mov ax,200[bx]
    mov ax,[bx].200
  2. 用[bx+idata]进行数组处理
    对两个段进行同步操作

6.3 SI和DI寄存器

  1. 变址寄存器
    SI(原变址寄存器)和DI(目标变址寄存器)与BX功能相近
    SI和DI与BX不同处:不可分成两个8位寄存器
  2. 应用SI和DI
    将welcome to masm 复制到后边数据区
assume cs:code ,ds:data
data segment
db 'welcome to masm'
db '...............'
data ends
code segment
	start:mov ax,data
		  mov ds,ax
		  mov si,0
		  mov di,16
		  mov cx,8
		S:mov ax,[si]
		  mov [di],ax
		  add si,2
		  add di,2
		  loop s
		 mov ax,4c00h
		 int 21h
	code ends
	end start
	end

6.4 [bx+si]和[bx+di]方式指定地址

  1. [bx+si]表示一个内存单元
    mov ax,[bs+si]
    表示:(ax)=((ds)*16+(bx)+(si))
    mov ax,[bx][si]
  2. [bx+si+idata]

6.5 寻址方式的灵活应用

在这里插入图片描述
2. 二重循环
(1)将外层循环暂时保存在一个通用寄存器中
(2)用固定的内存空间保存数据 ds:[40H]
(3) 用栈保护数据 将外层循环cx压栈,结束后都栈顶弹出cx值

第七讲 寻址方式的应用

7.1 用于内存寻址的寄存器

  1. 通用寄存器:AX BXCX DX
    变址寄存器:SI DI
    指针寄存器:SP BP
    指令寄存器:IP
    段寄存器: CS SS DS ES
    标志寄存器:PSW
  2. [BX] [SI] [DI] [BP]可单独使用
    BX/BP作为基址
    SI/DI作为变址
  3. BX默认指ds段
    BP默认指ss段
    指定:mov ax,ds:[bp]
    默认:mov ax,[bp]

7.2 数据位置与大小

  1. 数据位置的表达
立即数寄存器内存:段地址和偏移地址
直接包含在机器指令中的数据指令要处理的数据在寄存器中,汇编指令中给出相应的寄存器名指令要处理的数据在内存中,由SA:EA确定内存单元
mov ax,1mov ax,bxmov ax,bp[si]
  1. 数据长度
字操作字节操作用word ptr或byte ptr 指明
mov ax,1 // mov ax,bxmov al,1 // mov al,blmov word ptr ds:[0],1 inc byte word ptr [bx]

在没有寄存器参与时,用word ptr 或byte ptr 显性指明大小

7.3 寻址方式的综合应用

  1. 问题
    在这里插入图片描述
  2. 解决方案
mov ax,seg
mov ds,ax
mov bx,60h
mov word ptr [bx+10h+si],'h'
inc si
mov byte ptr [bx+10h+si],'o'
inc si
mov byte ptr [bx+10h+si],'u'

7.4 div指令实现除法

  1. div除法指令
    被除数默认放在AX或DX和AX中
    除数8位或者16位在寄存器或内存单元中
  2. 格式
    div 寄存器
    div内存单元
被除数AXDX和AX
除数8位内存或寄存器16位内存或寄存器
ALAX
余数AHDX
  1. div bl
    被除数:(ax)
    除数: (bl)
    商: (al)
    余数: (ah)

    div bx
    被除数:(dx)*10000h+(ax)
    除数: (bx)
    商: (ax)
    余数:(dx)

  2. 示例
    100001/100

100001 = 186A1H
需要十六位除法
用DX(高位)和AX(低位)联合存放186A1
BX存放100D = 64H

mov dx,1h
mov ax,86a1h
mov bx,64h
div bx

7.5 dup功能和用法

  1. db 重复的次数 dup (重复的数据)
db 3 dup(0)定义三个字节,值都为0db 0,0,0
db 3 dup(1.2.3)定义九个字节db 1,2,3,1,2,3,1,2,3

第八讲 指令的转移和应用

8.1 ‘转移’综述

  1. 转移指令
    可以控制cpu执行内存某处的指令
    可以修改IP,或同时及修改CS和IP
  2. 段内转移
    只修改IP,如jmp ax
  3. 段间转移
    同时修改CS和IP,如jmp 1000:0
  4. 段内短转移:ip修改范围-128~127
  5. 段内近转移:ip修改范围-32768~32767
  6. 无条件转移: jmp
  7. 条件转移 jcxz
  8. 循环指令 loop
  9. 过程
  10. 中断

8.2 offset 指令

  1. offset取得标号的偏移地址
  2. offset 标号
    3.在程序运行时把s处的指令复制到s0处
s: mov ax,bx
	mov si,offset s
	mov di,offset s0
	mov ax,cs:[si]
	mov cs:[di],ax
s0: nop
	nop

8.3 jmp 指令

  1. 无条件转移
    (1)转移的目的地址
    (2)转移的距离
    a.段间的转移 jmp 2000:1000(远转移)
    b.段内短转移 jmp short标号;8位位移
    c.段内近转移 jmp near ptr 标号;16位位移
  2. jmp:根据位移进行转移
    在这里插入图片描述
  3. 两种段内转移
    (1)短转移
    jmp short 标号
    (ip)=(ip)+八位位移
    八位位移=‘标号’地址-jmp指令后的第一个字节地址
    8位位移范围为-128~127,补码表示
    (2)近转移
    jmp near ptr 标号
    (ip)=(ip)+16位位移
    八位位移=‘标号’地址-jmp指令后的第一个字节地址
    8位位移范围为-32769~32767,补码表示
  4. 远转移
远转移jmp far ptr 标号近转移jmp near ptr 标号
段间转移段内转移
far ptr 指明了跳转的目的地址near ptr 指明了相对当前ip的转移位移
  1. 转移地址在寄存器中jmp
    jmp 16寄存器(位移)
    6.转移地址在内存中的jmp
jmp word ptr 内存单元地址jmp dword ptr 内存单元地址
段内转移段间转移
从内存单原处存放一个字,是转移的目的偏移地址从内存单元处存放两个字,高地址处的字是转移的目的段地址,低地址处是偏移地址
jmp word ptr ds[0]mov ds:[0],ax-----mov word ptr ds:[2],0-----jmp dword ptr ds:[0]

在这里插入图片描述

在这里插入图片描述

8.4 其他转移指令

  1. jcxz 有条件转移
    如果(CX) =0,则转移到标号处
    如果(CX)!=0,则继续向下执行
  2. 所有有条件转移都是短转移
  3. 机器码中包含转移的位移

第九讲 模块化程序设计

9.1 call指令和ret指令

  1. 调用子程序call
    返回 ret
  2. 执行call两步操作
    将当前ip或cs+ip压栈
    转移到标号处执行
  3. call far ptr
    相当于:
    push cs
    push ip
    jmp far ptr 标号
  4. 寄存器call
    call 16位寄存器
  5. 内存地址的call
    call word ptr
    相当于:
    push ip
    jmp word ptr
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
retretf
用栈中的数据,修改ip内容,从而实现近转移用栈中的数据修改cs和ip的内容,从而实现远转移
pop ippop ip ,pop cs

902 call指令和ret指令配合

  1. 计算2的n次方
    n由cx提供
assume cs:code ss:stack
stack segment
	db 8 dup(0)
	db 8 dup(0)
code segment
start :mov ax,stack
mov ss,ax
mov sp,16
mov ax,1
mov cx,3
call s
mov bx,ax

mov ax,4c22h
int 21h

s:add ax,ax
loop s
ret

code ends
end start

903 乘法指令mul

  1. mul寄存器
8位乘法16位乘法
被乘数ALAX
乘数8位寄存器或内存单元16位寄存器或内存字单元
结果AXDX(高位)和AX(低位)
mul bl / mul byte ptr ds:[0]mul word ptr [bx+si+8]
  1. 计算100*10
mov al,100
mov bl,10
mul bl

904 模块化设计

  1. 计算data段中的数据的3次方,保存在后一组dword中
asuume cs:code
data segment 
	dw 1,2,3,4,5,6,7,8
	dd 0,0,0,0,0,0,0,0
data ends
code segment
start:mov ax,data
	mov ds,ax
	mov si,0
	mov di,16
	mov cx,8
s:mov bx,[si]
	call cube
	mov [di],ax
	mov [di+2],dx
	add di,4
	add si,2
	loop s
cube: mov ax,bx
	mul bx
	mul bx
	ret
mov ax,4c00h
int 21h
code ends
end start

2.用内存单元批量传递数据
在这里插入图片描述
2. 用栈传递参数
将需要传递的参数 入栈
在这里插入图片描述
在这里插入图片描述

905 寄存器冲突问题

在这里插入图片描述
在这里插入图片描述

第十讲 标志寄存器及其应用

1001 标志寄存器

  1. flag寄存器按位起作用,每一位都有特定含义
  2. 8086 cpu1,3,5, 12 -15无意义
  3. 标志寄存器作用
    (1)存储相关指令的执行结果
    (2)为cpu执行指令提供依据
    (3)控制cpu相关工作方式
    在这里插入图片描述
  4. 直接访问标志寄存器
    pushf:压栈 popf:出栈
  5. ZF-零标志(指示相关计算结果是否为零)
    ZF=1 结果为0 ZF=0结果不为0
  6. PF - 奇偶标志位
    执行指令结果二进制结果中1的个数
    1的个数为偶数:PF=1
    1的个数为奇数:PF=0
  7. SF - 符号标志
    将结果视为符号数
    结果为负:SF=1
    结果非负:SF=0
    无符号数时无意义
  8. CF - 进位标志
    进行无符号运算时,CF记录了运算结果的最高有效位向更高位进值。
    有进位或者借位:CF=1
    无进位或者借位:CF=0
  9. OF - 溢出标志
    进行有符号运算,超过机器表示范围称为溢出
    有溢出:OF=1
    无溢出:OF=0
    在这里插入图片描述

1002 带进位的加减法

  1. adc–带进位的加法
    adc ax,bx=(ax)+(bx)+CF
  2. adc指令:大数相加
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 128位数相加
    在这里插入图片描述
    结果存放在第一段中
code segment
start:
	mov ax,data
	mov ds,ax
	mov di,16
	mov si,0
	mov cx,8
	call add128

	mov ax,4c00H
	int 21H
add128:
	push ax
	push cx
	push si
	push di
	sub ax,ax
  s:mov ax,ds:[si]
  	adc ax,ds:[di]
  	mov ds:[si],ax
  	inc si  
  	inc si
  	inc di
  	inc di
  	loop s
  	pop di
  	pop si
  	pop cx
  	pop ax
  	ret
code ends
end start

在这里插入图片描述
(1)不可以,清除掉进位或者借位,将CF清零
(2)不可以,inc不会影响进位,add可能产生进位,避免改变CF的值

  1. sbb指令–带借位的减法
    abb ax,bx
    (ax)=(ax)-(bx)-CF
    在这里插入图片描述

1003cmp指令

  1. cmp是比较指令,相当于减法指令,但不保存结果
  2. 相关指令通过识别被影响的标志寄存器得知比较结果
cmp ax,axmov ax,8 / mov bx,3 / cmp ax,bx
做(ax)-(bx)运算,结果为0,但不在ax保存,仅影响flag各位(ax)= 8,(bx)=3
ZF=1 PF=1 SF=0 CF=0 OF=0ZF=0 PF=1 SF=0 CF=0 OF=0
  1. 无符号数比较与标志位取值
    (1)无符号数
    在这里插入图片描述
    (2)有符号数比较
    在这里插入图片描述
  2. 条件转移指令
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 条件转移指令的使用
    在这里插入图片描述
	cmp ah,bh
	je s
	add ah,bh
	jmp short ok
  s:add ah,ah
 ok:ret

在这里插入图片描述
add ax,0 改变标志寄存器
如果ax=0,则ZF=0

1004 条件转移指令的应用

  1. 双分支结构
    在这里插入图片描述
code segment
start:mov ax,data
	  mov ds,ax
	  mov cx,8
	  mov ax,0
	  mov bx,0
	s:cmp byte ptr [bx],8
	  jne next
	  inc ax
 next:inc bx
 	  loop s
	mov ax,4c00h
	int 21h
code ends
end start

在这里插入图片描述

1005 DF指令和串传送指令

  1. DF—方向标志位 在这里插入图片描述
    在这里插入图片描述

  2. 串传送指令
    es与di配合,为目标段
    在这里插入图片描述

  3. 在这里插入图片描述

code segment
start:mov ax,data
	  mov ds,ax
	  mov es,ax
	  mov si,0
	  mov di,16
	  cld
	  mov cx,16
	s:movsb
	loop s
...

在这里插入图片描述

4.例二 在这里插入图片描述

在这里插入图片描述

第十一讲 直接定址表

1401 移位指令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左移一位*2,右移一位 /2

1402操作显存数据

  1. 显示原理
    有128K
    B8000~BFFFF 32K空间 80*25彩色字符空间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 在这里插入图片描述
    在这里插入图片描述
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,0B8000H
	mov es,ax
	mov si,0
	mov di,160*12+8-16
	mov cx,16
  s:mov al,[si]
  	mov es:[di],al
  	inc di
  	mov al,71
  	mov es:[di],al
  	inc si
  	inc di
  	loop s
...

1602 描述内存单元标号

  1. 标号在这里插入图片描述
  2. 去了冒号的数据标号
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1603 数据的直接定址表

  1. 映射关系在这里插入图片描述
    在这里插入图片描述
  2. 最简解决方式
    在这里插入图片描述
assume cs:code
code segment
start:mov al,2bh
call showbyte
mov ax,4c00h
int 21h

showbyte: 
jmp short show
table db '0123456789ABCDEF'
show: push bx
push es
push cx

mov cl,4     ;高低四位进行分离
mov ah,al
shr ah,cl
and al,00001111b

;高四位字符偏移地址
mov bl,ah
mov bh,0
mov ah,table[bx]
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah
mov al,71h
mov es:[160*12+40*2+1],al

;低四位字符偏移地址
mov bl,al
mov bh,0
mov al,table[bx]
mov es:[160*12+40*2+2],al
mov al,71h
mov es:[160*12+40*2+3],al

pop cx
pop es
pop bx
ret
code ends
end start




  1. 在这里插入图片描述
    在这里插入图片描述
assume cs:code 
code segment
start:mov al,60
      call showsin 
      
      mov ax,4c00h
      int 21h
   
showsin:
      jmp short show
      table dw ag0,ag30,ag60,ag90      //emu8086报错!!!!!!!!
      ag0   db'0',0                    //在debug中可以正常运行
      ag30  db'0.5',0                  
      ag60  db'0.866',0                 
      ag90  db'1',0                      
          
show: push bx
      push es
      push si              
 
      mov bx,0b800h
      mov es,bx

      mov ah,0
      mov bl,30
      div bl
      mov bl,al
      mov bh,0
      add bx,bx      ;60时候,找ag60,因为是字,乘二     
      mov bx,table[bx]
      
      mov si,160*12+40*2
shows: mov ah,cs:[bx]
       cmp ah,0
       je showret
       mov es:[si],ah
       inc si
       mov al,71h
       mov es:[si],al
       inc bx
       inc si
       jmp shows
showret:

      pop si
      pop es
      pop bx
      ret

code ends
end start

1604 代码直接定址表

  1. 实例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 各功能的实现
    在这里插入图片描述
    在这里插入图片描述
assume cs:code 

code segment
start:mov ah,0 ;功能号
      mov al,2
      call setfunction
      
      mov ax,4c00h
      int 21h
      
setfunction:
jmp short set
    table dw fun1,fun2,fun3,fun4
set:push bx
    cmp ah,3
    ja sret
    mov bl,ah
    mov bh,0
    add bx,bx
    call word ptr table[bx]
sret:pop bx
     ret
    
fun1:push bx
     push es
     push cx
     
     mov bx,0b800h
     mov es,bx
     mov cx,2000
     mov bx,0
     
lop1:mov byte ptr es:[bx],' '
     add bx,2
     loop lop1
     
     pop cx
     pop es
     pop bx
     ret   
 
fun2: push bx
       push es
       push cx
       
       mov bx,0b800h
       mov es,bx
       mov cx,2000 
       mov bx,1
       
  lop2:and byte ptr es:[bx],11111000b
       or  es:[bx],al
       add bx,2
       loop lop2
     
       pop cx
       pop es
       pop bx
       ret 
fun3: push bx
       push es
       push cx
       mov cl,4
       shl al,cl  
       
       mov bx,0b800h
       mov es,bx
       mov cx,2000 
       mov bx,1
  lop3:and byte ptr es:[bx],10001111b
       or es:[bx],al
       add bx,2
       loop lop3 
       
       pop cx
       pop es
       pop bx
       ret  
       
fun4:push cx
      push si
      push di
      push es
      push ds
      
      mov si,0b800h
      mov es,si
      mov ds,si
      mov si,160   ;n+1行
      mov di,0
      cld          ;在字串操作中使变址寄存器SI或DI的地址指针自动增加
      mov cx,24
 
 lop4:push cx
      mov cx,160
      rep movsb     ;rep重复执行后面的指令  movsb:源地址是DS:SI,目的地址是ES:DI  ,传送一个字节,之后SI和DI(或者ESI和EDI)/1 
      pop cx
      loop lop4  
      
      mov cx,80
      mov si,0
lop4s:mov byte ptr es:[160*24+si],' '
      add si,2
      loop lop4s
      
      pop ds
      pop es
      pop di
      pop si
      pop cx
      ret
      
code ends
end start

第十二讲 内中断及其处理

1201 中断及其处理

  1. 内中断(CPU内部事件)
    (1)除法错误:0
    (2)单步执行:1
    (3)执行into指令:4
    (4)执行int指令: n
  2. cpu接到中断处理信息
    执行中断程序
    中断处理程序在哪里
    中断信息和其处理程序的入口地址之间有某种联系,cpu根据中断信息可以找到要执行的处理程序
    中断向量表
    在这里插入图片描述
    在这里插入图片描述
    IP = N*4 , CS = IP+2
    3. 中断过程
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1202 编制中断处理程序

  1. do0子程序放在哪
    放在内存确定的位置
    在这里插入图片描述
  2. 程序框架
    do0:显示 overflow
    (1)安装程序:将do0送入内存0000:0200处
    (2)将do0中断处理程序的入口地址0000:0200存储在中断向量表0号表项
  3. 写安装程序
assume cs:code 
code segment
start: ;安装中断向量表
       mov ax,cs
	   mov ds,ax
	   mov si,offset do0
	   mov ax,0
	   mov es,ax
	   mov di,200h
	   mov cx,offset do0end-offset do0 ;do0部分代码长度
	   cld
	   rep movsb
	   ;设置中断向量表
	   mov ax,0
	   mov es,ax
	   mov word ptr es:[0*4],200h
	   mov word ptr es:[0*4+2],0h
do0:   jmp short show  ; 显示字符串overflow
       table db "over flow"
  show:mov ax,cs
       mov ds,ax
       mov si,202h
       
       mov ax,0b800h
       mov es,ax
       mov di,12*160+36*2
       mov cx,10
     s:mov al,[si]
       mov es:[di],al
       inc si
       add di,2
       loop s
       mov ax,4c00h
       int 21h
       do0end:nop
code  ends
end start
       

1203 单步中断

  1. debug提供了单步中断功能 -t
    使用单步中断程序时,debug将TF标志位设为1,使cpu在单步模式运行
  2. 与终端相关的标志位
    TF - 陷阱标志位:(第八位)
    在这里插入图片描述
    IF - 中断标志:(第九位)
    在这里插入图片描述
    在这里插入图片描述
    TF IF设置为0原因:在这里插入图片描述
    在这里插入图片描述
    例如:设置栈
    原因:SS-SP 联合指向栈顶,应该连续完成

1301由int指令引发的中断

  1. 执行n号中断
    在这里插入图片描述
    在这里插入图片描述
  2. 中断例程:7ch的中断例程编写和安装
    在这里插入图片描述
    (1)求一个word型数据的平方
    ax=要计算的参数
    dx,ax存放高低16位返回值
    (2)安装程序
    (3)设置中断向量表,将入口地址保存在7ch表项中
assume cs:code 
code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset sqr
	mov ax,0
	mov es,ax
	mov di,200h
	mov cx,offset sqrend - offset sqr
	cld
	rep movsb
	mov ax,0
	mov es,ax
	mov word ptr es[7ch*4],200h
	mov word ptr es[7ch*4+2],0
	mov ax,4c00h
	int 21h 
sqr:mul ax
	iret
sqrend:nop
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值