汇编语言基本概念汇总

      汇编语言应该是我们现在学的最“低级”的语言了,因为现在不会再有人去学机器语言了。而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。以下资料是为了大学的汇编考试整理的资料,现在与大家分享,希望能给大家提供帮助。

汇编语言程序设计汇总

计算机主要由运算器、控制器、存储器和输入输出设备五大部件构成。
字长word是指微处理器内部一次可以并行处理二进制代码的位数,它与微处理器内部寄存器以及CPU内部数据总线宽度是一致的,字长越长,所表示的数据精度就越高。
内存是由若干个存储单元组成,每个单元分配一个固定的地址并且存放一个字节的数据。
MIPS Millions of Instruction Per Second   每秒百万条指令
微机系统采用了多种系统总线标准,如ISA/EISA/VESA/PCI
系统总线分为数据总线、地址总线、控制总线。
Data Bus: DB
Address Bus: AB
讨论存储器容量时,以2的10次方即1024为基本单元,称为1K。1024K就是1M。
Control Bus : CB
CPU主频越高,其运算速度就越快。字长代表了CPU对数据处理的能力和精度。
OS的主要部分是常驻监督程序Monitor,只要一开机就存在于内存中,可以从用户接收命令,并使OS执行相应的动作。
汇编语言和机器语言一一对应。
汇编程序就是用来把由用户编制的汇编程序翻译成机器语言程序的一种系统程序。
高级语言的翻译程序有两种:
一种是先把高级语言程序翻译成机器语言,(或先翻译成汇编语言,然后又汇编程序再次翻译成机器语言)然后才能在机器上执行。——编译程序
直接把高级语言程序在机器上运行,一边解释一边执行。——解释程序
翻译程序包括汇编程序、解释程序、编译程序。
ALU :算术逻辑运算单元:用来进行算术和逻辑运算及其相应操作。
8086 CPU内部结构按功能分为:
总线接口单元 BIU:Bus Interface Unit
执行单元 EU: Executive Unit
8086对存储器和IO设备的所有操作都是由BIU完成的。
8086CPU的20位地址线可直接寻址1M存储器物理空间,但CPU内部寄存器均为16位的寄存器,16位寄存器如何实现20位地址寻址呢?
CPU是将有关寄存器内容左移4位,然后由专门地址加法器,与16位偏移地址相加,形成20位的物理地址,以便找到存储单元。
指令指针 IP : Instruction Pointer
IP 用来存放下一条要执行指令在代码中的偏移地址。
IP的内容由BIU自动修改,使它总是指向下一条要取的指令在现行代码段中的偏移地址。
由于BIU和EU是各自独立并行工作的。在EU执行指令的同时,BIU可预取下面一条或几条指令。
Flags:反映CPU运算中的状态特征和存放某些控制标志。
通用寄存器组:
包括4个16位的数据寄存器:AX/BX/CX/DX
和4个16位指针与变址寄存器:SP/BP/SI/DI
8086CPU的外部数据总线和内部数据总线都是16位的,是真正的16位机。
寄存器可以分为程序可见寄存器和程序不可见寄存器。
程序可见寄存器是指在汇编语言程序设计中用到的寄存器,可以由指令来指定。
程序不可见寄存器指一般程序设计中不用而由系统所用的寄存器。
程序可见寄存器可以分为通用寄存器、专用寄存器和段寄存器。
AX/BX/CX/DX是数据寄存器,用来暂时存放计算过程中用到的操作数,结果或其他信息。可以以字(16位),或字节(8位)形式访问。都是通用寄存器,但又有各自专用的功能。
AX: Accumulator,做累加器用,是算术运算的主要寄存器。
BX: Base,做通用寄存器使。在计算存储器地址时,常用作基址寄存器。
CX:Count,作为通用寄存器使用,常用来保存计数值。如在移位指令、循环和串处理指令中作隐含的计数器。
DX:Data:可做通用寄存器使用,在做双字长运算时把DX和AX组合在一起存放一个双字长数,DX存放高位字。
SP/BP/SI/DI四个16位寄存器可以像数据寄存器一样在运算中存放操作数。但只能以字(16位)为单位使用。
一般用在存储器寻址时,提供偏移地址。
SP:Stack Pointer:栈指针寄存器,用来指示栈顶的偏移地址。
BP:Base Pointer:基址指针寄存器。
SI:Source Index:源变址寄存器
DI: Destination Index:目的变址寄存器
CS:段寄存器
IP:Instruction Pointer 是指令指针寄存器,用来存放代码段中的偏移地址。在程序运行中,始终指向下一条指令的首地址。与CS连用确定下一条指令的物理地址。
Flags是标志寄存器,又称程序状态字寄存器PSW   Program Status Word
条件码标志记录程序中运行结果的状态信息,是根据有关指令的运行结果由CPU自动设置的。这些状态信息作为后续条件转移指令的转移控制条件,所以称为条件码。
OF: Overflow Flag 溢出标志
SF: Sign Flag  符号标志
ZF: Zero flag  零标志
CF: Carry Flag   进位标志
AF: Auxiliary Carry Flag   辅助进位标志
PF: Parity Flag    奇偶标志
DF :Direction Flag    方向标志
IF: Interrupt Flag  中断标志
段寄存器也是一种专用寄存器,专用于存储器寻址,用来直接或间接存放段地址。
CS: Code Segment   代码段寄存器
DS: Data Segment   数据段寄存器
SS: Stack Segment   堆栈段寄存器
ES: Extra Segment   附加段寄存器

