zoukankan      html  css  js  c++  java
  • 小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序

    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、小结
         汇编程序从写出到执行的过程如下图所示:
      
  • 相关阅读:
    ASP.NET之电子商务系统开发1(数据列表)
    ASP.NET之电子商务系统开发2(购物车功能)
    MFC之列表控件
    自己动手写操作系统(二)一个最小的“操作系统”
    自己动手写操作系统(一)环境准备
    windows常用快捷键
    MFC之下拉框
    链表反转&交换链表结点
    TinyHttp前置知识
    单链表基本操作总结
  • 原文地址:https://www.cnblogs.com/getMyCodes/p/7253243.html
Copyright © 2011-2022 走看看