程序员不懂汇编,还能在这个行业“混”吗?

黑客为何需要学习汇编语言编程 他们通过研究和了解计算机系统的内部工作原理来发现和利用系统中的漏洞,以获取未经授权的访问或执行特定任务。它们可以通过深入了解计算机系统的内部工作原理,发现和利用系统中的漏洞,执行逆向工程和实施各种攻击。通过学习汇编语言,黑客可以更好地理解已编译程序的内部结构和功能,并可以修改程序以满足自己的需求。与高级编程语言相比,汇编语言更接近计算机的底层指令集架构,因此黑客可以使用它来深入了解计算机系统的工作原理。通过学习汇编语言,黑客可以编写更高级的程序,以执行更复杂和有目的的任务。 阅读详情

“大师,程序员不懂汇编能在这个行业混吗?”

“当然可以了,你在应用层编程,不进入底层就没问题,但是有句话说得好,‘真正的程序员应该理解程序的每个字节’,理解了汇编,会对程序和计算机系统有个透彻的理解,对学习基础知识有很大的好处!”

“那汇编很难吗?”

“不难,它比你会的任何一门语言的语法都简单!”

“哦?那我可以学习一下!你教教我吧!”

“好吧,首先,汇编就是机器语言的助记符,这你肯定知道吧?”

e0a234a4de7f7584264b7d2e31bc63ce.png

“这我明白,然后呢?”

“然后你要理解CPU的寄存器。”

4d73d85467feb9fcd23d59df6782c01c.png

“这....... 不就是像内存一样,一个个小格子吗?为啥要有寄存器? CPU直接操作内存进行运算不就得了?”

“寄存器至少有两个好处: 1. CPU太快,比内存快100倍,CPU等不及内存。我们把寄存器放到CPU内部,紧邻ALU(算术逻辑单元),这样信号几乎可以立即传输了。”

“2. 使用寄存器还有个额外的好处,可以让指令更短,想想看,如果一条机器指令引用了两个64位的地址,它该多长啊!”

“明白了,把地址放到寄存器中,指令会短得多,那寄存器都是叫Register 1, Register 2....... 吗?”

“那肯定不是,按照不同的用途,可以把寄存器分类:”

afba8ea42104793fc5d7be64788ba388.png

“晕了晕了,你还说汇编简单,光是这些莫名其名的寄存器名称就让人崩溃。”

“别担心,我概要地介绍一下,你先有个基本的印象,上图中的EAX、EBX、ECX、EDX在‘大多数情况下’可以认为是‘通用寄存器’, 你可以随便使用。”

“为什么既有EAX, 还有AX、AH、AL ,他们之间有什么关?”

“最早的Intel 8086CPU中,寄存器AX、BX、CX、DX等是16位的,16位(AX)又分为高8位字节(AH),和低位字节(AL),后来Intel 推出32位的CPU,寄存器也就扩展(Extend)到了32位,EAX就出现了!”

“那64位CPU是不是得继续扩展到64位寄存器?”

“孺子可教,x86-64 CPU的寄存器是RAX、RBX、RCX、RDX......  哎哟,扯远了,我们接着说ESI、EDI这两个寄存器,SI是Source Index, DI 是Destination Index,你猜猜他们有什么用处?”

“Source ? Destination?  好像是复制数据时指定从某个源到某个目的地。”

“对喽,有些汇编指令是专门复制数据的,可以用上ESI和EDI。还有两个重要的寄存器EBP和ESP,是专门用来做函数调用的,我们一会儿再说。”

“好吧,大概记住了!”

“汇编确实很简单,你记住,汇编的指令主要是这三类:数据传输类,算术和逻辑运算类,控制类。”

“数据传输类就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。”

mov ax,3210H   ;将0x3210放入寄存器ax
mov ax,bx      ;将bx寄存器的值放入ax
mov ax,[3640]  ;将一个内存单元的值送入ax
mov [502c],bx  ;将bx寄存器的值送入内存单元

“有意思,都是把右边的值复制到左边。”

“这是Intel的汇编格式,在AT&T的汇编格式中,就是把左边值复制放到右边。”

“我看到了方括号[3640]、[502c] 这表示一个内存的物理地址吗?”