一个存储单元中存放的信息称为该存储单元的内容。
在存储单元里以字节为单位存储信息。
如果机器字长为8位时,则地址为0004H单元中存放的信息为78H。也就是说,该单元的内容为78H。(0004H)=78H
一个字存入存储器要占有连续的两个字节单元。存放时低位字节存入低地址,高位字节存入高地址。这样两个字节单元就构成了一个字单元。            字单元的地址用它的低地址表示。(0004H)=5678H
双字单元的存放方式与字单元类似,他被存放在相继的4个字节中,低位字存入低地址区,高位字存入高地址区。双字单元的地址有其最低字节的地址指定。(0004H)=12345678H。
1字=2字节
同一个地址既可以作为字节单元的地址,又可看做字单元,双字单元或四字单元的地址。
如果用X表示某存储单元的地址,则X单元的内容可以表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))表示Y单元的内容。

eg:(0004H)=5678H,5678H又是一个存储单元地址,(5678H)=2F1EH,2F1EH才是真正的内容。
即((0004H))=2F1EH。

在1M的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
段地址是指每一段的起始地址(又称段基地址),由于他必须是段的首地址,所以低四位一定是0,可以规定段地址只取段起始地址的高16位值。
偏移地址指在段内相对于段起始地址的偏移值。
把段地址左移四位再加上偏移地址就形成物理地址。
物理地址=段地址*16D+偏移地址
等价于
物理地址=段地址*10H+偏移地址
专门存放段地址的寄存器,称为段寄存器。
CS:代码段
DS:数据段
SS:堆栈段
ES:附加段
每个段寄存器可以确定一个段的起始地址。
MOV AX,ES:[BX]
ES作段寄存器,BX作间接寄存器寻址的单元送入AX寄存器。
MOV BX,ES:[SI]
ES作段寄存器,SI作间址寄存器的寻址单元内容送入BX寄存器。
MOV EAX,DS:[BP]
DS作段寄存器,BP作间址寄存器寻址的单元内容送入EAX寄存器。
一个计算机的指令集合,就是该计算机的指令系统。
每条指令有两部分组成,操作码字段和地址码字段。
操作码字段:说明该指令所要完成的操作,即该条指令的性质。
地址码字段:描述该指令的操作对象。
一般地址码字段一般是直接给出操作数;或者给出操作数存放的寄存器编号;或者给出操作数存放的存储单元的地址或有关的地址的信息。
根据地址码字段所给出的地址的个数,指令格式可分为零地址、一地址、二地址、三地址、多地址指令。
指令中用于确定操作数存放地址的方法,称为寻址方式。
如果地址码字段直接给出了操作数,这种寻址方式是立即寻址。
如果地址码字段指出了操作数所在的寄存器编号,叫寄存器寻址。
如果操作数存放在存储器中,则地址码字段通过各种方式给出了存储器地址,叫存储器寻址。
寻找和获得操作数或操作数存放地址或指令转移地址的方法称为寻址方式。
操作数及操作结果存放的地址有三处:存放在指令的地址码字段中;存放在寄存器中;存放在存储器的数据段(DS)、堆栈段(SS)或附加数据段(ES)中。
其对应有三种操作数:立即操作数、寄存器操作数、存储器操作数
要寻找这些操作数就有三种基本寻址方式:立即寻址方式、寄存器寻址方式、存储器寻址方式。
立即寻址方式寻找的操作数紧跟在指令操作码之后。
格式:操作码 数字表达式
MOV AX,267
MOV AL,10010011B AND 0FEH
MOV AL,PORT1
MOV AX,DATA1
“267”是数字,“10010011B AND 0FEH”是数字表达式,PORT1是一个符号名,属于常数。DATA1是定义的段名,就是段地址,属于常数。
汇编立即寻址方式时,汇编程序首先计算数字表达式的值,然后写入指令的地址码字段,称为立即数。
寄存器寻址是指要寻找的操作数在某个寄存器中。
格式:操作码 寄存器名
MOV AX,BX
MOV AL,BL
汇编程序将寄存器的地址编号写入指令的地址码字段,当机器执行含有这种寻址方式的指令时,根据地址码字段的编号访问到寄存器,继而访问到操作数。
存储器寻址方式:当操作数放在存储器中的某个单元时,CPU要访问存储器才能获得该操作数。如果存储器的存储单元是20位,通过各种方法算出段内偏移地址(有效地址),结合段地址形成20位物理地址,找到操作数,称为存储器寻址。
直接寻址方式是指要寻找的操作数的地址在指令中直接给出。
格式:
操作码 地址表达式
操作码 [地址表达式]
操作码 [数字表达式]

