开始使用MASM

 这篇教程翻译自《Inetl汇编语言程序设计》一书的作者Kip R. Irvine的文章Getting Started with MASM ,翻译的目的在于方便学习。本人翻译水平有限,有兴趣的大侠可以直接阅读原文。

      同时感谢Adam_syd的中肯意见。

  

 

      本教程将在指导你在轻松、有序的过程中,完成学习《Inetl汇编语言程序设计》(第5版)所需的软件环境配置,使你将更多的精力投入到汇编语言的学习当中去。如果你急于开始工作,那么你可以直接阅读第1节。

  1. 32位应用程序必须完成的设置工作;
  2. 创建16位的应用程序;
  3. 项目属性设置;
  4. 头开始创建一个项目;
  5. 生成一个源代码列表文件;
  6. 使用 Visual Studio 2005 进行调试;
  7. MASM语法的高亮显示;
  8. 用批处理文件进行汇编、链接和调试。


    在本篇教程中发现错误?请立即发邮件通知我。除了明确标示,本篇教程的所有方法都可以同时应用于Visual Studio 2005 和 Visual C++ 2005 Express。



1. 32位应用程序必须完成的设置工作

    如果你使用的是Visual Studio 2005 专业版或团队版,那么这些版本的产品中已经包含了微软的汇编器 8.0(Microsoft Assembler 8.0)。你可以跳过步骤1和步骤2,直接开始步骤3了。

步骤1:安装Visual C++ 2005 Express

    在你购买《Intel 汇编语言程序设计》(第5版)时,该书应该附有随书光盘。在光盘中包含Visual C++ 2005 Express。你将使用它来编写、编辑、编译、调试并运行你的汇编语言程序。如果购买该书时,没有随书光盘,那么你可以到微软的网站上直接下载该工具软件

    注意:微软已经表示,在Visual C++ 2008 Express 中可以直接构建汇编语言程序。我们希望这一天能够早日到来!

    当你完成Visual C++的安装后,请留意你的C++编译的安装目录。这些信息将对你以后的工作有所帮助。
从现在起,我们将从Visual C++ 2005 Express这词中省略“2005”,直接称之为Visual C++ Express。

步骤2:下载微软汇编器

    访问微软的 MASM 8.0 下载站点

    遵从微软页面上的下载和安装指令完成安装。

步骤3:安装《Intel 汇编语言程序设计》(第5版)中的示例程序

    点击这个链接获得该书的最新链接库和示例程序。这些示例程序是由自解压程序,将自动将文件解压到你c:/Irvine目录下。除非这个目录你有其他的特殊用途,否则最好不要改动它。如果你要改动这个解压目录的位置,请参考修改项目属性中的相关内容。

    解压到c:/Irvine目录中的文件应该有:

文件名描述
GraphWin.inc编写Windows程序所需的头文件
Irvine16.incIrvine16链接库所使用的头文件(16位应用程序)
Irvine16.lib书中用到的16位链接函数库
Irvine32.incIrvine32链接库所使用的头文件(32位应用程序)
Link16.exe16位链接器
Irvine32.lib书中用到的32位链接函数库
Macros.inc包含宏定义的头文件
SmallWin.incIrvine32.inc使用的头文件。(这个文件一点都不小,所谓的小是相对于windows.h来说的。内容基本上都是作者参照windows api 翻译过来的32位 windows 汇编函数api。呵呵,这个最值钱了……)
User32.libWindows函数的链接库
make16.bat构建16位应用程序使用的批处理文件
VirtualKeys.inc       
Irvine32.inc使用的,定义虚拟键盘码的头文件


    一个名为Examples的子目录将包含书中所有的示例程序。

步骤4:构建一个汇编语言例子程序
预备步骤: 将制表符大小设为5个空格

    运行Visual C++ Express,在Tools菜单中选择Options菜单项,选择Text Editor,选择All Languages,在选择Tabs:



    设置Tab尺寸和缩进尺寸为5。

