汇编语言-第四章 第一个程序

一个源程序从写出到执行的过程

  • 编写汇编源程序
  • 对源程序进行编译链接

1.使用 汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件。 2.用链接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。 其中,可执行文件包含两部分内容:

  • 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
  • 相关的描述信息(比如,程序有多大、要占用多少内存空间)。

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

源程序

1. 伪指令

汇编语言中包含两种指令:

  • ** 汇编指令** 有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
  • 伪指令: 没有对应的机器指令,最终不被CPU所执行。 伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。

例子

assume cs:codesg
codes segment
start: mov ax,0123H
       mov bx,0456H
       add ax,bx
      add ax, ax
      
      mov ax,4c00H
      int 21H
codes ends

end  

segment和ends是成对使用的伪指令。segment说明一个段开始,ends说明一个段结束。 一个段必须有一个名称来标识,使用格式为:

段名 segment    
……
段名 ends    

一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当做栈空间来使用。 一个源程序中所有将被计算机所处理的信息:指令、数据、栈,被划分到了不同的段中。 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。

end是一个汇编程序结束的标志,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。 注意: 不要搞混了end和ends。ends是和segment成对使用的,标记一个段的结束。 end的作用是标记整个程序的结束。

assume 将有特定用途的段和相关的段寄存器关联起来即可。 比如,上面的程序中:在程序的开头,用assume cs:codesg将用作代码段的codesg和CPU中的段寄存器CS关联起来。

2. 源程序中的程序

我们将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行、处理的指令或数据,称为程序。 程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。

3. 标号

汇编源程序中,除了汇编指令和伪指令外,还有一些标号,比如“codesg”。 一个标号指代了一个地址。比如codesg和segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。

4. 程序的结构

源程序是由一些段构成的。我们可以在这些段中存放代码、数据、或将某个段当做栈空间。

程序返回

我们的程序最先以汇编指令的形式存储在源程序中,经编译、连接后变为机器码,存储在可执行文件中,那么它怎样得到运行呢? 下面,我们在一个单任务操作系统的基础上,简单的讨论一下这个问题:

一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才得以运行。 P2开始运行后,P1暂停运行。 当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。 一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。那么,如何返回呢?应该在程序的末尾添加返回的程序段。

前面的程序中,下面两条指令实现的功能就是程序返回:

mov ax,4c00H
int 21H

语法错误和逻辑错误

程序在编译时被编译器发现的错误是语法错误。 源程序编译后,在运行时发生的错误是逻辑错误。

4.3编译源程序

4.4编译

在编译的过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.lst)、交叉引用文件(.crf)。 其中,目标文件是我们最终要得到的文件。

4.5连接

连接的作用有以下几个:

  • 当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
  • 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
  • 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。

4.6以简化的方式进行编译和连接

4.7 1.exe的执行

4.8可执行文件中的程序装入内存并运行的原理

操作系统的外壳 操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。 DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell。 DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他的相关任务后,在屏幕显示出由当前盘符合当前路径组成的提示符,比如:“C:\” 或“C:\windows”等,然后等待用户输入。

用户可以输入所要执行的命令,比如:cd、dir、type等,这些命令由command执行,command执行完这些命令后,再次显示由当前盘符合当前路径组成的提示符,等待用户的输入。 如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,command暂停运行,CPU运行程序。 程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。 在DOS中,command处理我们的各种输入:命令或要执行的程序的文件名。我们就是通过commanf来进行工作的。

4.9程序执行过程的跟踪

debug可以将程序加载入内存,设置CS:IP指向程序的入口,但debug并不放弃对CPU的控制。 这样,我们可以使用debug的相关命令来单步执行程序,查看每一条指令的执行结果。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武军超python专栏

2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩

今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传

17440
来自专栏xiaoheike

Elasticsearch Network Settings

Elasticsearch 缺省情况下是绑定 localhost。对于本地开发服务是足够的(如果你在相同机子上启动多个节点,它还可以形成一个集群),但是你需要配...

17920
来自专栏极客慕白的成长之路

网站服务器修改SSH默认22端口

1.9K50
来自专栏Java成神之路

JAVA之 JDK安装及环境变量配置

Path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

10610
来自专栏人工智能LeadAI

深入理解并发/并行,阻塞/非阻塞,同步/异步

1、阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: ? 进程状态 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个...

41740
来自专栏抠抠空间

python并发编程之多进程(理论)

一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序:仅仅是一堆代 进程:是指打开程序运行的过程 三、...

43870
来自专栏coding

bash基础特征

11620
来自专栏云计算教程系列

【基础干货】Linux Shell基础教程

shell,也称为“命令行界面”或“CLI”,是与远程Linux服务器交互的主要方法。shell是一个丰富的界面,用于处理文件,管理系统和编写常见任务脚本。如果...

15140
来自专栏电光石火

使用Maven创建web项目

​使用eclipse插件创建一个web project

24280
来自专栏zaking's

走近webpack(2)--css打包及压缩js

  前面的文章介绍了webpack的devServer以及多入口多出口文件的配置,咱们继续往下学。   在开始学习接下来的知识之前,我们先回顾一下,前文提到了w...

52980

扫码关注云+社区

领取腾讯云代金券