2011年微机原理课程上机实验指导书1 下载本文

第一部分 汇编语言程序设计实验

实验一 汇编语言编程基础

汇编语言是一种面向机器的“低级”语言,是计算机能够提供给用户的最快而最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。要真正理解计算机的工作过程,理解计算机程序的执行过程,就必须学习汇编语言。也正是因为如此,汇编语言程序设计是计算机专业和电子,自动控制等相关专业的重要课程。

但是,对于刚开始学习汇编语言的学生而言,汇编语言的一些命令非常抽象,很难理解,往往学习了很长时间也编不出满意的程序,更别说自如的应用,以致我们认为汇编语言很难掌握,影响我们学习汇编语言的兴趣。实际上,为了掌握好汇编语言,我们可以从熟悉、使用DEBUG调试工具开始,先来分析和读懂一些与硬件相关的小程序,这也是我们实验一的目的。

1.1 汇编语言程序的上机步骤

以下列源程序为例,先学习汇编语言的上机步骤。 文件名为1.asm:

DATA SEGMENT NUM1 DB 35,35H NUM2 DW 35,35H

NUM3 DB 4 DUP (34,3 DUP (34H)) NUM4 DB '34AB'

NUM5 DW '34','AB'

DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX

MOV BX,OFFSET NUM1 MOV AL,[BX]

MOV BX,OFFSET NUM5 MOV AX,[BX] MOV AH,4CH INT 21H

CODE ENDS

END START

1

一.上机步骤

汇编语言程序MASM软件由EDIT.COM编辑器,汇编MASM.EXE程序,连接LINK.EXE程序以及DUEBUG.EXE调试程序四个部分组成。汇编语言编制完成后,在计算机上的操作过程就分为四个阶段。

1. 编辑EDIT.COM

首先输入源程序,有两种方法:

(1)在记事本里录入,特别注意的是:在保存时文件格式必须选择所有文件,文件后缀名为.ASM, 即保存时文件名为XXX.asm。

(2)双击MASM软件中的编辑软件EDIT.COM文件框,在EDIT下输入源程序。用ALT+F键打开file菜单,用其中的save功能键将文件存盘。特别注意的是:汇编语言源程序文件的后缀必须为.asm,即保存时文件名为XXX.ASM。

图1-1 EDIT编辑界面

2.用汇编程序MASM.Exe对源程序.ASM文件汇编,生成目标文件.OBJ

汇编阶段的任务是把汇编语言源程序翻译成机器代码(称为目标),产生二进制格式的目标文件XXX.OBJ(名字与源程序名相同,只是后缀名不同),如果源程序有语法错误,则汇编过程结束后,MASM.EXE汇编程序会指出源程序中错误的行号和错误的原因,我们可以再用编辑程序EDIT.com来修改源程序中的错误,汇编无错后,方可得到正确的.OBJ目标文件,才能进行下一部的连接LINK。

双击MASM软件中的MASM.Exe文件框,在命令行后键入源程序名XXX.asm,(如果源程序与MASM软件在同一路径下,可以只键入文件名,而不要后缀),如以下界面:

2

图1-2 MASM编译1.asm文件无错误时的界面

3.连接LINK.EXE

由于汇编所得到的目标代码的存放地址并不是可执行的绝对地址,而是浮动的相对地址, 汇编产生的目标文件.OBJ还不能在计算机上运行,需要用连接程序LINK.EXE把目标文件.OBJ文件转换为可执行文件XXX.EXE文件.

双击MASM软件中的LINK.Exe文件框,在命令行后键入目标文件名XXX.OBJ(如果源程序,目标文件与MASM软件在同一路径下,可以只键入文件名,而不要后缀),如以下界面:

图1-3 LINK连接1.OBJ文件界面