打开一个项目

    Visual Studio和Visual C++ 快递版中所有的汇编语言源代码都必须依附于一个类似于容器的项目中。项目文件用于保存各种配置信息,例如汇编器、连接器和各种所需库文件的位置。一个项目拥有自己的目录,该目录保存各种属于项目的文件名称和路径。在c:/Irvine/目录下,我们用于一个名为Project_Sample的示例项目目录。

    依次完成下列步骤:

  1. 运行Visual Studio或Visual C++ Express;
  2. 如果你使用的是Visual Studio,从File菜单中选择Open Project。或者,如果你使用的是Visual C++ Express,选择Open,再选择Project/Solution;
  3. 浏览到c:/Irvine/Examples/Project_Sample目录,打开名为Project.sln的文件;
  4. 在Solution Explorer窗口,点击符号+,展开名为Project的子项。双击main.asm文件,在editing窗口打开它。(Visual Studio用户可能会看到一个弹出对话框,询问对asm文件的编码方式。点击OK按钮继续。)


    提示:如果看不到Solution Explorer窗口,在View菜单中选择Solution Explorer项即可。又或者,你在Solution Explorer窗口中看不见main.asm文件,在窗口的底部,顺着tab页,点击选择Solution Explorer页。

    你在editor窗口中应该可以看见下面的程序清单:

TITLE MASM Template                 ( main . asm )

;  Description:
;
;  Revision  date :

INCLUDE Irvine32
. inc

. data
myMessage BYTE 
" MASM program example " , 0dh , 0ah , 0

. code
main PROC
    
call  Clrscr

    mov  edx
, OFFSET myMessage
    
call  WriteString

    
exit
main ENDP

END  main


    稍后,我们将向你展示如何复制这个程序,并以此为切入点开始编写你自己的汇编程序。

构建程序

    下一步,你将要构建(汇编和链接)这个例子程序:

  • 如果你使用的是Visual C++ Express,从Build菜单中选择Build Solution;
  • 如果你使用的是Visual Studio,从Build菜单中选择Build Project。

    在屏幕底部的输出窗口中,你应该可以看到如下信息,只是构建的进程:

1 > ------ Build started: Project: Project ,  Configuration:  Debug  Win32 ------
1 > Assembling ...
1 > Assembling:  . main . asm
1 > Linking ...
1 > Embedding manifest ...
1 > Build log was saved at  " file://g:masmProject_sampleDebugBuildLog.htm "
1 > Project -  0  error ( s ),   0  warning ( s )
==========  Build:  1  succeeded ,   0  failed ,   0  up-to- date ,   0  skipped  ==========



    如果你没有看到上述提示信息,这说明你的项目在上次构建以后可能没有修改过。没问题——只要在文档的任何空白出随意加一个空格,保存后重新构建即可。

运行程序

    从Debug菜单中选择Start without Debugging项。就会出现如下所示的命令行窗口:



    “Press any key to continue...”提示信息是由Visual C++ Express自动生成的。

    恭喜你,你已经成功地运行了你的第一个汇编语言程序了!

    按任意键关闭这个命令行窗口。

    当你汇编和链接这个项目时,一个名为Project.exe在项目目录中的/Debug子目录中被创建。这是运行程序时用的可执行文件。你可以在资源管理器中通过双击这个文件运行你的程序,但是它只在屏幕上闪一下就消失了,这是因为资源管理器并没有在关闭命令行窗口之前暂停这个程序。

创建一个你自己的新项目

    不久以后,你将想要创建自己的项目了。最简单的方法就是复制整个c:/Irvine/Examples/Project_Sample目录到一个新的路径下,你对这个路径应该拥有读/写权限。

步骤5:在调试模式下运行例子程序

    在这一步中,我们将在例子程序中设置断点。然后你就可以使用Visual C++调试器跟踪这个程序,逐条语句的执行例子程序了。

  1. 按F10键,开始进入你的程序的跟踪模式;
  2. 一个黄色的箭头将会出现在你程序的第一条语句出(call Clrscr)。这个箭头指示出下一条应该执行的语句;
  3. 按F10键(称为逐过程)执行当前语句。继续按F10键直到将要执行exit语句;
  4. 一个小的黑色Windows图标应该出现在你的Windows状态栏上。打开它查看这个命令行窗口,你将会在窗口中看到“MASM program example”信息;
  5. 在按一次F10键退出程序。



