【汇编语言05】第4章 第一个程序

2023-11-07

0 前言

  1. 知识回顾:前面几章我们学习了CPU中的寄存器及其工作原理、代码段数据段和栈段的含义及其原理、常见的一些汇编指令,此外也用debug程序进行了简单的实验。
  2. 现在我们将开始编写完整的汇编语言程序,用编译器将它们编译成为可执行文件(如:*.exe文件),在操作系统中运行。

1 源程序从编写到执行

1.1 第1步:编写汇编源程序

  1. 使用文本编辑器(如记事本、Nodepad++、UltraEdit等),用汇编语言编写汇编源程序。
  2. 结果:产生了一个存储源程序的文本文件。

1.2 第2步:对源程序进行编译连接

  1. 过程:
    1. 使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件;
    2. 再用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。
  2. 可执行文件中包含两部分内容:
    1. 程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
    2. 相关的描述信息(比如:程序有多大、要占多少内存空间等)

1.3 第3步:执行可执行文件中的程序

操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。

2 简单源程序示例及其组成

2.1 简单源程序示例

assume cs:codesg		#在该程序中,codesg segment……codesg ends定义了一个名为codesg的段,在这个段中存放代码,是个代码段。
codesg segment
start:	mov ax,0123H
		mov bx,0456H
		add ax,bx
		add ax,bx
		mov ax,4c00H
		int 21H
codesg ends
end

2.2 伪指令

  1. 汇编指令与伪指令:
    (1)汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
    (2)伪指令:没有对应的机器码的指令,最终不被CPU所执行。
    (3)谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
  2. segment和ends
    (1)segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
    (2)segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。
    (3)一个段必须有一个名称来标识,使用格式为:
    段名 segment
    段名 ends
  3. end
    (1)end 是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。
    如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。
    (2)切记:不要搞混了end和ends。
  4. assume
    (1)含义:“假设”。它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。
    (2)作用:通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。

2.3 源程序与程序

我们可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据 ,称为程序。

2.4 标号

  1. 一个标号指代了一个地址。
  2. 例如codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。

2.5 程序返回

  1. 定义:一个程序结束后,将CPU的控制权交还给使它得以运行的程序。
  2. 程序返回的理解:DOS是一个单任务操作系统。
    (1)一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。
    (2)而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。
  3. 程序返回的实现:应该在程序的末尾添加返回的程序段。
mov ax,4c00H
int 21H
  1. 与程序结束相关的指令
目的 相关指令 指令性质 指令执行者
通知编译器一个段结束 段名 ends 伪指令 编译时,由编译器执行
通知编译器程序结束 end 伪指令 编译时,由编译器执行
程序返回 mov ax,4c00H int 21H 汇编指令 执行时,由CPU执行

2.6 错误类型

  1. 主要包含语法错误和逻辑错误两种。
  2. 语法错误:在编译时,出现编译器无法理解的关键字或语句,容易发现。
  3. 逻辑错误:在运行时发生的错误,难以发现。

3 上机实验

3.1 编辑源程序

  1. 虚拟机中安装DOSBox,参考《汇编语言03】第2章 寄存器
  2. 在本机打开txt文件编辑以下代码,并重命名为“1.asm”。
assume cs:codesg
codesg segment
start:	mov ax,0123H
		mov bx,0456H
		add ax,bx
		add ax,bx
		mov ax,4c00H
		int 21H
codesg ends
end
  1. 在DOSBox文件夹中新建一个文件夹,命名为“1”,将该文件复制黏贴到该文件夹下,如下图。
    在这里插入图片描述

  2. 启动DOSBox程序,并输入命令mount c d:\DOSBox挂载所需程序,其中d:\DOSBox是文件夹存放的路径,c是挂载到虚拟盘符为c,如下图所示表示挂载成功,输入命令c:切换至虚拟符c。
    在这里插入图片描述

  3. 输入命令dir可以看到当前路径下的文件,可以看到挂载下的各个文件夹。
    在这里插入图片描述

3.2 编译

3.2.1 概述

在编译过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.lst)和交叉引用文件(.crf)。这3个输出文件中,目标文件是我们最终要得到的结果,另外两个只是中间结果,可以让编译器不生成,在本课程中不讨论这两类文件的作用。

