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

时间:2021-01-06 01:17:42
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、小结
     汇编程序从写出到执行的过程如下图所示:
   小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序