“嗯,这真是个好问题,涉及到段寄存器,刚才忘了给你展示了,段寄存器在实模式和保护模式下还不一样,展开讲就太麻烦了,我们先放下,暂时认为这是某个地址吧。再来看看算术和逻辑运算。”

算术和逻辑运算类无非就是加减乘除,AND, OR,  左移,右移

例如:

add ax  bx      ; 把ax和bx的值相加,把结果放入ax寄存器
add ax, [37a0]  ; 把ax和内存的值相加,结果放到ax寄存器
inc bx          ; 对bx的内容加1
shl bx  1       ; 把bx的值左移一位
and al, 11110110b   ; and操作,相当于清除位 0 和位 3 ,其他位不变

“非常容易理解,那第三类控制类指令是什么意思?”

“你想想,用高级语言写程序是不是有很多分支(if else)、循环(while)?”

“对啊,汇编中有这些指令吗?”

“没有,在CPU中实现流程控制的逻辑需要多方配合,在CPU中有很多标志位,例如著名的ZF(零标志位),如果最近的操作的结果为零,则ZF= 1,然后你就可以用另外一条语句判断ZF的值,进行跳转。”

cmp ax bx  ; 比较ax 和 bx ,如果相等,就把ZF标记为1
je  .L1    ;  如果ZF 为1 ,则跳转到.L1处
......代码略......
.L1  sub ax 10

“我的天啊,搞个跳转这么麻烦,还是高级语言好啊!”

“那可不,但是你也要知道,高级语言经过编译,最终都会变成汇编的形式,它是一切编程的本质!”

“嗯,现在程序可以实现顺序执行,按条件跳转,那函数调用该怎么实现?”

“终于到了关键问题了,函数的调用只使用寄存器是搞不定了,需要内存的配合,在内存中建立一个叫做栈的数据结构。”

“栈我知道,先进后出嘛!”

“在这个栈中,每个元素代表一个运行中的函数,比如有三个函数main ,add,square ,main 调用add,add调用square,那在运行时,函数栈是这样的:”

7bd139df0d42d759042c09c7daefcd37.png

“咦,这个栈中每个元素占据的空间不一样啊?”

“每个函数可能有自己的局部变量和各种参数,那大小肯定不同, 我们把这每个元素称为“栈帧”,还记得我们刚才提到的EBP寄存器和ESP寄存器吗?现在就可以派上用场了,用他俩来指向当前栈帧的开始处和结束处。”

bc1aa98e73cb645bd4687cfd689b3a4b.png

“看起来很有道理,但是,只有两个寄存器,函数调用可能有很多层,栈帧就有很多个,不够用啊?”

“所以,当main调用add 的时候,需要把main栈帧的开始地址(就是当前EBP的值)保存到add函数的栈帧中,这样从add返回,就能恢复main的ebp了。”

2525e17696b24ccc9d4cd757e17cde78.png

“明白了,每个栈帧的开始地址相当于一个'门牌号',写在EBP寄存器中,但是EBP只有一个,所以,需要把上个门牌号暂时保存到下一个函数栈帧中。”

“嗯,你这个比喻很到位,同理,当add 调用square,需要把add的EBP保存到square的栈帧中,以便返回时恢复!”

7eef3949420a0976ee6a20d5bf3114f9.png

“如果当前函数执行完,栈帧也就不用了,在废弃掉之前,把内存中的保存的值恢复到EBP当中,并且移动ESP到上个栈帧的顶部,就OK了!”

“懂了,大师,这样仅使用两个寄存器,就能记录无穷无尽的函数调用了,真是妙啊,这办法是谁想出来的啊。”

“不知道是谁先想出来的办法,现在,你觉得汇编很难吗?”

“看起来似乎不难啊!”

“我今天给你说的只是入门罢了,还有很多细节,尤其是当你读操作系统源码的时候,涉及到大量Intel CPU的知识,实模式和保护模式的转换,页表的建立......那个时候就真的很麻烦了。”

“在哪儿能学习这些知识?”

“给你推荐一套闪客写的操作系统教程吧,里边把这些知识点都给覆盖了:”

第一部分 进入内核前的苦力活

开篇词

第一回 | 最开始的两行代码