如:假设TABLE是在数据段定义的一个字节数组的首地址标号,偏移地址为1000H
MOV AL,TABLE
MOV AL,[TABLE]
MOV AL,[1000H]
是等价的。
直接寻址方式默认的段地址是DS。
若允许在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址,这就是段超越。
用段超越前缀表示:
段寄存器名:地址表达式
段寄存器名:[地址表达式]
段寄存器名:数字表达式
段寄存器名:[数字表达式]
如:
设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]
表示将字节数组的第一个数组元素送入AL寄存器中。
寄存器间接寻址方式:通常将BX,BP称为基址寄存器,SI,DI称为变址寄存器,寻址时操作数的地址被放在这些寄存器中。
格式:
操作码 [基址寄存器名或变址寄存器名]
MOV AX,[BX]
MOV AX,[SI]
也允许指定段超越前缀来取得其他段中的数据:
MOV AX,ES:[BX]
寄存器相对寻址:
操作数的偏移地址是指定寄存器的值与一个整数之和。
格式:
操作码 变量名[机制寄存器名或变址寄存器名]
操作码 [变量名+基址寄存器名或变址寄存器名]
操作码 符号名[机制寄存器名或变址寄存器名]
操作码 [符号名+基址寄存器名或变址寄存器名]
操作码 机制寄存器名或变址寄存器名+/-数字表达式
如:
MOV SI,5
MOV AL,TABLE[SI]   == MOV AL,[TABLE+SI]

基址变址寻址方式:操作数的偏移地址是两个指定寄存器的值之和。
格式:
操作码 [基址寄存器名][变址寄存器名]
操作码 [基址寄存器名+变址寄存器名]
如:
MOV AX,[BX][SI]
MOV AX,[BX+SI]
当机器执行含有这种寻址方式的指令时,依据地址码字段的值得到基址寄存器和变址寄存器的值,将其相加,和作为操作数的偏移地址。