寄存器

    如果你想显示CPU寄存器,那么请完成下列步骤:开始调试程序,在Debug菜单中选择Windows项。在下拉菜单中选择Registers项。则在窗口的底部将会显示出寄存器的内容。在该子窗口中右键单击,选中Flags项,该窗口中就会显示出条件标志的内容。

    从Debug菜单中选择Stop Debugging项,你可以在任何时候终止调试会话过程。点击工具栏上的蓝色方块按钮也可以完成同样的工作。要取消一个断点,只要点击左侧的红点,让它消失即可。

设置断点

    如果你设置了一个断点,在到达断点之前,调试器将按正常速度运行程序。当到达断点时,调试器进入单步模式。

  1. 沿着WriteString语句的左侧边界点击鼠标,一个较大的红点将会出现该语句左侧的页边空白出;
  2. 从Debug菜单中选择Debugging项。程序将会运行,并停止在设置断点的那一行上,显示与前面所述相同的黄色箭头;
  3. 按F10键直到程序终止。

    要移除断点,只需用鼠标点击欲消除断点处的红色圆点即可。使用几分钟感受一下Debug菜单中的命令,多设置一些断点,再重新执行程序。从现在开始,你可以使用F11键(逐语句)的跟踪程序的运行,就像使用F10键一样。

构建并运行其他的程序

    假如你想运行其他的示例程序,或者可能要创建自己的程序。你可以编辑和修改main.asm,或者将main.asm从项目中删除,再插入其他的.asm文件到项目中来。

  • 要从项目中删除一个文件但并不是从磁盘上物理删除,只要在Solution Explorer窗口中右键单击该文件,在弹出的上下文菜单中,选择Exclude from Project项即可。如果你以后改变主意,又要将这个文件添加到项目中来,可以在Solution Explorer窗口中单击右键,选择Add项,选择Existing item项,再选择你欲添加到项目中的文件即可。
  • 要从项目中删除一个文件,同时从磁盘上物理删除,使用鼠标选中该文件,然后按Del键。或者右键单击该文件名,选择Remove项删除。


添加一个文件到项目中

    将汇编源文件添加到项目中来最简单的方法就是,在资源管理器中用鼠标拖拉文件名到Solution Explorer窗口中你指定的项目中。一个文件的引用(不是副本)将会添加到你的项目目录中来。现在就可以试试:

  1. 从你的项目中删除main.asm文件;
  2. 添加文件c:/Irvine/Examples/ch03/AddSub.asm的引用到项目中来;
  3. 构建并运行程序。


    下面是你将会看到的命令行窗口,可惜的是,除了EAX寄存器中值与我们的可能相同外,你自己运行的程序中其他寄存器的值都可能和下图不同:



    当你按下任意键,该命令行窗口将会关闭。

复制一份源文件

    如果你项创建一份已存在文件的副本,使用资源管理器复制这个文件到项目所在的目录中。然后,在Solution Explorer窗口中单击右键,选择Add,选择Existing item项,再选择你欲添加的文件即可。

返回顶部



2. 创建16位的应用程序

    只有在书中的12章到16章才需要创建16位的应用程序。除非书中特别指出,你的16位应用程序将运行在Windows XP和Windows Vista系统之上。

    如果你计划构建16位应用程序,那么你需要在Visual C++ Express(或Visual Studio)的Tools菜单中增加两个新的命令。要增加命令,需要在Tools菜单中选择External Tools项。将会弹出下面的对话框,尽管对话框左侧列表中有许多选项,但我们现在只需完成如下操作:


 
步骤1:创建Build 16-bit ASM命令

    点击Add按钮,并参照下面的截图填写Title、Command、Arguments,和Initial directory域。如果你点击Arguments或Initial directory域右侧的箭头按钮,会弹出一个便捷列表,你可以直接从中选择你需要的项,而不用再担心拼写出错的问题了:



    点击Apply按钮保存命令。

步骤2:创建Run 16-bit ASM命令

    点击Add按钮,创建一个新的Run 16-bit ASM命令:



    点击OK按钮保存命令并关闭External Tools对话框。

测试你的新创建的16位汇编命令

    从下载的书中示例程序的ch03目录中,打开名为16-bit.asm的文件,测试你的16位命令。从Tools菜单中选择Build 16-bit ASM项,会出现类似下图的命令行窗口,显示成功地调用了汇编器和连接器,紧接着的是与此程序相关的所有文件的列表:



    按任意键关闭这个窗口。接下来,你将要运行这个这个程序。从Tools菜单中选择Run 16-bit ASM项,会出现类似下图的命令行窗口,除了EAX寄存器以外,其他寄存器的值可能都与下图不同:



    按任意键关闭这个窗口。

    现在,你已经完成了构建和运行16位汇编语言程序的设置工作。