第二回 | 自己给自己挪个地儿

第三回 | 做好最最基础的准备工作

第四回 | 把自己在硬盘里的其他部分也放到内存来

第五回 | 进入保护模式前的最后一次折腾内存

第六回 | 先解决段寄存器的历史包袱问题

第七回 | 六行代码就进入了保护模式

第八回 | 烦死了又要重新设置一遍 idt 和 gdt

第九回 | Intel 内存管理两板斧:分段与分页

第十回 | 进入 main 函数前的最后一跃!

第一部分完结 进入内核前的苦力活

第二部分 大战前期的初始化工作

第11回 | 整个操作系统就 20 几行代码

第12回 | 管理内存前先划分出三个边界值

第13回 | 主内存初始化 mem_init

第14回 | 中断初始化 trap_init

第15回 | 块设备请求项初始化 blk_dev_init

第16回 | 控制台初始化 tty_init

第17回 | 时间初始化 time_init

第18回 | 进程调度初始化 sched_init

第19回 | 缓冲区初始化 buffer_init

第20回 | 硬盘初始化 hd_init

这张图展示了整个系列的结构

40c1b40d4a36a879413714e63f46390d.png

我听过的最不可能的预测就是「ChatGPT 会取代程序员的工作」—— 恰恰相反,因为 ChatGPT 等工具的出现,我断言未来的十年里,中国新增 5 亿以上的程序员。 如果我们把使用 ChatGPT 等这样的人机接口,用自然语言阐述自己的需求,指挥机器更高效的完成任务的人都叫做程序员的话,我就敢大胆的预测,在未来十年里面,中国会新增 5 亿程序员。如果,A 做法的效率原地踏步很多年,B 做法的效率每年都翻番,也就是用做法 B,一年以后一个人可以产出以前两个人的成果,4 年后是以前 16 个人的成果,那么做法 B 的从业者的工资一定是做法 A 的人的工资的很多倍。生产效率的每一次提升,都带来收益明显翻番,进入门槛明显减低的双重吸引力,巨量的人的涌入是必然的。 阅读详情

相关推荐

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装。

weixin_40132006的博客 2241

中国最牛的5位程序员

一、WPS教父求伯君 金山老总,wps之父求伯君,有“中国第一程序员“之称。求伯君属于中国第一代程序员,在那个年代立志开发属于中国的中文文字处理软件。可以说wps完全能与微软office软件抗衡。但是,国内使用微软office用户基数太大,而且盗版横行,导致收费版的wps举步维艰。但求伯君后来带领金山开发的剑侠系列游戏和金山毒霸非常成功。 二、小米雷军 雷军曾是求伯君的员...

weixin_45820912的博客 5196

ROS与UR10e机械臂实战:从零搭建到精准控制

本文详细介绍了如何从零开始搭建ROS与UR10e机械臂的开发环境,包括硬件准备、软件配置、网络设置以及MoveIt!运动控制实战。通过具体的代码示例和常见问题排查,帮助开发者快速掌握UR10e机械臂的精准控制技术,适用于工业自动化和实验室研究场景。

m3n5b7v8c9x的博客 772

汇编程序员、机器程序员、系统程序员和应用程序员

汇编程序员、机器程序员、系统程序员和应用程序员。汇编程序员专门使用汇编语言进行编程,负责将汇编语言转换为机器语言指令,并优化和调试代码。机器程序员则直接编写机器语言(二进制代码),但现代计算机编程中已非常罕见,更多是指对计算机底层硬件和机器语言有深入了解的程序员。系统程序员负责设计和开发计算机系统软件,如操作系统、数据库管理系统等,并对系统软件进行调试和优化。应用程序员则负责开发各种应用程序,如办公软件、游戏等,使用高级编程语言进行编程,并持续优化应用程序的性能和用户体验。

buwangchuxinking的博客 956

ESP32 CAM使用教程(入门级)

