汇编开发环境的搭建和使用

上机实验01  汇编开发环境的搭建和使用

一、实验要求和目的

 

1、掌握汇编语言程序设计的基本方法和技能;

2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序(注:也可用计事本编辑汇编源程序);

3、熟练掌握宏汇编程序MASM的使用;

4、熟练掌握连接程序LINK的使用。

 

二、软硬件环境

 

1、硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;

2、软件环境:装有MASM 5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等应用程序。

 

三、实验涉及的主要知识单元

 

1、汇编语言源程序的汇编过程

 

汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。.LST和.CRF两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择。

在对源程序文件(ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。因此,汇编程序的主要功能可以概括为以下三点: (1) 检查源程序中的语法错误,并给出错误信息;(2) 产生目标程序文件(OBJ文件)并可给出列表文件(.LST文件)(3) 展开宏指令。

汇编程序是系统提供的用于汇编的系统软件,目前常用的汇编程序有Microsoft公司推出的宏汇编程MASM(MACRO ASSEMBLER)和BORLAND公司推出的TASM(TURBO  ASSEMBLER)两种。Microsoft公司推出有宏汇编程序MASM和小汇编程序ASM两种,二者的区别在于:MASM有宏处理功能,而ASM没有宏处理功能,因此,MASMASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(64 KB),只能使用ASM

 

2、目标程序的连接过程

 

汇编后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件)还不能直接运行,它必须通过连接程序(LINK)连接成一个可执行程序后才能运行。连接程序进行连接时,其输入有两个部分:一是目标文件(.OBJ)目标文件可以是一个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。连接后输出两个文件,一是扩展名为 .EXE的可执行文件,另一个是扩展名为 .MAP 的内存分配文件,它是连接程序的列表文件,又称为连接映像(Link Map),它给出每个段在存储器中的分配情况,该文件可有可无。连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。所以,到此为止,连接过程已经结束,可以在操作系统下执行该.EXE程序了。

 

3、汇编语言和DOS操作系统的接口

 

编写的汇编语言源程序是在DOS环境下运行时,必须了解汇编语言是如何同DOS操作系统接口的。

用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令。INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。

DOS在建立了程序段前缀区PSP之后,将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DSES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底,然后系统开始执行用户程序。为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法。

(一)标准方法

首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序(FAR过程)的开始部分用如下三条指令将PSPINT 20H 指令的段地址及偏移地址压入堆栈:

         PUSH        DS                 ;保护PSP段地址

         MOV       AX0               ;保护偏移地址0

         PUSH       AX

这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CSIP,从而执行INT 20H指令,使控制返回到DOS状态。返回DOS的标志就是程序运行完后出现一个DOS的标识符,如C\>。

(二)非标准方法

也可在用户的程序中不定义过程段,只在代码段结束之前(CODE ENDS之前)增加两条语句:

MOV  AH4CH

INT  21H

则程序执行完后也会自动返回DOS状态。

此外,由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处使用以下方法重新装填DSES的值使其指向用户的数据段:

MOV  AX,段名                             

MOV  段寄存器名,AX       ;段寄存器名可以是DSESSS之一

 

四、实验内容与步骤

1、实验内容

编写程序,判断一个年份是否是闰年。

2、实验步骤

汇编语言程序设计上机过程如图1.1所示。

 

 

 
  

 

 

 

 

 

 

1.1  汇编语言程序上机过程

 

(一)用编辑程序EDIT建立汇编语言源程序文件(ASM文件)

例如,编写程序,判断一个年份是否是闰年的汇编语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM。也可以在Windows 2000或者在Windows XP环境下鼠标单击“开始”→“运行”,在“运行”中输入“CMD”进入DOS模式,运行EDIT软件,例如:

         C> EDIT  ABC.ASM

进入EDIT的程序编辑画面时,输入汇编语言源程序如下:

        DATA  SEGMENT

       INFON  DB        0DH,0AH,'Please input a year: $'

           Y  DB        0DH,0AH,'This is a leap year! $'

           N  DB        0DH,0AH,'This is not a leap year! $'

           W  DW        0

         BUF  DB        8

              DB        ?

              DB        8 DUP(?)

        DATA  ENDS

       STACK  SEGMENT   'stack'

              DB        200 DUP(0)

       STACK  ENDS

        CODE  SEGMENT

              ASSUME    DS:DATA,SS:STACK,CS:CODE

      START:  MOV       AX,DATA

              MOV       DS,AX

              LEA       DX,INFON

              MOV       AH,9

              INT       21H

              LEA       DX,BUF

              MOV       AH,10

              INT       21H

              MOV       CL, [BUF+1]

              LEA       DI,BUF+2

              CALL      DATACATE

              CALL      IFYEARS

              JC        A1

              LEA       DX,N

              MOV       AH,9

              INT       21H

              JMP       EXIT

         A1:  LEA       DX,Y

              MOV       AH,9

              INT       21H

       EXIT:  MOV       AH,4CH

              INT       21H

    DATACATE  PROC      NEAR

              LEA       SI,BUF+2

              MOV       BX,0

         X3:

              MOV       AL ,[SI]

              SUB       AL ,30H

              MOV       AH,0

              XCHG      AX,BX

              MOV       DX,10D

              MUL       DX

              XCHG      AX,BX

              ADD       BX,AX

              INC       SI

              LOOP      X3

              MOV       W,BX

              RET

    DATACATE  ENDP

     IFYEARS  PROC      NEAR

              PUSH      BX

              PUSH      CX

              PUSH      DX

              MOV       AX,W

              MOV       CX,AX

              MOV       DX,0

              MOV       BX,4

              DIV       BX

              CMP       DX,0

              JNZ       LAB1

              MOV       AX,CX

              MOV       BX,100

              DIV       BX

              CMP       DX,0

              JNZ       LAB2

              MOV       AX,CX

              MOV       BX,400

              DIV       BX

              CMP       DX,0

              JZ        LAB2

       LAB1:  CLC

              JMP       LAB3

       LAB2:  STC

       LAB3:  POP       DX

              POP       CX

              POP       BX

              RET

     IFYEARS  ENDP

        CODE  ENDS

              END       START

 

