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、小结
         汇编程序从写出到执行的过程如下图所示:
      
  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/getMyCodes/p/7253243.html
Copyright © 2011-2022 走看看