串口被占用,可以关闭其他使用到串口的界面;先将手机也连上wifi,然后使用手机浏览器打开这个IP地址,注意手机连接的wifi需要和开发板的wifi一致,也就是程序里自己修改的那个wifi,否则无法打开IP地址;将开发板连接到电脑,点击点击工具→端口,然后选择自己实际接的COM口,不清楚COM口的可以打开电脑设备管理器查看一下,插拔设备看看哪个COM口会刷新就是哪个COM口;安装好esp32库之后,点击工具→开发板→esp32→AI Thinker ESP32-CAM,型号要仔细找找,不要选错了;

qq_34426854的博客 2万+

从MCU到MPU:瑞萨RZN2L上手初体验,给Cortex-M工程师的Cortex-R52入门避坑指南

本文详细介绍了从MCU到MPU的过渡经验,特别是瑞萨RZN2L开发板的实战避坑指南。针对Cortex-M工程师转向Cortex-R52内核的挑战,文章深入解析了启动流程、内存管理、中断响应等九大本质差异,并提供了硬件设计陷阱和软件迁移的实用技巧,帮助开发者快速适应MPU开发环境。

weixin_29158413的博客 258

实习生搞单片机编程不会怎么办_单片机学习经验(精)

当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具 体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。  于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想...

weixin_39941792的博客 1130

深度学习笔记(1)机器学习与深度学习基础

一些深度学习的简单概念和Transformer的学习。

hanliu2003的博客 1492

要想精通C语言,必须先学习汇编吗?

编程语言里面很少有人直接说出精通两个字,特别是一些入行好多年的程序员,从语法来讲C语言相对来讲入门还是比较容易,在高级语言还没有完全展开的年代,C语言算入门比较简单的编程语言了,起码要比语法细节繁杂的C++好太多了,现在很多做应用开发的程序员觉得能写C语言的都是高手,这完全是一种这山看着那山高的心态了,做C语言还觉得高级语言编程模式复杂,现在越来越多的编...

weixin_34313182的博客 948

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 190

微信小程序 - 获取用户头像昵称等信息(带授权检测)

前言 接口调整官方文档:https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01 在以前,是否授权可以直接弹出询问用户,但现在微信更改了策略,必须由用户点击按钮触发。下面将用代码来实现用户授权及获取用户信息。 功能介绍 无论确认授权还是拒绝授权,都会跳转对应页面,不让用户卡在界面。 点击授权后,下次不在出现授权页面了,如果拒绝,下次依然出现。 以下代码可直接复制粘贴,具体功能如下:

🏆 前端领域优质创作者 1万+

CC++程序员“是否应该掌握”【某种汇编语言】?

工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,

技术思行 1万+

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2637

不会“脱口秀”、“摇滚”的程序员,不是好“模特“!

时间过得实在快,马上到11月份了,舍不得这个夏天! 我知道这个夏天不只是我的夏天,还是乐队的! 程序员可以很摇滚! 综艺节目《乐队的夏天》帮助摇滚人再度翻红,也让我们认识了一位特别的程序员小哥哥,赵子建。 生活中,他平凡如你我。办公楼,格子间,电脑不离身,这是他的工作,却不一定是他的热爱。 一个人在做他热爱的事情,是会发光的!就像他在舞台展现摇滚的时候。你望向他,一样的角度,不一样的气质! 他是刺猬乐队的主唱,如同队名一样,刺猬,情绪来了就“扎你”一下,他们的乐队玩儿的就是情绪! 子健深深体验过各种情绪

大团猿的博客 2456

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

程序员并非“万能技术工”

程序员并不是万能修理工,这种期待本质上是技术知识分工被忽视的结果。社会需要认识到,技术世界的复杂性不允许某一个职业覆盖所有领域的知识。与此同时,这种误解虽然有害,但也为程序员群体带来了一定的“无知的尊重”,值得程序员自己去反思和取舍。

scoful的专栏 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

浅谈程序员的“内卷化”

一、什么是内卷化 最近开始了解到一个很有意思的词——“内卷化”,如果你还不知道这个词,那就非常建议往下看。 什么是内卷化?内卷化,亦称过密化,最初由文化人类学家亚历山大·戈登威泽提出,用于描述社会文化模式的变迁规律。当一种文化模式进入到最终的固定状态时,便逐渐局限于自身内部不断进行复杂化的转变,从而再也无法转化为新的文化形态。在中国语境下,内卷化概念最初闻名自历史学家杜赞奇对于古代中国经济生活的研究成果中。杜赞奇借用内卷化一词描述清代人口爆炸,廉价劳动力过剩,从而无法带动技术革新,使得古代中国的经济形态长期