3.2.2 编译操作

  1. 先启动masm程序,如果在该程序当前所在目录,则输入命令masm启动程序,如果不在该程序所在目录,则需要输入路径。
    在这里插入图片描述
  2. 运行masm后,首先显示的实一些版本信息,然后提示输入将要被编译的源程序文件的名称,如上图。
    (1)[,ASM]提示我们,默认的文件扩展名是asm,如果要输入其他后缀的文件,则需要完整输入文件名和后缀,如“1.txt”。
    (2)要知名文件所在的路径,如果是在当前路径下,只需要输入文件名即可,如果在其他目录,则需要输入路径。
    (3)在本程序中,要编译的文件不在masm当前目录,使用命令c:\1\1指定要编译的文件路径,后缀名asm可以省略。
    在这里插入图片描述
  3. 在上面步骤后,程序继续提示我们输入要编译出的目标文件名,目标文件是我们对一个源程序进行编译要得到的最终结果。
    (1)屏幕提示[1.OBJ],是因为我们输入的源程序文件名为1.asm,则编译程序默认要输出的文件名为1.obj,直接按enter生成该文件。
    (2)如果要在指定目录下生成指定文件,则可以输入“路径+文件名”的格式。
    在这里插入图片描述
  4. 在上图中,编译程序提示输入列表文件的名称,这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果,可以让编译器不生成该文件,直接按enter即可。
    在这里插入图片描述
  5. 编程程序提示输入交叉引用文件的名称,这个文件同列表文件一样,是中间结果,直接按enter不生成。
    在这里插入图片描述
  6. 可以看到编译过程没有出错。在当前文件夹下找到生成的1.obj文件。如果要让该文件在源程序所在文件夹中生成,则在生成该文件的步骤需要输入“路径+文件名”来指定。
    在这里插入图片描述

3.2.3 简易的编译操作

像上面操作过程,如果我们无需生成各个中间文件,则可以使用简易的编译操作,直接输入命令 masm 路径+文件名;,在后面以分好结束,按enter,编译器就会对源程序文件进行编译,在当前路径下生成目标文件,并在编译过程中自动忽略中间文件的生成。

3.3 连接

3.3.1 概述

  1. 连接:从目标文件(.obj)→可执行文件(.exe)的过程。
  2. 连接的作用有以下几个:
    (1)当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
    (2)程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
    (3)一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。

3.3.2 连接操作

  1. 启动link程序。LINK.EXE在当前目录下,直接输入命令link.exe启动该程序。
    在这里插入图片描述
  2. 提示输入要被连接的目标文件名。因为编译生成的文件就在当前目录下,因此此处输入1即可指定该文件。如果是在其他文件夹,则需要补充路径信息,如果是其他后缀,则需要补充后缀信息,如“1.bin”。
    在这里插入图片描述
  3. 程序提示输入要生成的可执行文件名,默认与obj文件同名,直接输入enter使用默认文件名。如果要指定在其他文件夹下生成,则需要补充路径信息。
    在这里插入图片描述
  4. 提示输入映像文件名,这个中间结果,可以不生成,直接按enter。
    在这里插入图片描述
  5. 程序提示指定库文件名,库文件里面包含了一些可以调用的子程序,如果程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和目标文件连接到一起,生成可执行文件。在这个示例文件中,没有调用任何子程序,忽略库文件名的输入,直接按enter。
    在这里插入图片描述
  6. 可以看到成功生成可执行文件。
    在这里插入图片描述

3.3.3 简易的连接操作

像上面操作过程,如果我们无需生成各个中间文件,则可以使用简易的连接操作,直接输入命令 link 路径+文件名;,在后面以分好结束,按enter,连接程序就会对目标文件进行处理,在当前路径下生成可执行文件,并在过程中自动忽略中间文件的生成。

3.4 程序的执行与跟踪

3.4.1 操作系统的外壳

  1. 操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。
  2. DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。
  3. DOS启动时,先完成其他重要的初始化工作,然后运行command.com,运行后,执行完其他的相关任务后,在屏幕上显示出由当前盘符和当前路径组成的提示符,比如:“c:\”等,然后等待用户输入。
  4. 用户可以输入所需要执行的命令,如cd、dir、type等,这些命令由command执行,command执行完这些命令后,再次显示由当前盘符和当前路径组成的提示符,等待用户输入。
  5. 如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件的程序载入内存,设置SS:SP指向程序的入口。此后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户输入。

3.4.2 执行

双击所生成的可执行程序,在win7 64位系统上运行出现问题,设置了兼容性依然不行,将可执行程序复制到winXP中,可执行,打开后瞬间消失。