可以用段超越前缀重新指定段寄存器:
MOV AL,ES:[BX][SI]
相对基址变址寻址:操作数偏移地址是指定寄存器的值与相对偏移量之和。
MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]
格式:
操作码 变量名[基址寄存器名][变址寄存器名]
操作码 变量名[基址寄存器名+变址寄存器名]
操作码 [变量名+基址寄存器名+变址寄存器名]
符号名 变量名[基址寄存器名][变址寄存器名]
符号名 变量名[基址寄存器名+变址寄存器名]
符号名 [变量名+基址寄存器名+变址寄存器名]
操作码 [基址寄存器名+变址寄存器名+/-数字表达式]

四类传送指令:通用传送指令、累加器专用传送指令、地址传送指令、标志传送指令
DST:目的操作数
SRC:源操作数
REG:寄存器
SEGREG:段寄存器
MEM:存储器
DATA:立即数
PUSHF:标志入栈指令
POPF:标志出栈指令
XCHG:交换指令
MOV:可实现寄存器之间、寄存器和存储器之间传送数据,还可实现立即数送寄存器或存储单元的操作。
MOV:原操作数与目的操作数不能同时为存储器寻址方式,即两个内存单元之间不能直接传送指令。
MOV:两个段寄存器之间不允许直接传送数据。
把CPU内部的寄存器细分为段寄存器和寄存器。MOV有9种指令。
MOV的9种传送方式:
从寄存器到寄存器
MOV REG1,REG2
如:
MOV AX,BX
MOV AH,CL
MOV BX,SI
MOV DI,DX

从寄存器到段寄存器
MOV SEGREG1,REG
如:
MOV DS,AX
MOV ES,DX
MOV SS,DI

从寄存器到存储器
MOV MEM,REG
MEN指以下五种存储器寻址方式:直接、寄存器间接、寄存器相对、基址变址、相对基址变址。
如:
TABLE是定义的字变量
MOV TABLE,AX
MOV [BX],BX
MOV TABLE[BX],CX
MOV [BX][SI],DX
MOV TABLE[BX][SI],AX

从段寄存器到寄存器
MOV REG,SEGREG
格式:
MOV AX,CS
MOV BX,ES
MOV DI,SS
MOV SI,DS

从存储器到寄存器
MOV REG,MEM
格式:
MOV AX,TABLE
MOV BX,[BX]
MOV CX,TABLE[BX]
MOV DX,[BX][SI]
MOV AX,TABLE[BX][SI]

从段寄存器到存储器
MOV MEM,SEGREG
格式:
MOV TABLE,CS
MOV [BX],ES
MOV TABLE[DI],SS
MOV [BX][SI],DS
MOV TABLE[BX][SI],ES

从存储器到段寄存器
MOV SEGREG,MEM
格式:
MOV ES,[BX]
MOV SS,TABLE[DI]
MOV DS,[BX][SI]

从立即数到寄存器
MOV REG,DATA
格式:
MOV AX,OOH
MOV BX,12H
MOV CX,34H
MOV SI,56H

从立即数到存储器
MOV MEM,DATA
格式:
MOV TABLE,DATA
MOV WORD RTR[BX],0FFSET TABLE
MOV TABLE[DI],ABC
MOV [BX][SI],ABC+2
MOV TABLE[BP][SI],0FFH
ABC是符号名,相当于一个常数,TABLE是变量名。

PUSH指令
格式:
PUSH SRC
将16位寄存器、段寄存器、16位存储单元数据压入堆栈。
POP指令
格式:
POP DST
将堆栈中的16位数据送入16位寄存器、段寄存器、16位存储单元中。
堆栈中数据的压入弹出必须以字为单位进行。
PUSHF指令
格式:
PUSHF
将标志寄存器内容压入堆栈
POPF
格式:
POPF
将16位堆栈数据弹入标志寄存器中。
XCHG指令
XCHG指令可实现字互换和字节互换。
互换可以在寄存器之间进行,也可以在寄存器和存储单元之间进行。
格式:
XCHG DST,SRC
互换源、目的两个操作数的存放位置。
XCHG指令源、目的操作数的寻址方式不允许是立即寻址方式,两个存储单元之间不能直接互换数据。
地址传送指令:将地址送到指定的寄存器中
LEA:偏移地址送寄存器
LDS:指针送指定寄存器和DS
LES:指针送指定寄存器和ES
格式:LEA REG,SRC
操作:(REG)SRC的偏移地址
功能:把源操作数的偏移地址送到指定的寄存器

