小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序

1、使用工具

代码编写:NotePad++,代码编译器:MASM

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

第一步,使用文本编辑器,用汇编语言编写汇编源程序,这一步产生一个存储源程序的文本文件。

第二步,对源程序进行编译,连接。使用MASM.exe对源程序文件进行编译,产生目标文件,再使用LINK.exe对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。可执行文件包括两个部分,程序(从源程序的汇编指令翻译过来的机器码)和数据(源程序中定义的数据);相关的描述信息 (程序有多大,要占多少内存空间)。这一步产生了一个可在操作系统中直接运行的可执行文件.exe。

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

3、一段简单的汇编语言源程序

assume CS:codesg

codesg segment

mov ax,0123H

mov bx,0456H

add ax,bx

add ax,ax

mov ax,4C00H

int 21H

codesg ends

end

上面的代码就是简单的加法运算,这里要解释几个概念。

第一,伪指令。汇编语言源程序中包含了汇编指令和伪指令。汇编指令会被翻译成对应的机器码,而伪指令则没有对应的机器码,最终不能被CPU所理解,但是会被编译器理解。伪指令是被编译器编译的指令,编译器根据伪指令进行相关的编译工作。在上面的程序中,伪指令有assume,segment...ends,end

(1)segment...ends

segment和ends是成对出现的伪指令。意思是在二者之间定义一个段,segment表示一个段的开始,ends表示一个段的结束:

    段名segment

      .

      .

    段名     ends

     一个汇编程序可以由多个段组成,这些段被用来存放代码、数据、或者被当做一个栈空间来使用。

(2)end

end是一个汇编程序结束的标记,编译器在编译程序时,碰到了伪指令的话,就会停止对源程序的编译。所以程序写完了一定要加上伪指令end。

(3)assume

assume表示“假设”的意思,假设某一段寄存器和程序中的某一个段相关联,也就是告诉CPU指向哪一个段,从哪里开始执行汇编指令的意思。

       上面的代码中codesg segment...codesg ends定义了一个名为codesg的段,在这个段中存放了代码,所以这个段是一个代码段。程序开头用assume cs:codesg将代                             码段codesg和CPU中的段寄存器CS联系在一起。

4、源程序中的“程序”

用汇编语言编写的程序包括伪指令和汇编指令。汇编指令是最终由计算机执行的程序,伪指令只是由编译器来执行。所以说,源程序中的“程序”指的就是由汇编指令或者数据构成的。程序经过编译连接后转换为CPU认识的机器码,过程如下图所示:

5、标号

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

6、程序返回

在上面的示例代码中:

mov ax,4c00H

int 21H

这两条指令所实现的功能就是程序返回。在程序的末尾使用这两条指令就可以实现程序返回。

这里我们要理解什么是程序返回。在DOS单任务操作系统中,一次只能运行一个程序,当程序1在运行时,程序2要运行,则要将CPU的控制权给程序2,程序2才能得到运行。程      序2开始运行后,程序1暂停。当程序2运行完毕后,应该讲CPU的控制权交还给程序1,此后,程序1继续运行。所以,一个程序结束后,将CPU的控制权交还给使得这个程序得        以运行的程序,这个过程就是程序返回。

7、区分与“结束”相关的概念

这里我们已经了解了几个“结束”相关的概念,区分如下表所示:

8、编译源程序

首先我们要有一个汇编编译器,这里我们使用的是MASM,需要下载的话,可以去我的百度网盘下载,链接:http://pan.baidu.com/s/1dFMUgH7(密码:xdpm)

将源程序文件和编译器放一块儿,方便我们直接编译:

进入cmd小黑窗,进入到MASM编译器目录中,运行MASM.exe:

此时文件夹中会出现一个object文件:

接下来我们使用LINK.exe来连接这个object文件:

连接后,文件夹中就会出现一个可执行文件:

要想查看程序的运行过程,我们可以使用debug来单步调试这个可执行程序:

我们可以看到,使用t命令单步执行debug后,会运行我们在程序中写的汇编指令。这里我们要注意一点,就是当语句执行到最后一局“int 21”时,我们要使用P命令来结束。调试结      束后,按“q”来退出debug,回到command中。

9、小结

汇编程序从写出到执行的过程如下图所示:

  

时间: 2024-10-08 09:48:00

小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序的相关文章

小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似,[0]表示内存单元的偏移地址是0.要完整描述一个内存单元,需要两种信息:内存单元的地址,内存单元的长度(类型).[BX]同样也表示一个内存单元,它的偏移地址在bx中,比如指令:mov ax,[bx].这里我们以一个程序为例: 1 assume cs:codesg 2 codesg segment 3 start: mov

小甲鱼零基础汇编语言学习笔记第六章之包含多个段的程序

在前面的几个章节中,我们的程序都是只有一个代码段,本章我们开始学习如何编写包含多个段的程序. 1.在代码段中使用数据 首先考虑这样一个问题,计算以下8个数据的和,结果存放在ax寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身,可现在我们要累加就是已经给定了数值的数据. 代码如下: 1 assume cs:codesg 2 codesg segment 3 dw 0123H

小甲鱼零基础python课后题 P22 021函数:递归是神马

0.递归在编程上的形式是如何表现的呢? 答:在编程上,递归表现为函数调用本身这么一个行为. 1.递归必须满足哪两个基本条件? 答:1函数调用自己. 2有正确的返回条件 2.思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况? 答:不知道呢,应该就是小甲鱼课上说的那个三角形 3.用递归去计算阶乘问题或奜波那契数列是很糟糕的算法,你知道为什么吗? 答:效率太低,每次都需要调用自己,占用空间. 4.请聊一聊递归的优缺点.(想怎么写就怎么写按自己理解的来) 答:优点,代码简洁 缺点 ,效率低占

JavaScript学习笔记(第四章——第六章)

时间戳(2015-06-09 20:58:00) 第四章:变量.作用于和内存问题          typeof:判断元素是什么类型            instanceof:检测引用类型对象是否未指定类型          注:所有引用类型皆为Object的实例          JavaScript没有块级作用域:                    例1: if(true){ var color = “blue”; } alert(color);               // bl

小甲鱼零基础入门PYTHON

 000.愉快的开始 00:17:37 ☆  001.我和Python的第一次亲密接触 00:13:26 ★  002.用Python设计第一个游戏 00:24:00 ★  003.小插曲之变量和字符串 00:19:04 ★  004.改进我们的小游戏 00:26:31 ★  005.闲聊之Python的数据类型 00:18:41 ★  006.Pyhon之常用操作符 00:16:31    007.了不起的分支和循环 00:16:30    008.了不起的分支和循环2 00:12:09  

小甲鱼零基础python课后题 P20 019函数:我的地盘听我的

测试题 0.如果希望在函数中修改全局变量的值,应该使用什么关键字? 答:globe 1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字? 答:nonlocal 2.python的函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问题呢? def outside(): print("I am outside") def inside(): print("I am inside") inside() 答:inside() 不是外部

<<Python基础教程>>学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连