3.4.3 跟踪

  1. 为观察程序的运行过程,可以使用debug程序。debug可以将程序加载入内存,设置CS:IP指向程序的入口,但debug并不放弃对CPU的控制,这样,我们就可以使用debug的相关命令来单步执行程序,查看每一条指令的执行结果。
  2. 在本实验中,目前debug程序和可执行程序均位于当前目录下,可以使用命令dubug 1.exe,如果不是在当前目录下,则需要补充路径信息。
    在这里插入图片描述
  3. 使用R命令来查看各个寄存器的设置情况。debug将程序从可执行文件加载入内存后,cx中存放的实程序的长度,“000F”表示该程序共有15个字节,结合前面章节内容,理解各个寄存器的含义。
    在这里插入图片描述
  4. 从上图可以看出,CP:IP指向第一个指令,地址为076A:0000,指令为mov ax,0123,使用debug命令U查看其他命令。
    在这里插入图片描述
  5. 使用debug命令T单步执行每一个命令,观察各寄存器变化。
    在这里插入图片描述
  6. 到了INT 21指令,需要使用debug命令P来执行,表示终止程序。
    在这里插入图片描述
  7. 使用debug命令Q,退出debug,返回到command。
    在这里插入图片描述

4 小结

  1. 学习汇编的目的,是通过用汇编语言进行编程而深度地理解计算机基层的基本工作机理,达到可以随心所欲地控制计算机的目的。
  2. 我们的编程活动,大都是直接对硬件进行的,我们系统直接对硬件进行编程,却又不希望用机器码编程,我们用汇编语言编程,就要用到编辑器(edit)、编译器(masm)、连接器(link)、调试工具(debug)等所有工具,这些攻击都是在操作系统之上运行的程序。