LDS:指针送指定寄存器和DS寄存器
格式:LDS REG,SRC
操作:(REG)(SRC)
     (DS)(SRC+2)
功能:将源操作数寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送DS寄存器。

LES:指针送指定寄存器和ES寄存器指令
格式:LES REG,SEC
操作:(REG)(SRC)
      (ES)(SRC+2)
功能:将源操作数寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送ES寄存器。
LEA BX,TABLE
TABLE是数据段中定义的地址标号,指令执行前,如果(BX)=0000H,(DS)=2000H,TABLE=20020H,执行后,(BX)=0020H
加法指令ADD
格式:ADD DST,SRC
操作:(DST)(SRC)+(DST)
功能:完成源操作数和目的操作数的加法运算,并把运算结果保存在目的操作数中。
带进位加法指令ADC
格式:ADC DST,SRC
操作:(DST)(SRC)+(DST)+CF
功能:完成带进位的源操作数和目的操作数的加法运算,并把结果保存在目的操作数中。

增量指令 INC
格式:INC DST
操作:(DST)(DST)+1
功能:完成目的操作数的自加运算

ADD和ADC指令两个操作数不能同时为存储器寻址方式,并且目的操作数不能为立即数寻址方式。
INC指令的操作数不能为立即数寻址方式。
完成双字长相加,被加数存放在DX和AX中,加数放在BX和CX中,和放在DX和AX中,
ADD AX,CX
ADC DX,BX

SUB减法指令
格式:SUB DST,SRC
操作:(DST)(DST)-(SRC)
功能:完成源操作数和目的操作数的减法运算,把结果保存在目的操作数中。
SBB 带借位减法指令
格式:SBB DST,SRC
操作:(DST)(DST)-(SRC)-CF
功能:完成带借位的源操作数和目的操作数的减法运算,并把运算结果保存在目的操作数中。

DEC 减量指令
格式:DEC DST
操作:(DST)(DST)-1
功能:完成目的操作数的自减运算。

NEG 求补指令
格式:NEG DST
操作:(DST)0-(DST)
0-操作数=-操作数