数据一哥,公众号:数据社 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

程序员保值的4个秘密

年龄会是程序员的诅咒吗?越老越不值钱吗?No,保鲜有秘诀,认准方向就能越来越值钱。

安晓辉生涯——聚焦程序员的职业规划与成长 4万+

C\C++程序员“是否应该掌握”【某种汇编语言】?

工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,

Neicole ~~ 学习旅程(大学) 1081

程序员如何避免“内卷化“

一、什么是内卷化 最近开始了解到一个很有意思的词——“内卷化”,如果你还不知道这个词,那就非常建议往下看。 什么是内卷化?内卷化,亦称过密化,最初由文化人类学家亚历山大·戈登威泽提出,用于描述社会文化模式的变迁规律。当一种文化模式进入到最终的固定状态时,便逐渐局限于自身内部不断进行复杂化的转变,从而再也无法转化为新的文化形态。在中国语境下,内卷化概念最初闻名自历史学家杜赞奇对于古代中国经济生活的研究成果中。杜赞奇借用内卷化一词描述清代人口爆炸,廉价劳动力过剩,从而无法带动技术革新,使得古代中国的经济形态长期

iOSjack的博客 605

“程序员”有感

今天刚听了华为的实习生招聘会议,恰巧看到这么一段评论! 偶然有感 对于互联网行业,网络上总是充斥着这么几点评论——“高薪”、“码农”、“CV工程师”、“996”、“35岁职业危机” **首先,**我认为时代在进步,而且任何行业都在快速发展着,只有持续学习才能跟上时代的脚步、不被淘汰,对于职业危机这一言论,我认为不仅仅体现在计算机行业,可能计算机行业相对其他行业(诸如硬件、机械、土木)来说,就业黄金年龄是偏短,但是也没有想象中那么大的差距。任何一个行业都存在着行业危机,要想在一个行业长久做下去,必须通过持续

m0_49591654的博客 205

程序员的百年之路:从汇编到AI编程的演化时间轴

本文梳理了编程语言的六个发展阶段:从早期的机器码和汇编语言(1940s),到高级语言如Fortran和C(1960s),再到面向对象和Web编程的兴起(1980s-2000s)。随着云计算和开源协作的发展(2000s-2010s),编程进入低代码和AI时代(2018至今)。文章重点分析了低代码平台和AI编程工具(如GitHub Copilot)如何改变开发方式,并指出程序员角色正从"代码实现"转向"架构设计"和"AI协作"。未来编程将更注重意图表达,AI处理实现细节,人类聚焦创意和架构。

欢迎来到我的优快云博客!我专注于技术创新和数字化转型,特别是在低代码平台、人工智能和大数据分析领域的探索与应用。通过深入分析各种行业案例,帮助企业加速数字化进程,提升运营效率与创新能力。在这里,您将找到关于低代码平台、AI技术、数据分析与 2245

CC++程序员是否应该掌握汇编语言?

写的挺好的文章 http://c.chinaitlab.com/basic/863415.html 工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,我要坚

xinpo66的专栏 3259

每个程序员的起点:回顾“Hello World”的演变与启示

无论你是软件开发的新手,还是技术领域的资深专家,几乎每个人在学习编程语言的初期,都曾经历过一个共同的瞬间——编写第一个“Hello World”程序。这是程序员生涯中的一个标志性时刻,它代表着从零开始学习的启程,象征着语言和工具的掌握,也开启了一个与计算机交流的全新世界。 然而,很多人对“Hello World”的理解,常常仅停留在“它是第一个程序”的表面。作为 AI 专家、资深软件开发专家和软件测试专家,我们不仅应当看到它作为一个编程入门的符号,更应思考它背后深刻的技术哲学和编程思维的变迁。

测试者家园 886

如何成为很厉害的程序员?这几点很重要

莫等闲,白了少年头,空悲切

龙叔的博客 2万+
上一篇: 背了黑锅以后,我找到了二师兄帮忙...
下一篇: 英特尔又做了个“违背祖宗的决定”
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值