参考文献

  1. 《汇编语言(第3版) 》王爽著,主要参考书籍和学习路线。
    百度云:https://pan.baidu.com/s/1TE1Egc0ZmeJfLP5zvamo0Q
    提取码:3y72
  2. 第一个程序01》小甲鱼零基础视频课程
  3. 第一个程序02》小甲鱼零基础视频课程
  4. 第一个程序03》小甲鱼零基础视频课程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【汇编语言05】第4章 第一个程序 的相关文章

  • iOS - 如何实现像默认相册一样裁剪图像?

    iPhone相册默认裁剪功能 有谁知道如何实现这一点 我想先剪掉它Use按钮被点击 尝试以下其中一项 您可能会找到一个完全可以做到这一点的开源软件
  • masm除法溢出

    我正在尝试在汇编中除两个数字 我正在用英特尔计算机书的尔湾大会工作 我无法让部门为我的一生工作 这是我的代码 code main PROC call division exit main ENDP division PROC mov eax
  • 指令操作数必须具有相同大小错误

    我已经在数据段中定义了数组 例如 myArray byte 01 03 02 05在代码中我有一行mov eax BYTE PTR myArray ecx 汇编器在这里抛出构建错误指令操作数必须具有相同的大小这可能是什么原因 我该如何解决
  • 自定义编辑控件win32

    我终于成功地使用 richedit 和 iczelion 的教程完成了语法突出显示 现在我找到了 它肯定还不够快 我正在考虑向前迈出一步 自定义编辑控件 但我不知道该怎么做 你们能告诉我该怎么做吗 给我一些信息来开始吗 甚至可能是一些教程或
  • 如何从txt文件中删除特定行及其后面的n行?

    我正在创建一个程序来更新文本文件 其中包含城市列表 New York City New York USA Newark New Jersey USA Toronto Ontario Canada 如果我想使用 bash 脚本删除 Newar
  • MASM 汇编中的“功能级链接”(即 COMDAT 生成)?

    有没有办法让 MASM 为函数生成 COMDAT 以便链接器删除未使用的函数 即我正在寻找相当于 Gy对于 MASM 并不简单 但可行 讨论过here http www asmcommunity net forums topic id 99
  • 如何破解已安装的 perl6 模块源?

    我希望能够查看并更改已安装的源代码 通过zef perl6 模块 我怎样才能做到这一点 在我的系统上 模块源位于 perl6 sources 还有一些关于模块的元数据文件 perl6 dist 我也可以使用zef locate 显示模块的源
  • 制作频率表

    我应该创建一个包含 256 个 DWORD 的频率表 并使用 ASCII 代码作为索引来计算字符串中字符出现的次数 我陷入了如何使用存储的 ASCII 值作为索引并增加该索引的困境 这是我到目前为止所拥有的 TITLE String Fin
  • 使用 jq 附加 JSON 对象

    我在下面JSON结构 a aVal x x1 x1Val x2 x2Val y y1 y1Val 我想添加 x3 x3Val x4 x4Val to x 所以输出应该是 x x3 x3Val x4 x4Val 是否可以使用jq https
  • 如何编辑dll档案?

    好吧 所以我对 DLL 不太了解 但我需要编辑其中一些 那些看起来像存档文件的文件 如 firefox的xul dll windows twain 32 dll 当我尝试在 NET Reflector 中打开它们时 它无法打开它们 这里的一
  • 从寄存器中减去变量?错误A2022:指令操作数必须相同大小

    data num1 word 0FEEDh code main PROC mov ecx 0E4C7FFFDh ecx 0E4C7FFFD hex sub ecx num1 error on this line 我希望能够减去变量num1从
  • Qt Mac(删除编辑菜单中的“特殊字符...”操作

    我正在 Qt 中开发一个应用程序 它经常重建其菜单 然而 当我们调用clear 并在菜单中重新添加我们想要的操作时 特殊字符 似乎保留在菜单中 有什么方法可以删除或将此操作移动到 QMenu 的底部吗 这是重建菜单的代码 void Main
  • Symfony2 简单文件上传编辑,无实体

    请帮助我 因为我不敢相信自己的眼睛 我拒绝使用某些第三方插件进行文件上传 并拒绝为文件 文档创建单独的实体 我只想在 Zend Laravel 等中进行简单的文件上传 我有一个发票表 最后一列名称为 附件 我想在此处存储其清理后的名称 例如
  • 如何在MASM中为一个项目编写和组合多个源文件?

    对于组装来说还是个新手 玩起来很有趣 我想将程序的功能拆分到多个文件中 特别是通过将类似的功能分组在一起进行组织 这些其他文件将由主文件 甚至希望其他非主文件 调用 我还没有成功 希望得到帮助 我不使用 IDE 更喜欢使用 notepad
  • 我无法在我的 Visual C Express Edition 2008 中汇编电影 (MMX) 指令

    当我尝试编译时movd指令显示错误为 error A2085 instruction or register not accepted in current CPU mode 我的代码如下 386 model flat c code add
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov ebx
  • 如何替换 randomForest r 包中的引导步骤

    首先是一些背景信息 这在 stats stackexchange 上可能更有趣 在我的数据分析中 我尝试比较不同机器学习方法在时间序列数据上的性能 回归 而不是分类 例如 我训练了一个 Boosting 训练模型 并将其与随机森林训练模型
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • DS 的大型机命令 - 在 ISPF Edit 中移动列

    如何将PS文件中间的数据移动到Mainframe的左侧 有什么快捷命令吗 我有一个数据集 其中的数据位于第 13 列 必须将其移动到第 11 列 任何快捷键都可以移动它 想要将 DS 中的其余行对齐为第一行 BROWSE OSMDEV IT

随机推荐

  • 【软考】-高项-质量管理-子过程ITTO记忆技巧

    质量管理 贵管控 规划质量管理 1 记忆口诀 需求 干系 风险记住清 组织质量体系 策略盈 标杆成本质量流 思维测试 计划留 质量测量指标出 管理计划 记心头 2 故事 在一个叫做 需求城 的地方 有三个重要的公民 需求文件先生 干系人登记
  • Markdown中图片对齐方式及尺寸设置

    在markdown编辑模式下导入图片默认尺寸会很大 不符合预期效果 有时候需要对图片的对齐方式和尺寸大小进行调整 1 直接上传图片的原始效果 添加图片后默认尺寸很大 会占满整个宽度 2 图片尺寸及对齐方式调整 添加图片之后 图片底部 CSD
  • java对于Excel进行快速处理的框架EasyExcel(SpringBoot集成)

    一 EasyExcel介绍 EasyExcel是阿里巴巴开源的一个excel处理框架 以使用简单 节省内存著称 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中 而是从磁盘上一行行读取数
  • Anchor-Free based目标检测

    CornerNet 预测左上角和右下角来得到最后的bounding boxes 所以最基本的需要两个feature map表示对应的Corner 称为heatmap top left 和 bottom right 将属于同一个object的
  • C++中template(模版)的使用

    我们在编程的时候总是会遇到一些类似的模块 只是模块中的形参的数据类型不同 导致我们要不断的去更改模块的 这里就涉及到重载的知识点了 例如以下的几种情况 函数1 int max int x int y return x gt y x y 函数
  • 分布式监控系统——Zabbix(3)配置

    文章目录 分布式监控系统 Zabbix 3 配置 一 监控项 1 定义一个不带参数的监控项 2 定义一个带参数的监控项 3 删除监控项 4 监控项存储的值 二 触发器 1 简介 2 触发器表达式 3 定义一个触发器 4 触发器的依赖关系 5
  • 项目4总结:MySQL数据表的检索

    目录 任务4 1 查询时选择列 1 基本查询语句 2 检索所有列 3 检索指定列 任务4 2 查询时选择行 1 查询指定记录 2 带IN关键字的查询 3 带BETWEEN AND的范围查询 4 带LIKE的字符匹配查询 5 查询空值 6 带
  • truncate和delete的区别

    两者都可以删除表中的数据 但是本质上是有区别的 两者使用方法如下 删除表中所有数据 DELETE FROM table name 删除表中部分符合条件的数据 DELETE FROM table name WHERE 删除表中所有数据 TRU
  • Google reCAPTCHA ----------验证码

    现有验证码的产品形态调研范围如下 基本涵盖了比较主流的验证码平台 Google reCAPTCHA 极验 阿里云 腾讯云 点触 网易易盾 螺丝帽 FunCaptcha 产品背景 reCAPTCHA起初是由CMU 卡耐基梅隆大学 设计 将OC
  • pip安装地址--清华源(国内常用镜像源)

    国内常用镜像源 清华大学 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科学技术大学 http pypi mirrors u
  • Linux服务器在线扩容内存,redhat linux 在线扩容磁盘空间

    在惠普Proliant服务器上在线扩容Linux ext3类型的文件系统 服务器集成SA5i 内置硬盘 加SA532挂MSA500 划了一个阵列 全部做一个逻辑盘 设备名为 dev cciss c1d0 全部空间建立分区为 dev ccis
  • 箭头函数和普通函数的区别

    箭头函数 1 只有一个参数的时候 参数可以不加小括号 没有参数或2个及以上参数的 必须加上小括号 2 返回语句只有一条的时候可以不写 和return 会自动加上return的 返回多条语句时必须加上 和return 3 箭头函数在返回对象的
  • Mysql添加新用户,并设置数据库权限

    首先进入mysql mysql u root p 然后在数据库中使用 create DATABASE my test db 创建数据库 CREATE USER test user IDENTIFIED BY test pass 创建一个用户
  • 5种很牛的两位数乘法速算方法

    5种很牛的两位数乘法速算方法 第一种 十几乘以任意两位数 公式推导 10 b 10c d 100c 10 bc d bd 10 10c bc d bd 10 10c d bc bd 方法 如果c 1 公式是 10 b 10 d 10 10
  • 16款ChatGPT工具,太炸裂了,收藏!

    因公众号更改推送规则 请点 在看 并加 星标 第一时间获取精彩技术分享 点击关注 互联网架构师公众号 领取架构师全套资料 都在这里 0 2T架构师学习资料干货分 上一篇 ChatGPT研究框架 80页PPT 附下载 大家好 我是互联网架构师
  • ug装配绕轴旋转_UG绘制小吊扇模型,建模装配还能运动起来

    夏天来了 吾思小编来教大家用UG做一个小风扇给夏日带来一丝凉意吧 根据图纸建模 整体建模难度 简单 装配难度 简单 模型效果图如下 一共由五个零件组成 建模过程 先画零件1底座 1 绘制一个直径为120mm的圆拉伸10mm 2 倒斜角5mm
  • Scanner读取文件(按行读入)

    public class ScannerTest public static void main String args 其实 Scanner在使用结束之后 也是需要进行关闭的 调用close方法 try Scanner scanner n
  • 使用注解从AOP面对方法进行逻辑判断

    今天360文8热8凉1汤 不好意思走错了 需求 根据不同的登录设备对xxController层中的方法是否禁用 AOP解释 切面编程 灵魂画图 代码 1 建立一个注解SuiteDisable import java lang annotat
  • Unity获取鼠标滚轮信息

    Unity获取鼠标滚轮信息 UGUI获取滚轮信息 Input获取滚轮信息 UGUI获取滚轮信息 UGUI关于鼠标滚轮信息的获取有一个专门的接口IScrollHandler用于接收滚轮事件 继承该事件之后便需要实现函数OnScroll 如下
  • 【汇编语言05】第4章 第一个程序

    目录 0 前言 1 源程序从编写到执行 1 1 第1步 编写汇编源程序 1 2 第2步 对源程序进行编译连接 1 3 第3步 执行可执行文件中的程序 2 简单源程序示例及其组成 2 1 简单源程序示例 2 2 伪指令 2 3 源程序与程序