返回顶部



3. 项目属性的设置

    掌握了上述内容后,你可能仍然觉得意犹未尽。为了以后更好地运用Visual C++工具进行汇编语言编程,你可能还想更多地了解一些关于如何设置Visual C++项目属性方面的信息。在这一节我们将指导你如何设置项目属性的一些关键信息。

    假设我们的例子程序还是打开着的,从Project菜单中选择Project Properties项。展开Configuration Properties项的所有子项,在展开Microsoft Macro Assembler 8.0项。如下图所示:



    单击Microsoft Macro Assembler 8.0项下的General子项。注意此时Include Paths选项的值设置为c:/Irvine。这是告诉汇编器到哪里去找后缀名为.inc的文件。如下图所示:



    在Configuration Properties项下找到Linker子项。选择Input子项,注意到此时有两个文件名添加到Additional Dependencies选择中。其中user32.lib是标准的MS Windows文件;irvine32.lib是支持书中示例的链接库。两个文件名中间至少要有一个空格分隔:



    接下来,在Configuration Properties项下找到Linker子项,选择General子项。Additional Library Directories选项被设置为c:/Irvine,这样链接器就知道Irvine32.lib文件的位置了:



    在Configuration Properties项下找到Linker子项,选择Debugging子项。注意此时Generate Debug Info选项被设置为Yes:



    在Linker项下找到System子项。注意此时SubSystem选项被设置为Console:



    我们使用Console设置,是因为这样会使汇编语言程序向命令行窗口输出信息更加容易。命令行窗口是在Windows系统Start->Run菜单下运行cmd.exe命令后显示出的窗口。

    点击OK按钮关闭项目属性对话框窗口。

返回顶部



4. 从头开始创建一个项目

    你完全没有必要自己从头创建一个完全属于自己的项目。坦白地说,这其中还有许多工作要做。我们已经在每一个书中示例程序的文件夹中,放置了一份Project_sample项目的拷贝。你只要简单地将程序文件添加到这些项目中即可。但是,我们仍将在此介绍如何构建一个属于你自己的项目:

 

    你可以为你的项目任意命名。在下面的示例中,我们假定你的项目将被命名为MyProject,同时你将把项目保存在c:/temp目录中。根据你所使用的软件,这里介绍的命令可能与你具体使用的有些许区别:

 

Visual C++ Express

 

  1. File菜单中选择New项,在选择Project
  2. New Project窗口中,选择Genernal,再选中Empty Project作为项目的类型:

 

 

 

    你可能习惯于不选中Create directory for solution选项。

 

  1. 点击OK按钮,建立一个空白项目。

 


返回顶部



5. 生成一个源代码列表文件
 

 

    在本书200676日以前提供的下载文件中,Visual Express示例项目并生成源代码列表文件。在此,我们将演示如何修改一个独立项目的属性,使之能够产生源代码列表文件。

 

     打开项目。在Project菜单中,选择Project Properties项。在左侧的列表框中选中Microsoft Macro Assembler项,然后再选择List File子项。将Assembled Code Listing file选项设为$(InputName).lst


返回顶部



6. 使用 Visual Studio 2005 进行调试

(待续)

返回顶部



7. MASM语法的高亮显示
 

    当一款文本编辑器使用语言高亮时,语言中关键词,字符串,和其他一些元素将会分别以不同的颜色显示出来。Visual StudioVisual C++ Express可以高亮显示MASM的保留字和字符串,如下图所示:

 

 

    但是这种高亮显示不会自动完成,你可以创建一个包含MASM关键字的语法定义文件,Usertype.dat。以后一旦启动Visual Studio(或Visual C++ Express),将会自动读取该语法文件高亮显示MASM关键字。

 

    在此列出使Visual StudioVisual C++ Express高亮显示MASM语法的设置步骤:

    1) 下载Usertype.dat文件到一个你拥有读/写权限的文件夹中。如果你使用的是Windows Vista,下载该文件到我的文档,或C:/temp,或其它任何没有安全限制的文件夹中。

    2) Usertype.dat文件复制到C:/Program Files/Microsoft Visual Studio 8/Common7/IDE文件夹。如果你使用的是Windows Vista,它将在复制之前显示出一个认证窗口。

    3) 打开Visual StudioVisual C++ Express,选择Options菜单项,选择Text Editor子项,再选择File Extension子项。在对话框的右边(如下图所示),在Extension栏中输入asmEditor下拉列表框中选中Microsoft Visual C++,单击Add按钮。点击OK按钮保存你的设置。

 

 

     关闭Visual Studio并重新启动。打开项目并显示ASM文件。你将会在编辑器中看到语法高亮显示。