CF表示机器的最高有效位向更高有效位的进位。
减数>被减数,此时有借位,则CF=1,否则CF=0.
完成双字长相减操作,被减数存放在DX和AX中,减数存放在BX与CX中,差放在DX和AX中,
SUB AX,CX
SBB DX,BX
乘法指令
乘法指令可对字节、字、双字进行操作,且可对有符号数整数或无符号整数进行操作。
两个8位数相乘,结果为16位数。
两个16位数相乘,结果为32位数。
无符号数指令MUL
格式:MUL SRC
操作:
字节操作:(AX)(AL)*SRC
字操作:(DX-AX)(AX)*SRC
有符号数乘法指令IMUL
格式:IMUL SRC
在乘法指令中,被乘数也即目的操作数隐含在AX(字运算)或AL(字节运算)中,乘数也即源操作数。
两个8位数相乘是16位,存放在AX中。
两个16位数相乘是32位,存放在DX,AX中。
其中DX存放高位字,AX存放低位字。
MUL CL  ;AL的内容乘以CL的内容,无符号数存于AX。
IMUL DL   ;AL的内容乘以DL的内容,有符号数存于AX。
MUL BYTE PTR[BX]    ;AL内容乘以数据段中由BX寻址的字节存储单元的内容,无符号积存于AX。
120. IMUL WORD PTR[BP]    ;AX内容乘以堆栈段中由BP寻址的字存储单元的内容,带符号的积存于DX,AX。
121. 逻辑运算指令:可对8位数或16位数进行逻辑运算,是按位操作的。
122.AND逻辑与指令
格式:AND DST,SRC
操作:(DST)(DST)(SRC)
本指令的功能用于使某个操作数中的若干位维持不变,而使另外若干位位0的操作,也称屏蔽某些位。
要维持不变的位必须和1相与,而要置零的位必须和0相与。
123.屏蔽AL中的高四位
AND AL,00001111B
124.AND AL,AL
指令执行前后,AL无变化,但执行后使标志位发生了变化,即CF=0,OF=0.
125.OR逻辑或指令
格式:OR DST,SRC
操作:(DST)(DST)(SRC)
本指令用于使某个操作数中的若干位维持不变,使另外若干位置1的场合。要维持不变的必须和0相或,而置为1的位必须和1相或。
126.OR AL,10000000B
若执行前(AL)=OFH,则执行后(AL)=8FH.
127.OR AL,AL
指令执行前后,(AL)不变,但执行后标志位发生了变化,即CF=0,OF=0.
128.XOR 逻辑异或指令
格式:XOR DST,SRC
操作:(DST)(DST)异或(SRC)
用于判断两个数是否相等;也可用于操作数中的若干位维持不变,而使另外若干位取反的操作,维持不变的位与0相异或,取反的位与1相异或。
129.XOR AL,AL
执行后,使(AL)=0,CF=0,OF=0.
130.测试AL是否等于33H
XOR AL,33H
JZ MATCH
131.使AL中最高位和最低位取反,其他位保持不变
XOR AL,10000001B
132.TEST测试指令
格式:TEST DST,SRC
操作:(DST)  (SRC)
用于不改变原有操作数的情况下,用来检测某一位或某几位的条件是否满足,用于条件转移指令的先行指令。
不检测的那些位与0相与,即屏蔽掉。
检测的那些位与1相与,即保持不变。
133.检测(AL)的最高位是否为1,若为1则转移,否则顺序执行。
TEST AL,10000000B
JNZ AA
…..
AA:…

134.NOT逻辑非指令
格式:NOT DST
寻址方式不允许为立即寻址方式及段寄存器。
135.指令寻址方式是确定下一条要执行指令的地址的方法。
136.段内直接寻址
这种寻址方式的汇编格式有三种:
指令名 SHORT 转移目标地址标号
指令名 转移目标地址标号
指令名 NEAR PTR 转移目标地址标号
指令中直接指明了要转移的目标地址,因此叫直接寻址。又因为这种指令只改变了IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。
当执行这种寻址方式的转移指令时,机器取出位移量,与当前IP相加,和送入IP寄存器中,CS寄存器内容保持不变,从而实现转移。

位移量不同,转移范围不同。当位移量位8位,只允许转移到与本条指令的下一条指令相距-128~127范围内的存储单元中。当位移量位16位时,允许转移到当前代码段内任何地方。

137.位移量可以是一个带符号的8位数,也可以是一个带符号的16位数。表示了转移地址偏移本条指令的下一条指令的字节数。负数表明要向当前指令的后面跳转,整数要向当前指令的前面跳转。
138.条件转移指令的位移量只能是8位,而无条件转移指令可以是8位或16位。
139.转移指令是一种主要的程序控制指令,其中无条件转移指令使汇编者能跳过程序某些部分转移到任何分支中去。
140.条件转移指令可使编程者根据结果来决定转到何处。测试的结果保存在标志位中,然后又被条件转移指令检测。
141.比较两个数,若两数相等则转移,否则顺序执行
CMP AX,BX
JZ SS2


SS1:…
SS2:…

142.两个无符号数比较大小时,机器根据CF标志位来判断大小,即两无符号数相减,若不够减,则最高位有借位,CF=1;否则CF=0。
当CF=1时,说明被减数低于减数;
当CF=0且ZF=0时,说明被减数高于减数;
当CF=0且ZF=1时,说明被减数等于减数。
143.变量TABLE中存放了一个偏移地址,当无符号数X小于、等于或大于此偏移地址时,应去执行三个不同的程序段。
MOV BX,TABLE
MOV AX,X
CMP AX,BX
JA SS3

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值