微机原理实验报告

   姓名:XXX

   学号:XXXXXX

   指导教师:XXX

 

实验一 Debug命令及汇编指令和寻址的应用

 

一、实验内容

  1、设堆栈段指针SP=1000H,AX=4000H,BX=8000H;请编写一段程序将 AX 和BX的内容进行交换。要求:用3种不同的方法实现。

  (1)、用记事本编辑程序,保存文件,命名为11.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 11.asm 汇编文件,生成11.obj文件。

  (3)、命令link 11.obj 链接文件,生成11.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 11.exe;l;u 进行反汇编,后用g命令运行。

  (5)、运行结果:

三种方法运行结果分别如下:

   (6)三种方法的源程序:

方法一:

DATA  SEGMENT

BUF   DB ?

DATA  ENDS

STACK SEGMENT STACK

      DB 10 DUP(0)

STACK ENDS

CODE  SEGMENT

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

START:MOV AX,4000H

      MOV BX,8000H

      MOV CX,AX

      MOV AX,BX

      MOV BX,CX

CODE  ENDS

      END START

方法二:

DATA  SEGMENT

BUF   DB ?

DATA  ENDS

STACK SEGMENT STACK

      DB 10 DUP(0)

STACK ENDS

CODE  SEGMENT

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

START:MOV AX,4000H

      MOV BX,8000H

      XCHG AX,BX

CODE  ENDS

      END START

方法三:

DATA  SEGMENT

BUF   DB ?

DATA  ENDS

STACK SEGMENT STACK

      DB 10 DUP(0)

STACK ENDS

CODE  SEGMENT

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

START:MOV AX,4000H

      MOV BX,8000H

      PUSH AX

      PUSH BX

      POP  AX

      POP  BX

CODE  ENDS

      END START

2、分别执行以下指令,比较寄存器寻址,寄存器间接寻址和相对寄存器寻址  间的区别。

MOV BX1000H

MOV AXBX

MOV AX[BX]

MOV  AX20[BX]

     要求:在执行以上指令时,记下当时DS数据段的值,记下每条指令执行后的AX的结果。将以上指令的"BX"修改为DX执行指令,观察结果及结果产生的原因。

   (1)、打开debug,在debug环境中a命令开始编写程序,编写完成后用g命令运行。

   (2)、实验程序和结果:

DS数据段的值为13D8HMOV AXBX 执行后AX的值为1000HMOV AX[BX] 执行后AX的值为3325HMOV AX20[BX] 执行后AX的值为14ABH。第一条指令是将1000H送入BX寄存器中,指令二是将BX中的值送入AX中,指令三是将存储器中地址为13D8H1000H字单元内的值送入AX中,指令四是将存储器地址为13D8H1020H字单元的值送入AX中。

3、、已知有如下程序段:

MOV  AX3421H

MOV  CL4

在以上程序段的基础上,分别执行以下指令:

ROL  AXCL  

ROR  AXCL

SHL  AXCL

SHR  AXCL

SAR  AXCL

RCL  AXCL

RCR  AXCL

试在DEBUG下用A命令汇编以上程序段,用T命令跟踪,观察以下内容:

(1)       每条指令执行完后,AX寄存器的内容是什么?

(2)       每条指令执行完成后,进位、符号和零标志位的值有什么变化?

运行结果:

ROL  AXCL      AX=4213HCF=1SF=0ZF=0

    ROR  AXCL      AX=1342HCF=0SF=0ZF=0

    SHL  AXCL       AX=3420HCF=1SF=0ZF=0

    SHR  AXCL       AX=0342HCF=0SF=0ZF=0

    SAR  AXCL       AX=0342HCF=0SF=0ZF=0

    RCL  AXCL       AX=4213HCF=1SF=0ZF=0

    RCR  AXCL       AX=3342HCF=0SF=0ZF=0

 

4、设有以下部分程序段:

TABLE  DW  10H20H30H40H50H

ENTRY  DW  4

        .

        .

        .

   LEA  BXTABLE

   ADD  BXENTRY

   MOV  AX[BX]

要求: (1)将以上程序段补充成为一个完整的汇编程序。

(2)在(1)的基础上编辑、调试并运行程序,记录在执行MOV  AX[BX]AX的内容。

 步骤:

(1)、用记事本编辑程序,保存文件,命名为14.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 14.asm 汇编文件,生成14.obj文件。

  (3)、命令link 14.obj 链接文件,生成14.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 14.exe;l;u 进行反汇编,后用g命令运行。

  (5)、运行结果:ax=30h

