济南企业网站建设哪家好,百度经验官网,杭州建筑设计公司排名,北京企业信用信息网官网《汇编语言》- 读书笔记 - 第4章-第一个程序 4.1 一个源程序从写出到执行的过程4.2 源程序程序 4.11. 伪指令1.1 segment ends 声明段1.2 end 结束标记1.3 assume 关联 2. 源程序中的“程序”3. 标号4. 程序的结构5. 程序返回6. 语法错误和逻辑错误 4.3 编辑源程序4.4 编译4.5 … 《汇编语言》- 读书笔记 - 第4章-第一个程序 4.1 一个源程序从写出到执行的过程4.2 源程序程序 4.11. 伪指令1.1 segment ends 声明段1.2 end 结束标记1.3 assume 关联 2. 源程序中的“程序”3. 标号4. 程序的结构5. 程序返回6. 语法错误和逻辑错误 4.3 编辑源程序4.4 编译4.5 连接4.6 以简化的方式进行编译和连接4.7 执行exe4.8 谁将可执行文件中的程序装载进入内存并使它运行?问题 4.1问题 4.2操作系统的shell 4.9 程序执行过程的跟踪实验3 编程、编译、连接、跟踪 4.1 一个源程序从写出到执行的过程
第一步:编写汇编源程序。第二步:对源程序进行编译连接。 可执行文件包含两部分内容 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的)相关的描述信息(比如程序有多大、要占用多少内存空间等) 第三步:执行可执行文件中的程序。 操作系统依照可执行文件中的描述信息将可执行文件中的机器码和数据加载入内存并进行相关的初始化(比如设置 CS:IP 指向第一条要执行的指令)然后由 CPU 执行程序。
4.2 源程序
程序 4.1
assume cs:codesg
codesg segmentmov ax, 0123Hmov bx, 0456Hadd ax, bxadd ax, axmov ax,4c00Hint 21H
codesg ends
end1. 伪指令
汇编指令会被编译为机器指令最终为 CPU 所执行。 而伪指令没有对应的机器指令它被用来辅助编译器进行相关的编译工作。
1.1 segment ends 声明段
段名 segment; 代码...
段名 endssegment 和 ends 是一对伪指令功能是定义一个段segment 说明一个段开始ends 说明一个段结束。一个段必须有一个名称来标识。 一个汇编程序是由多个段组成的指令、数据、栈被划分到了不同的段中。 一个有意义的汇编程序中至少要有一个段这个段用来存放代码。
1.2 end 结束标记
编译器在编译汇编程序的过程中碰到了伪指end就结束对源程序的编译。
1.3 assume 关联
用于将特定的段与相关段寄存器建立关联。
assume cs:codesg将代码段的段 codesg 和段寄存器 cs 联系起来。
2. 源程序中的“程序”
程序最先以汇编指令的形式存在源程序中经编译、连接后转变为机器码存储在可执行文件中。这个过程如图 4.2 所示。
3. 标号
汇编源程序中除了汇编指令和伪指令外还有一些标号比如codesg。它指代了一个地址。 比如 codesg 在 segment 的前面作为一个段的名称这个段的名称最终将被编译、连接程序处理为一个段的段地址。
4. 程序的结构
源程序是由一些段构成的。 任务: 编程运算 2^3。源程序应该怎样来写呢?
assume cs:abc ; 将 abc 和 cs 建立关联当作代码段。
abc segment ; 定义一个段名称为 abcmov ax,2 ; 在段中写入汇编指令 1add ax,ax ; 在段中写入汇编指令 2add ax,ax ; 在段中写入汇编指令 3; 这里还缺程序返回指令后面自己补上。
abc ends ; 段 abc 结束
end ; 指出程序在何处结束5. 程序返回
程序原本只是躺在硬盘中的一坨二进制数据。 执行程序的流程这里讨论的是DOS系统
程序A将程序B加载到内存。程序A将CPU控制权交给程序B。程序B执行。程序B执行完毕程序返回。交出CPU控制权。程序A拿到CPU控制权继续执行。
程序返回指令如下(书上说先死记后面会讲)
mov ax, 4c00H
int 21H表4.1 与结束相关的概念
目的相关指令指令性质指令执行者通知编译器一个段结束段名 ends伪指令编译时由编译器执行通知编译器程序结束end伪指令编译时由编译器执行程序返回mov ax,4c00H int 21H汇编指令执行时由 CPU 执行
6. 语法错误和逻辑错误
语法错误编译器能发现。 逻辑错误跑起来看了效果才知道。
4.3 编辑源程序
任何你熟悉的文本编辑器都可以。
4.4 编译
将源文件保存得到 test.asm编译masm test.asm 得到目标文件 test.obj。也可以直接输入masm 回车交互式设置编译参数
4.5 连接
连接的作用:
根据需要将源程序分为多个来编译得到多个目标标文件后再连接生成一个可执行文件;程序中调用了某个库文件中的子程序需要将这个库文件和该程序生成的目标文件连接到一起生成一个可执行文件;一个源程序编译后得到了存有机器码的目标文件目标文件中的有些内容还不能直接用来生成可执行文件连接程序将这些内容处理为最终的可执行信息。所以在只有一个源程序文件而又不需要调用某个库中的子程序的情况下也必须用连接程序对目标文件进行处理生成可执行文件。
使用微软的 Overlay Linker3.60 连接器文件名为 link.exe 4.6 以简化的方式进行编译和连接
末尾加分号 ; 表示都用默认参数
masm test.asm;
link test.obj;当然还有更简化的我们直接用 ML.exe
4.7 执行exe 我们的 test.exe 只是对寄存器进行操作。直接执行是看不到效果的debug调试一下就能看到效果了。作者说后面会介绍输出到屏幕的程序不过要几章之后去了
4.8 谁将可执行文件中的程序装载进入内存并使它运行?
我们在前面讲过在 DOS 中可执行文件中的程序 P1 若要运行必须有一个正在运行的程序 P2将 P1 从可执行文件中加载入内存将 CPU 的控制权交给它P1 才能得以运行;当 P1 运行完毕后应该将 CPU 的控制权交还给使它得以运行的程序 P2。 按照上面的原理再来看一下 4.7 节中 test.exe 的执行过程(思考相关的问题)。
在提示符c:\后面输入可执行文件的名字 test按 Enter 键。这时请思考问题 4.1。l.exe 中的程序运行。运行结束返回再次显示提示符“c:masm’。请思考问题 4.2。
问题 4.1
此时有一个正在运行的程序将 test.exe 中的程序加载入内存这个正在运行的程序是什么? 它将程序加载入内存后如何使程序得以运行?
在 DOS 中直接执行 test.exe 时是正在运行的 shell 程序 command将其加载入内存。command 设置 CS:IP 指向test.exe 的第一条指令(即程序的入口)从而使 test.exe 得以运行。
问题 4.2
程序运行结束后返回到哪里?
程序运行结束后返回到 command。 操作系统的shell 操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统都要提供一个称为 shell外壳)的程序用户(操作人员)使用这个程序来操作计算机系统进行工作。 DOS 中有一个程序 command.com这个程序在 DOS 中称为命令解释器也就是 DOS 系统的 shell。 DOS 启动时先完成其他重要的初始化工作然后运行 command.comcommand.com 运行后执行完其他的相关任务后在屏幕上显示出由当前盘符和当前路径组成的提示符比如:c:\或“c:\windows等然后等待用户的输入。 用户可以输入所要执行的命令比如cd、dir、 type 等这些命令由 command 执行command 执行完这些命令后再次显示由当前盘符和当前路径组成的提示符等待用户的输入。 如果用户要执行一个程序则输入该程序的可执行文件的名称command 首先根据文件名找到可执行文件然后将这个可执行文件中的程序加载入内存设置 CS:IP 指向程序的入口。此后command 暂停运行CPU运行程序。程序运行结束后返回到 command 中command 再次显示由当前盘符和当前路径组成的提示符等待用户的输入。 在 DOS 中command 处理各种输入: 命令或要执行的程序的文件名。我们就是通过 command 来进行工作的。 4.9 程序执行过程的跟踪
在 DOS 系统中EXE 文件中的程序的加载过程
debug test.exe
CX存放程序的长度。 DS存放程序所在内存区的段地址。 CSCS DS 10H。 PSP:此内存区的前256字节100H是DOS用来与程就进行通信的。 程序PSP之后就是程序。物理地址SA16 0 256 SA * 16 1616 0 (SA16) * 16 0
段地址:偏移地址表示为 SA10H:0
单步执行用T执行到 int 21 用 P正常执行结束会显示Program terminated normally然后回到 debug中。因为是 Debug 加载程序进内存执行的
实验3 编程、编译、连接、跟踪
《汇编语言》- 读书笔记 - 实验3 编程、编译、连接、跟踪