汇编程序的汇编及运行

1.实验目的和要求   

  1. 熟悉汇编程序的汇编、连接、执行过程
  2. 生成LST文件,查看LST文件
  3. 生成OBJ文件,修改语法错误
  4. 生成EXE文件
  5. 执行

2.实验环境

IBM—PC机及其兼容机

实验的软件环境是:

 操作系统:DOS 2.0以上;调试程序:DEBUG.COM;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录

1、将数据段输入,取名1.txt,保存在MASM文件夹下。生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?

DATA    SEGMENT

          ORG 20H

          NUM1=8

          NUM2=NUM1+10H

              DA1  DB ‘IBM PC’

          DA2  DB 0AH, 0DH

              COUNT EQU $-DA1

              DATA     ENDS

             END

DA1的偏移量:20H

DA2的偏移量:26H

COUNT:0008

  1. 输入有错误的文件,修改错误语句。(MASM没有出现错误即可。不必连接、运行。)

       DATA    SEGMENT

              VAR1     DB 0, 25, ODH, 300

              VAR2     DB 12H, A4H, 6BH

              VAR3     DB ’ABCDEF’

              VAR4     DW 1234H, 5678H

              VAR5     DW 10H DUP(?)

              DATA    ENDS

              CODE    SEGMENT

                        ASSUME      CS: CODE, DE: DATA

              BEING   MOV   AX, DATA

                       MOV   DS, AX

                       LEA     SI, VAR5

                       MOV   BX, OFFSET VAR2

                       MOV   [SI], 0ABH

                       MOV   AX, VAR1+2

                       MOV   [BX], [SI]

                       MOV   VAR5+4, VAR4

                       MOV   AH, 4CH

                       INT       21H

              CODE    ENDS

                         END       START

  1. 错误一;error A2009: Symbol not defined: ODH  O不是十六进制的值,根据提议应该本来是数字0,写成了字母‘O’,故改为0DH
  2. 错误二;error A2050: Value out of range 第一行改完之后,又出现了新的错误,300超出了数字的范围,1个字节(8位)最大的无符号数为255,所以改为30
  3. 错误三;error A2009: Symbol not defined: A4H 在十六进制中,以字母开头的数都要加上数字零,不然会报错,所以将其改为0A4H
  4. 错误四;Extra characters on line 报错该行有多余的字符,其实和本实验中第一题的发生的错误相同,‘‘’号用的是中文的逗号,而不是英文的逗号,所以识别错误,将其改为中文的逗号
  5. 错误五;Symbol not defined: DE 第八行和第九行是段分配语句是条伪指令一般放在代码段的第一条位置,建立段寄存器和段名之间关系,这边DE应该是写错了,根据后面的data可知,这边应该改为数据寄存器DS。并把该条语句转移到第一行。
  6. 错误六;Expected: instruction or directive 出现了无法识别的助记符,这是因为在being后面漏掉一个‘:’符号导致的
  7. 错误七;Operand must have size 第十四行,这个算是经典错误了,目的操作数是内存,而源操作数是立即数的时候,必须限定目的操作数的大小,因为源操作数又是一个字节,所以在[SI]前面加上byte ptr
  8. 错误八;Operand types must match 第十五行 源操作数和目的操作数的类型没有匹配,VAR1+2的地址只占8位,而AX寄存器是16位,所以位不匹配。应该将AX更改为8位寄存器,例如ALAH,这边我改成AL
  9. 错误九;Improper operand type 第十六行 操作数类型使用不当 这个也是经典错误,源操作数和目的操作数不能同时为内存,这是需要一个类似C语言中交换语句的中介,

这边我更改为Mov AX [SI],Mov [BX] AX

  1. 错误十;Improper operand type 第十七行 这个错误和第十六行的错误相同,所以我这边更改为Mov AX [var4],Mov [var5+4] AX
  2. 错误十一;Symbol not defined: START 没有start与其对应,这里的End应该和上面的being对应 ,所以这里将start更改为being

             至此错误就全部改完啦

  1. 输入正确的程序,汇编、连接、运行

STACKS       SEGMENT    STACK

         DW           128 DUP(?)

              STACKS       ENDS

              DATAS          SEGMENT

              STRING      DB ‘WELCOME!’, 13, 10, ‘$’

              DATAS          ENDS

              CODES         SEGMENT

                              ASSUME      CS: CODES, DS: DATAS

              START:     MOV      AX, DATAS

                              MOV      DS, AX

                              LEA       DX, STRING

                              MOV      AH, 9

                              INT       21H

                              MOV    AH, 4CH

                              INT       21H

              CODES         ENDS

                              END       START

4.算法描述及实验步骤

   参照实验辅导书71

5.调试过程

  详细记录程序在调试过程中出现的问题及解决方法。

6. 实验结果

记录测试数据及程序执行的结果。

7. 总结

       在本次实验中,第一次亲自运行了汇编语言程序,对汇编语言有了进一步的认识。首先是汇编语言编译运行方面的认识,我们这边两种方法可以去编写和运行汇编程序,第一种是使用masm for windows 集成环境,第二种是使用dos环境进行编译,连接和运行。这边我用的是dos环境,编写程序直接在vscode或者txt上直接进行编写。在dos环境中,首先要用mount配置masm的文件夹,然后要用到masm进行编译,link命令进行连接,文件名.exe进行运行,如果要略过目标程序的命名过程可以直接在命令后面加上‘;’即可。

第二个方面是对汇编程序有了进一步的认识,在每个汇编程序的开头我们可以加上ASSUME    CS: CODE, DS: DATA,用来建立段寄存器和段名之间关系。汇编程序和之前学的C或者Java的规定差不多,一般都是先定义变量,然后再写代码段。在每个代码段的开头和结尾

你可能感兴趣的:(程序人生)