如果连接没有错误,就会产生一个XXX.EXE的可执行文件,如果.OBJ文件有错误,连接时会指出错误的原因。对于无堆栈警告(warning: no stack segment)的提示,可以不予理睬,它是由于我们在源程序中没有定义堆栈段的原因,对于比较小的程源序和不需要再特别定义堆栈段的源程序,我们可以不定义堆栈段,它并不影响程序的正确执行。反而,如果连接时有其他的错误,则要检查并修改源程序XXX.ASM,然后再重新汇编MASM.EXE,连接link.exe的步骤,直到得到正确的XXX.EXE文件为止。

3

4.运行和调试DEBUG.exe

运行可执行文件,即双击XXX.EXE文件框即可,或在DOS下运行此程序, E:\\XXX.EXE。

1.2熟悉、使用DEBUG调试工具

以下重点介绍一些调试命令:以1.asm源程序为例:

图1-4 运行和调试DEBUG界面

1)N命令:用于指定进行读写的磁盘上的文件。 命令格式:N[path][filename]

如: -n 1.exe指定要装载(Load)或写入磁盘(Write)的文件名。

2)L命令:将指定的文件装入内存中 命令格式:L 回车键 -l 回车键

3)反汇编命令U

就是将存放在制定范围内的目标代码,反汇编成8086/8088的汇编指令格式,并按目标代码首地址,目标代码和对应的源指令的格式,在屏幕上显示出来。把目标代码反汇编后,用户可以方便地知道,程序从什么地址开始执行,执行的是哪一条指令,执行到什么地址为止。

命令格式:U[地址范围] -u

13FE:0000 B8FC13 MOV AX,13FC 13FE:0003 8ED8 MOV DS,AX 13FE:0005 BB0000 MOV BX,0000 13FE:0008 8A07 MOV AL,[BX]

4

13FE:000A BB1A00 MOV BX,001A 13FE:000D 8B07 MOV AX,[BX] 13FE:000F B8004C MOV AX,4C00 13FE:0012 CD21 INT 21

13FE:0014 0000 ADD [BX+SI],AL 13FE:0016 0000 ADD [BX+SI],AL 13FE:0018 0000 ADD [BX+SI],AL 13FE:001A 0000 ADD [BX+SI],AL 13FE:001C 0000 ADD [BX+SI],AL 13FE:001E 0000 ADD [BX+SI],AL

13FE为CS即代码段的段基地址,0000,0003,0005是偏移地址,B8FC13等是机器码(由代码段中的二进制机器指令反汇编得到)也就是程序在机器中的代码, MOV AX,13FC是助记符,帮助记忆机器中的指令。(源指令)

4)运行命令:

T命令:单步运行命令

以1.EXE调试为例,单步运行二次

13FE:0000 B8FC13 MOV AX,13FC 13FE:0003 8ED8 MOV DS,AX 13FE:0005 BB0000 MOV BX,0000 13FE:0008 8A07 MOV AL,[BX] 13FE:000A BB1A00 MOV BX,001A 13FE:000D 8B07 MOV AX,[BX] 13FE:000F B8004C MOV AX,4C00 13FE:0012 CD21 INT 21

13FE:0014 0000 ADD [BX+SI],AL 13FE:0016 0000 ADD [BX+SI],AL 13FE:0018 0000 ADD [BX+SI],AL 13FE:001A 0000 ADD [BX+SI],AL 13FE:001C 0000 ADD [BX+SI],AL 13FE:001E 0000 ADD [BX+SI],AL -t

AX=13FC BX=0000 CX=0034 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13EC ES=13EC SS=13FC CS=13FE IP=0003 NV UP EI PL NZ NA PO NC 13FE:0003 8ED8 MOV DS,AX -t

AX=13FC BX=0000 CX=0034 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13FC ES=13EC SS=13FC CS=13FE IP=0005 NV UP EI PL NZ NA PO NC 13FE:0005 BB0000 MOV BX,0000

可以看到机器随机分配给该程序的数据段的段基地址被AX赋予给DX。 该程序的代码段的段基地址为13FE,数据段的段基地址为13FC 。

5