(二)用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件)

 

当源程序建立以后,仍以ABC.ASM程序为例,我们用汇编程序MASMABC.ASM源程序文件进行汇编,以便产生机器码的目标程序文件ABC.OBJ,其操作步骤如下:

         C>MASM ABC

             Microsoft (R) Macro Assembler Version 5.00

             Copyright (C) Microsoft Corp 1981–19851987. All rights reserved.

        Object filename [ABC.OBJ]

             Source listing [NUL.LST]ABC

             Cross-reference [NUL.CRF]ABC

50674 + 450574 Bytes symbol space free

0 Warning Errors

0 Severe  Errors

由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。

第一个提示行为:Object filename [ABC.OBJ]

这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示),这是我们汇编的主要目的。

第二个提示行为:  Source listing [NUL.LST]

这是询问是否建立列表文件。若不建立,直接回车;若要建立,可以输入文件名ABC再回车,表示要建立名为ABC的列表文件。列表文件中同时列出源程序和机器语言程序清单,并给出符号表,有利于程序调试。

第三个提示行为:Cross-reference [NUL.CRF]

这是询问是否要建立交叉索引文件。若不建立,则直接回车;若要建立,可以输入文件名ABC,表示要建立ABC.CRF文件。由于.CRF是非文本文件,为了建立交叉索引文件,还必须调用CREF.EXE程序,即输入:

C>CREF ABC

    Microsoft (R) Cross-Reference Utility Version 5.00

    Copyright (C) Microsoft Corp 198119851987. All rights reserved.

    listing [ABC.REF]

    17  Symbols

这时首先显示版本号,然后出现一个提示行:Listing [ABC.REF]