(6)、实验源程序:

 DATA  SEGMENT

               TABLE DW 10H,20H,30H,40H,50H

               ENTRY DW 4

               BUF   DB 20 DUP (?)

        DATA  ENDS

        STACK SEGMENT STACK

              DB 10 DUP(0)

        STACK ENDS

        CODE  SEGMENT

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

        START:MOV AXDATA

               MOV DSAX

              LEA BX,TABLE

              ADD BX,ENTRY

              MOV AX,[BX]

              MOV AH4CH

              INT  21H

         CODE  ENDS

                END START

二、实验心得:

通过本次实验,熟练掌握了程序上机过程,熟悉了程序的汇编、链接、调试的步骤,掌握了Debug常用命令的功能及命令格式。在编写程序的过程中,拼写错误是最常发生错误,这就要求我们必须要细心,同时还必须有耐心。

实验二 汇编语言程序的调试与运行

一、实验内容

1、  1、求单元内存中所定义的两个字节变量的连续内容之和。要求使用三种不同的方法实现,下边给出一种方法,请自己编写出另外两种方法的程序(提示:(1)用定义字的形式实现;(2)用直接寻址方法实现。

        DATA  SEGMENT

               A DB 5CH,85H

               B DB 43H,0ABH

        DATA  ENDS

        STACK SEGMENT STACK

               DB 10 DUP(0)

        STACK ENDS

        CODE  SEGMENT

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

        START:MOV AX,DATA

              MOV DS,AX

              MOV SI,0

              MOV AL,A[SI]

              ADD AL,B[SI]

              MOV A[SI], AL

              INC SI

              MOV AL,A[SI]

              ADC AL,B[SI]

              MOV A[SI],AL

              MOV AH,4CH

                   INT 21H

             CODE  ENDS

                    END START

步骤:

(1)、用记事本编辑程序,保存文件,命名为21.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 21.asm 汇编文件,生成21.obj文件。

  (3)、命令link 21.obj 链接文件,生成21.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 21.exe;l;u 进行反汇编,后用g命令运行。

  (5)、源程序:

方法二:

 data segment

a dw 855ch

b dw 0ab43h

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

assume ds:data,cs:stack,cs:code

start: mov ax,data

       mov ds,ax

       mov ax,b

       add a,ax

       mov ah,4ch

       int 21h

code ends

       end start

方法三:

data segment

a db 5ch,85h

b db 43h,0abh

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

assume ds:data,cs:stack,cs:code

start: mov ax,data

       mov ds,ax

       mov al,b

       add a,al

       mov al,b+1

       adc a+1,al

       mov ah,4ch

       int 21h

code ends

       end start

3、拆字程序:把偏移地址为1000H中的字内容拆开,并将高字节内容送入4001H单元,将低字节内容送到4002H单元。

步骤:

(1)、用记事本编辑程序,保存文件,命名为23.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 23.asm 汇编文件,生成23.obj文件。

  (3)、命令link 23.obj 链接文件,生成23.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 23.exe;l;u 进行反汇编,后用g命令运行,用d命令查询结果

  (5)、实验结果:

   (6)、源程序:

data segment

org 1000h

dw 1234h

org 4001h

dw ?

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

assume ds:data,cs:stack,cs:code

start: mov ax,data

       mov ds,ax

       mov bx,1000h

       mov ax,[bx]

       mov bx,4001h

       mov [bx],ah

       mov [bx+1],al

       mov ah,4ch

       int 21h

code ends

       end start

二、实验心得:

经过实验了解了顺序程序设计的基本方法,进一步明白了各类指令的应用方法。当然还发现对汇编语言命对状态标志位的影响更明确,也明确了字单元的数据在内存中时是高位高字节,低位低字节。

实验三 分支结构程序设计

一、实验内容

 1、编写程序,实现将大写字母字符串转换成小写字符串。

设:字符串的首地址为STRING,字符串的长度在LEN单元内。数据段定义如下:

DATA  SEGMENT

       STRING  DB  ‘I am a student’

LEN  EQU $-STRING

DATA  ENDS

步骤:

(1)、用记事本编辑程序,保存文件,命名为31.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 31.asm 汇编文件,生成31.obj文件。

  (3)、命令link 31.obj 链接文件,生成31.exe文件

  (4)、直接输入 31.exe 回车执行程序

  (5)、实验结果:

  (6)、源程序

data segment

string db 'I am a student'

len equ $-string

       db '$'

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

assume ds:data,cs:stack,cs:code

start: mov ax,data

       mov ds,ax

       mov bx,offset string

       mov cx,len

next:  mov al,[bx]

       cmp al,'A'

       jb  next1

       cmp al,'Z'

       ja next1

       add al,20h

       mov [bx],al

next1: inc bx

       loop next

show:  mov ah,9

       lea dx,string

       int 21h

       mov ah,4ch

       int 21h

code ends

       end start

2、从键盘输入一个字符,判断该字符时小写字母、大写字母、数字或其他字符,并给出相应的提示。

 步骤:

(1)、用记事本编辑程序,保存文件,命名为33.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 33.asm 汇编文件,生成33.obj文件。

  (3)、命令link 33.obj 链接文件,生成33.exe文件

  (4)、直接输入 33.exe 回车执行程序

  (5)、实验结果:

  (6)、源程序

data segment

ms  db 'please input any key from the keyboard!',0dh,0ah,'$'

ms1 db 'this is 0 to 9!',0dh,0ah,'$'

ms2 db 'this is A to Z!',0dh,0ah,'$'

ms3 db 'this is a to z!',0dh,0ah,'$'

ms4 db 'this is others!',0dh,0ah,'$'

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

assume ds:data,cs:stack,cs:code

start: mov ax,data

       mov ds,ax

       lea dx,ms

       mov ah,9

       int 21h

       mov ah,1

       int 21h

       cmp al,0dh

       jz exit

       cmp al,'0'

       jb  show4

       cmp al,'9'

       ja  next

       mov dx,offset ms1

       jmp show

next:  cmp al,'A'

       jb  show4

       cmp al,'Z'

       ja  next1

       mov dx,offset ms2

       jmp show

next1: cmp al,'a'

       jb  show4

       cmp al,'z'

       ja  show4

       mov dx,offset ms3

       jmp show

show4: mov dx,offset ms4

show:  mov ah,9

       int 21h

       jmp start

exit:  mov ah,4ch

       int 21h

code ends

       end start

二、实验心得

通过这次实验,了解了分支结构程序的设计方法,掌握了分支结构相关指令的用法。但也发现存在的问题,在第三题中对字符分类时,将输入字符的ASCII码与其它字符比较时费了好大劲去查各个字符的ASCII码,最后发现完全不用那么麻烦,直接把两个字符进行比较就行了,这也是由于知识点掌握不全面所致,以后会加强。

实验四 循环程序设计

一、实验内容

1、    在数据段变量名为A的数据区内有10个字符,编程实现将这10个字符以相反次序传送到附加段变量名为B的内存区中。

步骤:

(1)、用记事本编辑程序,保存文件,命名为41.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 41.asm 汇编文件,生成41.obj文件。

  (3)、命令link 41.obj 链接文件,生成41.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 41.exe;l;u 进行反汇编,后用g命令运行,用d命令查询结果

  (5)、实验结果:

(6)、源程序

data segment

a db '1234567890'

n equ $-a

b db n dup(?)

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

     assume ds:data,cs:code

start:mov ax,data

      mov ds,ax

      lea si,a

      lea di,b

      add di,n-1

      mov cx,n

move: mov al,[si]

      mov [di],al

      inc si

      dec di

      loop move

      mov ah,4ch

      int 21h

code ends

      end start

2、    数据段开始区域中,连续存放着10个无符号数,编写程序找出这10个数中最大的一个数,并将其存放到该数据区的后边。

步骤:

(1)、用记事本编辑程序,保存文件,命名为43.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 43.asm 汇编文件,生成43.obj文件。

  (3)、命令link 43.obj 链接文件,生成43.exe文件

  (4)、用命令debug 进入debug调试环境,用命令n 43.exe;l;u 进行反汇编,后用g命令运行,用d命令查询结果

  (5)、实验结果:

(6)、源程序

data segment

num db 10,20,105,0,122,45,67,23,99,100

max db ?

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

     assume ds:data,cs:code

start:mov ax,data

      mov ds,ax

      lea si,num

      mov al,num

      mov cx,10

next1: cmp al,[si]

      ja next

      mov al,[si]

next: inc si  

      loop next1

      mov max,al

      mov ah,4ch

      int 21h

code ends

      end start

二、实验心得

本次实验内容是熟悉循环结构程序的编写,明白循环结构相关指令的应用,循环语句很简单,很容易完成,但在程序中要特别注意的是程序的循环次数。但是要灵活应用循环语句,自己还有很长的路要走。

实验六  DOS中断功能调用程序设计

一、实验内容

1、编程实现由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上

  步骤:

(1)、用记事本编辑程序,保存文件,命名为61.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 61.asm 汇编文件,生成61.obj文件。

  (3)、命令link 61.obj 链接文件,生成61.exe文件

  (4)、直接输入61.exe 回车执行程序

  (5)、实验结果:

   (6)、源程序

stack segment stack

      db 100 dup(0)

stack ends

code segment

     assume cs:code

start:mov ah,1

      int 21h

      mov cx,8

next: shl al,1

      jc  show1

      mov dl,'0'

      jmp show

show1:mov dl,'1'

show: push ax;

      mov ah,2

      int 21h

      pop ax

      loop next

      mov dl,'B'

      mov ah,2

      int 21h

      mov ah,4ch

      int 21h

code ends

      end start

2、编写一程序,实现从键盘输入一个字符,判断其是不是一个数字,如果是则请输出这个数字,如果不是,请输出 “这不是一个数字” 的英文信息  

  步骤:

(1)、用记事本编辑程序,保存文件,命名为62.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 62.asm 汇编文件,生成62.obj文件。

  (3)、命令link 62.obj 链接文件,生成62.exe文件

  (4)、直接输入62.exe 回车执行程序

  (5)、实验结果:

   (6)、源程序

data segment                   

ms db 'this is not a number 0-9',0dh,0ah,'$'

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

     assume ds:data,cs:code

start:mov ax,data

      mov ds,ax

next: mov ah,1

      int 21h

      cmp al,0dh

      jz exit

      cmp al,'0'

      jb  showms

      cmp al,'9'

      ja  showms

      mov dl,al

      mov ah,2

      int 21h

      jmp next

showms:mov dx,offset ms

       mov ah,9

       int 21h

       jmp next

exit:  mov ah,4ch

      int 21h

code ends

      end start

3、从键盘键入10个字符,然后以与键入相反的顺序输出

  步骤:

(1)、用记事本编辑程序,保存文件,命名为62.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 62.asm 汇编文件,生成62.obj文件。

  (3)、命令link 62.obj 链接文件,生成62.exe文件

  (4)、直接输入62.exe 回车执行程序

  (5)、实验结果:

   (6)、源程序

data segment

info1 db 0dh,0ah,'input string:$'

info2 db 0dh,0ah,'output string:$'

str   db 20 dup(?),'$'

data ends

stack segment stack

      db 100 dup(0)

stack ends

code segment

     assume ds:data,cs:code

start:mov ax,data

      mov ds,ax

      mov cx,10

      mov dx,offset info1

      mov ah,9

      int 21h

      mov si,0

      mov di,19

next: mov ah,1

      int 21h

      mov str[si],al

      mov str[di],al

      inc si

      dec di

      loop next

      mov dx,offset info2

      mov ah,9

      int 21h

      mov dx,offset str

      add dx,10

      mov ah,9

      int 21h

      mov ah,4ch

      int 21h

code ends

      end start

二、实验心得

在本次实验中发现对自己对DOS中断功能调用很不熟悉,对各个功能调用入口和出口参数没记清楚,导致了很多错误。在排除这些错误之后发现调用9号功能输出要求字符串后还会跟随很多乱码,最后经过看书才知道9号功能要输出的字符串后必须以“$”结尾。而且编写的程序输入字符时输入一个就结束了,最后经反复改进才可以多次输入。

实验八 存储器扩展实验

一、实验内容

1、使用一片61C256(32K),作为片外扩展的数据存储器,按图8.1流程编写一程序,实现对其进行读、写验证操作。

说明:试验箱已配有一片作为实验程序空间,地址从0000:0000H~7FFFH

2、硬件连接线路图

微机原理实验报告  

3、步骤:

(1)、用记事本编辑程序,保存文件,命名为8.asm(注:文件后缀为asm)

  (2)、在dos系统环境下用命令masm 8.asm 汇编文件,生成8.obj文件。

  (3)、命令link 8.obj 链接文件,生成8.exe文件

  (4)、按照原理图连接电路

  (5)、把8.exe文件装载到试验箱内存

  (6)、运行程序后,刷新8000h后的存贮单元,应为程序中所置的测试数据

  (7)、源程序

code segment

org 1000h

assume cs:code

start:  mov al, 12h

        mov cx,1000h

        mov bx,8000h

next:   mov [bx],al

        inc bx

        loop next

        mov ah,4ch

        int 21h

code   ends

       end start

二、实验心得:

本次完成的存储器扩展实验重点在于扩展电路的连接,但本实验只需进行一片存储器扩展,比较简单,而且测试程序也十分简单,只是实验系统很不稳定,容易出现故障,即使一切操作都正确,也得经反复多次尝试才能成功。

相关推荐