网站到期域名怎么解决办法,网络推广与seo的区别在哪里,工地模板是什么材料做的,做网站难度目录 0 前言1 源程序从编写到执行1.1 第1步#xff1a;编写汇编源程序1.2 第2步#xff1a;对源程序进行编译连接1.3 第3步#xff1a;执行可执行文件中的程序 2 简单源程序示例及其组成2.1 简单源程序示例2.2 伪指令2.3 源程序与程序2.4 标号2.5 程序返回2.6 错误类型 3 上… 目录 0 前言1 源程序从编写到执行1.1 第1步编写汇编源程序1.2 第2步对源程序进行编译连接1.3 第3步执行可执行文件中的程序 2 简单源程序示例及其组成2.1 简单源程序示例2.2 伪指令2.3 源程序与程序2.4 标号2.5 程序返回2.6 错误类型 3 上机实验3.1 编辑源程序3.2 编译3.2.1 概述3.2.2 编译操作3.2.3 简易的编译操作 3.3 连接3.3.1 概述3.3.2 连接操作3.3.3 简易的连接操作 3.4 程序的执行与跟踪3.4.1 操作系统的外壳3.4.2 执行3.4.3 跟踪 4 小结参考文献 0 前言
知识回顾前面几章我们学习了CPU中的寄存器及其工作原理、代码段数据段和栈段的含义及其原理、常见的一些汇编指令此外也用debug程序进行了简单的实验。现在我们将开始编写完整的汇编语言程序用编译器将它们编译成为可执行文件如*.exe文件在操作系统中运行。
1 源程序从编写到执行
1.1 第1步编写汇编源程序
使用文本编辑器如记事本、Nodepad、UltraEdit等用汇编语言编写汇编源程序。结果产生了一个存储源程序的文本文件。
1.2 第2步对源程序进行编译连接
过程 使用汇编语言编译程序MASM.EXE对源程序文件中的源程序进行编译产生目标文件再用连接程序LINK.EXE对目标文件进行连接生成可在操作系统中直接运行的可执行文件。 可执行文件中包含两部分内容 程序从原程序中的汇编指令翻译过来的机器码和数据源程序中定义的数据相关的描述信息比如程序有多大、要占多少内存空间等
1.3 第3步执行可执行文件中的程序
操作系统依照可执行文件中的描述信息将可执行文件中的机器码和数据加载入内存并进行相关的初始化比如设置CS:IP指向第一条要执行的指令然后由CPU执行程序。
2 简单源程序示例及其组成
2.1 简单源程序示例
assume cs:codesg #在该程序中codesg segment……codesg ends定义了一个名为codesg的段在这个段中存放代码是个代码段。
codesg segment
start: mov ax,0123Hmov bx,0456Hadd ax,bxadd ax,bxmov ax,4c00Hint 21H
codesg ends
end2.2 伪指令
汇编指令与伪指令 1汇编指令有对应的机器码的指令可以被编译为机器指令最终为CPU所执行。 2伪指令没有对应的机器码的指令最终不被CPU所执行。 3谁来执行伪指令呢伪指令是由编译器来执行的指令编译器根据伪指令来进行相关的编译工作。segment和ends 1segment和ends是一对成对使用的伪指令这是在写可被编译器编译的汇编程序时必须要用到的一对伪指令。 2segment和ends的功能是定义一个段segment说明一个段开始ends 说明一个段结束。 3一个段必须有一个名称来标识使用格式为 段名 segment 段名 endsend 1end 是一个汇编程序的结束标记编译器在编译汇编程序的过程中如果碰到了伪指令 end就结束对源程序的编译。 如果程序写完了要在结尾处加上伪指令end 。否则编译器在编译程序时无法知道程序在何处结束。 2切记不要搞混了end和ends。assume 1含义“假设”。它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。 2作用通过assume说明这种关联在需要的情况下 编译程序可以将段寄存器和某一个具体的段相联系。
2.3 源程序与程序
我们可以将源程序文件中的所有内容称为源程序将源程序中最终由计算机执行处理的指令或数据 称为程序。
2.4 标号
一个标号指代了一个地址。例如codesg放在segment的前面作为一个段的名称这个段的名称最终将被编译、连接程序处理为一个段的段地址。
2.5 程序返回
定义一个程序结束后将CPU的控制权交还给使它得以运行的程序。程序返回的理解DOS是一个单任务操作系统。 1一个程序P2在可执行文件中则必须有一个正在运行的程序P1将P2从可执行文件中加载入内存后将CPU的控制权交给P2P2才能得以运行。P2开始运行后P1暂停运行。 2而当P2运行完毕后应该将CPU的控制权交还给使它得以运行的程序P1此后P1继续运行。程序返回的实现应该在程序的末尾添加返回的程序段。
mov ax,4c00H
int 21H与程序结束相关的指令
目的相关指令指令性质指令执行者通知编译器一个段结束段名 ends伪指令编译时由编译器执行通知编译器程序结束end伪指令编译时由编译器执行程序返回mov ax,4c00H int 21H汇编指令执行时由CPU执行
2.6 错误类型
主要包含语法错误和逻辑错误两种。语法错误在编译时出现编译器无法理解的关键字或语句容易发现。逻辑错误在运行时发生的错误难以发现。
3 上机实验
3.1 编辑源程序
虚拟机中安装DOSBox参考《汇编语言03】第2章 寄存器》在本机打开txt文件编辑以下代码并重命名为“1.asm”。
assume cs:codesg
codesg segment
start: mov ax,0123Hmov bx,0456Hadd ax,bxadd ax,bxmov ax,4c00Hint 21H
codesg ends
end在DOSBox文件夹中新建一个文件夹命名为“1”将该文件复制黏贴到该文件夹下如下图。 启动DOSBox程序并输入命令mount c d:\DOSBox挂载所需程序其中d:\DOSBox是文件夹存放的路径c是挂载到虚拟盘符为c如下图所示表示挂载成功输入命令c:切换至虚拟符c。 输入命令dir可以看到当前路径下的文件可以看到挂载下的各个文件夹。
3.2 编译
3.2.1 概述
在编译过程中我们提供了一个输入即源程序文件。最多可以得到3个输出目标文件(.obj)、列表文件(.lst)和交叉引用文件(.crf)。这3个输出文件中目标文件是我们最终要得到的结果另外两个只是中间结果可以让编译器不生成在本课程中不讨论这两类文件的作用。
3.2.2 编译操作
先启动masm程序如果在该程序当前所在目录则输入命令masm启动程序如果不在该程序所在目录则需要输入路径。 运行masm后首先显示的实一些版本信息然后提示输入将要被编译的源程序文件的名称如上图。 1[,ASM]提示我们默认的文件扩展名是asm如果要输入其他后缀的文件则需要完整输入文件名和后缀如“1.txt”。 2要知名文件所在的路径如果是在当前路径下只需要输入文件名即可如果在其他目录则需要输入路径。 3在本程序中要编译的文件不在masm当前目录使用命令c:\1\1指定要编译的文件路径后缀名asm可以省略。 在上面步骤后程序继续提示我们输入要编译出的目标文件名目标文件是我们对一个源程序进行编译要得到的最终结果。 1屏幕提示[1.OBJ]是因为我们输入的源程序文件名为1.asm则编译程序默认要输出的文件名为1.obj直接按enter生成该文件。 2如果要在指定目录下生成指定文件则可以输入“路径文件名”的格式。 在上图中编译程序提示输入列表文件的名称这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果可以让编译器不生成该文件直接按enter即可。 编程程序提示输入交叉引用文件的名称这个文件同列表文件一样是中间结果直接按enter不生成。 可以看到编译过程没有出错。在当前文件夹下找到生成的1.obj文件。如果要让该文件在源程序所在文件夹中生成则在生成该文件的步骤需要输入“路径文件名”来指定。
3.2.3 简易的编译操作
像上面操作过程如果我们无需生成各个中间文件则可以使用简易的编译操作直接输入命令 masm 路径文件名;在后面以分好结束按enter编译器就会对源程序文件进行编译在当前路径下生成目标文件并在编译过程中自动忽略中间文件的生成。
3.3 连接
3.3.1 概述
连接从目标文件(.obj)→可执行文件(.exe)的过程。连接的作用有以下几个 1当源程序很大时可以将它分为多个源程序文件来编译每个源程序编译成为目标文件后再用连接程序将它们连接到一起生成一个可执行文件 2程序中调用了某个库文件中的子程序需要将这个库文件和该程序生成的目标文件连接到一起生成一个可执行文件 3一个源程序编译后得到了存有机器码的目标文件目标文件中的有些内容还不能直接用来生成可执行文件连接程序将这此内容处理为最终的可执行信息。
3.3.2 连接操作
启动link程序。LINK.EXE在当前目录下直接输入命令link.exe启动该程序。 提示输入要被连接的目标文件名。因为编译生成的文件就在当前目录下因此此处输入1即可指定该文件。如果是在其他文件夹则需要补充路径信息如果是其他后缀则需要补充后缀信息如“1.bin”。 程序提示输入要生成的可执行文件名默认与obj文件同名直接输入enter使用默认文件名。如果要指定在其他文件夹下生成则需要补充路径信息。 提示输入映像文件名这个中间结果可以不生成直接按enter。 程序提示指定库文件名库文件里面包含了一些可以调用的子程序如果程序中调用了某一个库文件中的子程序就需要在连接的时候将这个库文件和目标文件连接到一起生成可执行文件。在这个示例文件中没有调用任何子程序忽略库文件名的输入直接按enter。 可以看到成功生成可执行文件。
3.3.3 简易的连接操作
像上面操作过程如果我们无需生成各个中间文件则可以使用简易的连接操作直接输入命令 link 路径文件名;在后面以分好结束按enter连接程序就会对目标文件进行处理在当前路径下生成可执行文件并在过程中自动忽略中间文件的生成。
3.4 程序的执行与跟踪
3.4.1 操作系统的外壳
操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 都要提供一个称为shell外壳的程序 用户操作人员使用这个程序来操作计算机系统工作。DOS中有一个程序command.com 这个程序在 DOS 中称为命令解释器也就是DOS系统的shell。DOS启动时先完成其他重要的初始化工作然后运行command.com运行后执行完其他的相关任务后在屏幕上显示出由当前盘符和当前路径组成的提示符比如“c:\”等然后等待用户输入。用户可以输入所需要执行的命令如cd、dir、type等这些命令由command执行command执行完这些命令后再次显示由当前盘符和当前路径组成的提示符等待用户输入。如果用户要执行一个程序则输入该程序的可执行文件的名称command首先根据文件名找到可执行文件然后将这个可执行文件的程序载入内存设置SS:SP指向程序的入口。此后command暂停运行CPU运行程序。程序运行结束后返回到command中command再次显示由当前盘符和当前路径组成的提示符等待用户输入。
3.4.2 执行
双击所生成的可执行程序在win7 64位系统上运行出现问题设置了兼容性依然不行将可执行程序复制到winXP中可执行打开后瞬间消失。
3.4.3 跟踪
为观察程序的运行过程可以使用debug程序。debug可以将程序加载入内存设置CS:IP指向程序的入口但debug并不放弃对CPU的控制这样我们就可以使用debug的相关命令来单步执行程序查看每一条指令的执行结果。在本实验中目前debug程序和可执行程序均位于当前目录下可以使用命令dubug 1.exe如果不是在当前目录下则需要补充路径信息。 使用R命令来查看各个寄存器的设置情况。debug将程序从可执行文件加载入内存后cx中存放的实程序的长度“000F”表示该程序共有15个字节结合前面章节内容理解各个寄存器的含义。 从上图可以看出CP:IP指向第一个指令地址为076A:0000指令为mov ax,0123使用debug命令U查看其他命令。 使用debug命令T单步执行每一个命令观察各寄存器变化。 到了INT 21指令需要使用debug命令P来执行表示终止程序。 使用debug命令Q退出debug返回到command。
4 小结
学习汇编的目的是通过用汇编语言进行编程而深度地理解计算机基层的基本工作机理达到可以随心所欲地控制计算机的目的。我们的编程活动大都是直接对硬件进行的我们系统直接对硬件进行编程却又不希望用机器码编程我们用汇编语言编程就要用到编辑器edit、编译器masm、连接器link、调试工具debug等所有工具这些攻击都是在操作系统之上运行的程序。
参考文献
《汇编语言(第3版) 》王爽著主要参考书籍和学习路线。 百度云https://pan.baidu.com/s/1TE1Egc0ZmeJfLP5zvamo0Q 提取码3y72《第一个程序01》小甲鱼零基础视频课程《第一个程序02》小甲鱼零基础视频课程《第一个程序03》小甲鱼零基础视频课程