这是询问交叉索引文件名。这时可用回车承认方括号内机器默认的文件名,如上所示。这样就建立了ABC.REF文件。其内容是用户定义的所有符号(包括变量),并给出每个符号定义所在的行号(附以#)以及引用的行号。如下是ABC.REF文件的内容:

Microsoft Cross-Reference  Version 5.00       Sat Dec 01 18:49:42 2007

  Symbol Cross-Reference        (# definition, + modification)  Cref-1

A1 . . . . . . . . . . . . . . .   42     47#

BUF. . . . . . . . . . . . . . .   15#    35     38     39     55 

CODE . . . . . . . . . . . . . .   28#    29    111 

DATA . . . . . . . . . . . . . .    1#    21     29     30 

DATACATE . . . . . . . . . . . .   40     53#    80 

EXIT . . . . . . . . . . . . . .   46     50#

IFYEARS. . . . . . . . . . . . .   41     82#   110 

INFON. . . . . . . . . . . . . .    2#    32 

LAB1 . . . . . . . . . . . . . .   92    103#

LAB2 . . . . . . . . . . . . . .   97    102    105#

LAB3 . . . . . . . . . . . . . .  104    106#

N. . . . . . . . . . . . . . . .   10#    43 

STACK. . . . . . . . . . . . . .   22#    22     27     29 

START. . . . . . . . . . . . . .   30#   112 

W. . . . . . . . . . . . . . . .   14#    76+    86 

X3 . . . . . . . . . . . . . . .   60#    73 

Y. . . . . . . . . . . . . . . .    6#    47 

 17 Symbols

 

调入汇编程序,当我们回答了上述各提示行的询问之后,汇编程序就对源程序进行汇编。若汇编过程中发现源程序有语法错误,则列出有错误的语句和错误的代码。错误分警告错误(Wraning Errors)和严重错误(Severe Errors)。警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数及行号、错误的性质等。这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序加以修改,修改后重新汇编,直到汇编后无错误为止。

 

(三) 用连接程序LINK生成可执行程序文件(EXE文件)

 

经汇编后产生的二进制的目标程序文件(OBJ文件)并不是可执行程序文件(EXE文件),必须经连接以后,才能成为可执行文件。连接程序并不是专为汇编语言程序设计的。如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起。这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件。

连接过程如下:

C>LINK  ABC

Microsoft (R) Overlay Linker Version 3.60

Copyright (C) Microsoft Corp 1983-1987. All rights reserved.

Run File [ABC.EXE]

List File [NUL.MAP]ABC

Libraries [.LIB]

在连接程序调入后,首先显示版本号,然后出现三个提示行。

第一个提示行为:Run File [ABC.EXE]

这是询问要产生的可执行文件的文件名。一般直接回车采用方括号内规定的隐含文件名。

第二个提示行为:List File [NUL.MAP]

这是询问是否要建立连接映象文件。若不建立,则直接回车;若要建立,则输入文件名再回车。如果要建立该文件,可以输入文件名ABC

第三个提示行为:Libraries [.LIB]

这是询问是否用到库文件。若无特殊需要,则直接回车即可。

上述提示行回答后,连接程序开始连接。若连接过程中有错,则显示错误信息,错误分析清楚后,要重新调入编辑程序进行修改,然后重新汇编,再经过连接,直至无错为止。连接以后,便产生了可执行程序文件(EXE文件)

 

(四) 程序的执行

 

当我们建立了可执行文件ABC.EXE后,就可直接在DOS下执行该程序:

  C>ABC

根据程序提示,输入一个年份,计算机会输出是否闰年的结果。

 

五、实验要求与提示

1、实验要求

    (1)掌握汇编语言程序设计上机过程;

    (2)回答思考问题;

(3)记录实验结果。

 

2、实验提示

 

按照图1.1的上机过程进行实验。

 

六、录入并编译完成教材P398页的例13-1 Fibonacci.ASM

七、实验提交

把完成后的源程序文件、目标文件、可执行文件上传(注:上传ABC.ASM、ABC.OBJ、ABC.EXE; Fibonacci.ASM、Fibonacci.OBJ、Fibonacci.EXE)。

ABC.ASM

DATA  SEGMENT
       INFON  DB        0DH,0AH,'Please input a year: $'
           Y  DB        0DH,0AH,'This is a leap year! $'
           N  DB        0DH,0AH,'This is not a leap year! $'
           W  DW        0
         BUF  DB        8
              DB        ?
              DB        8 DUP(?)
        DATA  ENDS
       STACK  SEGMENT   'stack'
              DB        200 DUP(0)
       STACK  ENDS
        CODE  SEGMENT
              ASSUME    DS:DATA,SS:STACK,CS:CODE
      START:  MOV       AX,DATA
              MOV       DS,AX
              LEA       DX,INFON
              MOV       AH,9
              INT       21H
              LEA       DX,BUF
              MOV       AH,10
              INT       21H
              MOV       CL, [BUF+1]
              LEA       DI,BUF+2
              CALL      DATACATE
              CALL      IFYEARS
              JC        A1
              LEA       DX,N
              MOV       AH,9
              INT       21H
              JMP       EXIT
         A1:  LEA       DX,Y
              MOV       AH,9
              INT       21H
       EXIT:  MOV       AH,4CH
              INT       21H
    DATACATE  PROC      NEAR
              LEA       SI,BUF+2
              MOV       BX,0
         X3:
              MOV       AL ,[SI]
              SUB       AL ,30H
              MOV       AH,0
              XCHG      AX,BX
              MOV       DX,10D
              MUL       DX
              XCHG      AX,BX
              ADD       BX,AX
              INC       SI
              LOOP      X3
              MOV       W,BX
              RET
    DATACATE  ENDP
     IFYEARS  PROC      NEAR
              PUSH      BX
              PUSH      CX
              PUSH      DX
              MOV       AX,W
              MOV       CX,AX
              MOV       DX,0
              MOV       BX,4
              DIV       BX
              CMP       DX,0
              JNZ       LAB1
              MOV       AX,CX
              MOV       BX,100
              DIV       BX
              CMP       DX,0
              JNZ       LAB2
              MOV       AX,CX
              MOV       BX,400
              DIV       BX
              CMP       DX,0
              JZ        LAB2
       LAB1:  CLC
              JMP       LAB3
       LAB2:  STC
       LAB3:  POP       DX
              POP       CX
              POP       BX
              RET
     IFYEARS  ENDP
        CODE  ENDS
              END       START

Fibonacci.ASM

DATA    SEGMENT
RABBITNUM       DW      650
MONTHNUM        DB      ?
DATA            ENDS
STACK1          SEGMENT PARA STACK
                DW      20H  DUP (?)
STACK1          ENDS
CODE            SEGMENT
                ASSUME  CS:CODE,DS:DATA
START:          MOV     AX,DATA
                MOV     DS,AX
                XOR     CX,CX
				MOV		AX,0
                MOV     BX,1
NEXT:           XCHG    AX,BX
                ADD     AX,BX
                INC     CL
                CMP     AX,RABBITNUM
                JAE     RESULT
                JMP     NEXT
RESULT:         MOV     MONTHNUM,CL
                MOV     AH,4CH
                INT     21H
CODE            ENDS
                END     START

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值