返回顶部

 


 


8. 用批处理文件进行汇编、链接和调试

 

很多程序员喜欢使用批处理文件进行汇编和链接。一个批处理文件是包含了一个命令序列的文本文件,执行起来就像是在命令行窗口输入了相应命令一样。实际上,批处理文件非常强大,它可以包含变量,循环,IF语句等等。

 

执行批处理文件最简单的方法就是在一个打开的命令行窗口中,输入该批处理文件的文件名(可以携带参数)。要打开一个命令行窗口,你必须使用一个名为cmd.exe的程序。在此我们将这个过程简化处理,以方便你的使用:

 

右键单击这里下子包含写列文件的zip文件:

  • cmd.exe的快捷方式, 它将在当前目录打开一个命令行窗口
  • asm32.bat一个用于完成对程序进行汇编和链接的批处理文件
  • main.asm一个汇编语言的示例程序

 

ZIP文件解压缩到c:/Irvine/Examples目录。然后完成如下操作:

  • 复制asm32.bat文件到任何系统路径包含的目录下。如果你安装的时Windows XP,你可以复制到c:/Windows文件夹中。(如果你使用的是Windows 2000,可以复制到c:/winnt文件夹中)。将asm32.bat复制到你的系统路径中,你可以保证在任何时候,当你在命令行窗口中输入asm32时,都保证这是一条合法的命令。
  • 双击cmd.exe的快捷方式。将弹出一个命令行窗口。
  • 在这个弹出的命令窗口中,执行asm32批处理文件,并显示它的帮助信息。输入:

           

              asm32  main.asm的源文件:

[Java]  view plain copy
  1. This file assembles, links, and debugs a single assembly language  
  2. source file. Before using it, install Visual Studio 2005 in the following  
  3. directory:   
  4.   
  5.     C:/Program Files/Microsoft Visual Studio 8  
  6.   
  7.   
  8. Next, install the Irvine 5th edition link libraires and include  
  9. files in the following directory: C:/Irvine  
  10.   
  11.   
  12. Finally, copy this batch file to a location on your system path.  
  13. We recommend the following directory:   
  14.   
  15.   
  16. C:/Program Files/Microsoft Visual Studio 8/VC/bin  
  17.   
  18.   
  19. Command-line syntax:  
  20.   
  21.   asm32 [/H | /h | -H | -h] -- display this help information  
  22.   
  23.   asm32 filelist -- assemble and link all files  
  24.   asm32 /D filelist -- assemble, link, and debug  
  25.   asm32 /C filelist -- assemble only  
  26.   
  27.  is a list of up to 5 filenames (without extensions),  
  28. separated by spaces. The filenames are assumed to refer to files  
  29. having .asm extensions. Command-line switches are case-sensitive.  

 

输入如下命令将会汇编和链接一个名为

    asm32 main

 

你应该会看到如下的提示信息:     事实上,上述命令会生成如下几个文件。

[Csharp]  view plain copy
  1.  Assembling: main.asm  
  2. The file main.obj was produced.  
  3. ..................................  
  4. Linking main.obj to the Irvine32, Kernel32, and User32 libraries.  
  5. The file main.exe was produced.  
  6. ..................................  

 

  • main.obj -  对象文件
  • main.ilk -  增量链接状态文件
  • main.pdb -  调试符号文件

    如果程序中有错误,你将会看到汇编器给出的错误提示信息。例如:

 

 Assembling: main.asm

main.asm(9) : error A2008: syntax error : myMessage

main.asm(15) : error A2006: undefined symbol : myMessage

 

    你可以使用文本编辑器打开main.asm文件,修正错误,然后重新使用asm32批处理文件汇编、链接。

 

    尽管本例中使用文件名为main.asm,但是asm32批处理文件工作于任何汇编语言源文件,而与文件名无关。唯一的需求就是汇编语言源文件要以.asm为后缀。

 

汇编其它目录中的程序

 

    毋庸置疑,你肯定希望能够在任何不同的文件夹中进行汇编程序,而不仅仅是局限于前述示例中提到的batch_sample文件夹。为了实现这个目标,你所需要做的只是将cmd.exe快捷方式复制到你的汇编语言源文件所在的工作目录中。当你双击这个快捷方式,将会产生一个当前目录下的命令行窗口。

 

汇编、链接、和调试

 

    除了进行汇编和链接,你还可以使用asm32.bat文件将你的程序在Visual Studio调试器中打开。使用如下的命令:

    asm32 /D main

 

如果程序汇编、链接过程中没有错误,你的程序将会在Visual Studio中被加载。当你第一次使用这种方式时,将不会加载源文件。此时,你需要做的就是按F10键开始调试,你的源程序将被加载,以黄色背景高亮显示第一条可执行语句:

 

 

(根据Visual Studio的不同设置,你可能需要按F8键来完成上述工作。)

    从这条语句开始,你就可以步进跟踪你的程序了。当你到达调用WriteString函数的行时,按F11键,你将可以跟踪进入到WriteString函数中。调试完成后,关闭Visual Studio即可。

 

    在以后使用这种方式在Visual Studio调试器中加载相同的程序时,你的源程序将会被正确的显示出来。

 

汇编而不链接

 

    在某些情况下,你可能需要仅仅汇编程序,而不想链接它们。比如,当你想创建一个多模块项目,在链接成最终的exe文件前,需要将每个asm文件分别汇编成obj文件时;或者,你汇编一个模块,想最终将它插入到一个链接库中去(比如,Irvine32.lib)。

 

    如果是仅仅汇编源文件,则使用/C参数:

    asm32 /C main

 

    你应该看到如下的输出信息:

 

 Assembling: main.asm

The file main.obj was produced.
..................................

 

    如果你希望了解更多关于批处理文件方面的信息,你可以参考下列链接提供的资源:

 

以上链接可能很快就会过期,不过你可以通过google搜索Windows batch files,将会得到大量有用的链接。



返回顶部
 

Visual Studio

 

  1. File菜单中,选择New Project项。
  2. New Project对话框(如下图所示)中,选择Other Languages项,选择Visual C++子项,再选择Gerneral子项,最后在右边的列表中选中Empty Project项。
  3. 给项目命名,并选择存放目录。不要修改其他任何选项。
  4. 点击OK按钮。

 

   

 

    你可能习惯于不选中Create directory for solution选项。

 

 

Visual StudioVisual C++ Express都需设置的选项

 

    1. 使用Windows资源管理器,或点击我的电脑,从/examples/Project_sample目录中,拷贝main.asm文件到你必须创建的项目目录(在本例中,该目录为MyProject)中。

    2. 返回到Visual StudioVisual C++ Express, 在解决方案管理器窗口中右键单击项目名称。选择Add,再选择Existing Item,最终选择main.asm文件。(这个你可能开始时看不到,需要在文件名输入框中输入*.asm)。单击Add按钮将该文件添加到项目中。

    3. 从Project菜单中选择Custom Build Rules项。你将会在一个列表中看到一系列规则文件,它们根据你所使用的软件有不同的用法。选择Microsoft Macro Assembler行最左边的的选择框:

 

   

 

    点击OK按钮,关闭该窗口。

 

    4. 接下来,你定制一些属性。我们假定你将本书示例安装在c:/Irvine目录。按照在项目属性设置一节所述,设置相应的定制属性。如果你并不是将本书示例安装在c:/Irvine目录中,那么你还需要适当地修改你的项目属性。

    5. 选择Build Solution菜单项。如果在你的输出窗口中显示出与下图类似的信息,那说明你正确地设置了所有的定制属性:

 

1>------ Build started: Project: MyProject, Configuration: Debug Win32
1>Linking...
1>Embedding manifest...
1>Build log was saved at "file://c:/temp/MyProject/Debug/BuildLog.htm"
1>MyProject - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值