微机原理及汇编语言程序设计实验指导书

微机原理及汇编语言

程序设计

实验指导书

计算机实验中心

   

实验一   DEBUG的使用………………………………………3

实验二  数制转换程序……………………………………8

实验三  数组排序程序……………………………………10

实验四  数据的输入与输出程序…………………………11

实验五  子程序设计………………………………………12

实验六  宏调用程序设计…………………………………14

实验一   DEBUG的使用

【实验目的】

1.学习使用DEBUG调试程序的各种命令。

2.掌握8088/8086指令系统---数据传送指令、算术指令。

3.掌握用DEBUG调试程序的方法。

4.掌握8088/8086 CPU寄存器的用途和存储器组织及它们之间的关系。

5.掌握内存操作数及寻址方法。

6.掌握汇编语言伪操作:BYTE PTR,WORD PTR。

7.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。

8.掌握数据传送、算术运算、BCD码调整和循环指令的用法,掌握字符显示的方法。

【实验性质】

验证性实验(学时数:2H)

【实验内容】

一、DEBUG 命令的使用

1.敲 DEBUG 进入 DEBUG 环境,显示提示符 '_ '。

2.用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。

3.用命令 E100 30 31 32 …… 3F 将30H~3FH写入地址为100H开始的内存单元

中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?

4.用命令 F100 L0F 'A' 将'A'的ASCII码填入内存,用D命令查看结果。

5.用命令 F110 11F 41 将41H 填入内存,用D命令观察结果并比较。

6.用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF

的内容。

7.用R命令将AX,BX内容改写为1234H及5678H。

8.用H命令检查下列各组16进制数加减结果并和你的手算结果比较:

(1)34H,22H (2)56H,78H (3)A5,79H  (4)1284H,5678H  (5)A758,347FH

二、8088/8086常用指令练习

1.传送指令

1)用A命令在内存100H处键入下列内容:

MOV       AX,1234

MOV       BX,5678

XCHG      AX,BX

MOV       AH,34

MOV       AL,56

MOV       CX,75AB

XCHG      AX,CX

2)用U命令检查键入的程序,特别注意左边的机器码。

3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。

2.加减法指令:

1)用A命令在内存200H处键入下列内容:

MOV       AH,34

MOV       AL,2E

ADD       AL,AH

SUB       AL,78

MOV       CX,1234

MOV       DX,5678

ADD       CX,DX

SUB       CX,AX

SUB       CX,CX

2)用U命令检查键入的程序及对应的机器码。

3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。

思考题:

 这次运行还是打入T,行不行?如何单步运行上述小程序?用R命令检查一下IP的内容。注意T命令与IP的关系。

3.带进位加减法:

1)用A命令在内存300H处键入下列内容,并用U命令检查:

MOV       AH,12

MOV       AL,89

MOV       CH,56

MOV       CL,98

ADD       AL,CL

ADC       AH,CH

MOV       DH,A7

MOV       DL,58

SUB       DL,7F

SBB       DH,34

2)用T命令逐条运行这些指令,检查并记录有关寄存器及CF内容。

3)上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。

4.BCD码加减法

1)内容:

MOV       AL,58

ADD       AL,25

DAA

2)要求:用A 命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。

三、内存操作数及各种寻址方式使用:

1)用A命令在内存400H处键入下列内容,并用U命令检查:

              MOV   AX,1234

       MOV   [1000],AX

       MOV   BX,1002

       MOV   BYTE PTR[BX],20

       MOV   DL,39

       INC   BX

       MOV   [BX],DL

       DEC   DL

       MOV   SI,3

       MOV   [BX+SI],DL

       MOV   [BX+SI+1],DL

       MOV   WORD PTR[BX+SI+2],2846

2)用T命令逐条运行这些指令,每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。

注意:D命令显示结果中右边的ASCII字符及双字节数存放法。

思考题: 有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。

四、DEBUG环境下汇编运行程序方法

用A命令汇编程序,编程完成将DS:1000开始的10个字节的内存单元的内容相加,并把相加结果存放在DS:100A 内存单元中,用DEBUG调试运行该程序,并察看运行结果。

内容:

     MOV CX,0AH

     MOV AL,0

     MOV BX,1000

LL:  ADD AL,[BX]

     INC BX

     DEC CX

     JNZ LL

     MOV [BX],AL

     INT 3

步骤:

1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LL的实际地址,在键入JNZ指令时LL用实际地址值代替。

2)用U命令检查键入的程序及对应的机器码。

3)用E1000 01 02 03 04 05 06 07 08 09 0A将1000H开始的前10个内存单元的内容修改为01,02,03,04,05……0A,用D命令查看修改结果。

4)用T命令逐条运行上述小程序指令,检查并记录有关寄存器、存储单元内容及ZF情况。

5)用F2000  L0A 02 03 04 05 ……0B 将1000H开始的10 个内存单元的内容修改为02,03,04,05……0B。用D命令查看修改结果。

6)用G=100 全速运行上述小程序,用D1000 100F 查看运行结果。

思考题

 可否随意在DEBUG提示符“-”后不带参数发出命令G?什么情况下使用命令G时,可不用“=”给出执行的首地址?

五、两个多位十进制数相加

要求:将下面程序在汇编平台下,完整地进行汇编、连接、运行,然后用DEBUG软件调入可执行文件到内存,用反汇编命令查看实际程序及数据区内容,用t命令逐条执行,以观察各寄存器及数据区内存的数据变化情况,然后使用p命令和g命令执行,以观察执行过程有何特点。

将两个5位十进制数相加,要求被加数(本题选47193)和加数(本题选28056)均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回以DATA3为首的5个内存单元中(低位在前),并显示相加的结果。

实验程序和结果如下:

DATA    SEGMENT

DATA1   DB 33H,39H,31H,37H,34H   ;存放被加数47193,ASCII码形式,低位在前

DATA2   DB 36H,35H,30H,38H,32H   ;存放加数28056,ASCII码形式,低位在前

DATA3   DB 5 DUP(?)              ;留出5个存放结果的单元

DATA    ENDS

CODE    SEGMENT

        ASSUME  CS:CODE,DS:DATA

START:  MOV AX,DATA

        MOV DS,AX

        MOV CX,5                 ;循环次数置5,5个位要相加5次

        MOV SI,0                 ;SI放地址位移量,每个数的第一字节地址位移量为0

        CLC               ;CF清0,防止第1个字节相加时ADC指令多加CF中可能的1

NEXT:   MOV AL,DATA1[SI]    ;取被加数一个字节送AL,DATA1偏移地址+SI为有效地址

        ADC AL,DATA2[SI]  ;AL+加数对应字节+CF(低位相加时可能的进位)结果送AL

        AAA                ;AL中两字节相加的和调整成非压缩的BCD码,进位在CF中

        MOV DATA3[SI],AL         ;结果送入DATA3对应字节单元中

        INC SI                   ;地址位移量加1指向高一位字节单元

        LOOP NEXT                ;5次未到,继续循环

        MOV SI,5               ;显示5个位,SI中的数既是循环次数又作地址位移量

DISP:   ADD DATA3[SI-1],30H   ;将结果从高位单元开始把非压缩的BCD码变成ASCII码

        MOV DL,DATA3[SI-1]       ;将ASCII码送DL以满足2号功能调用的规定要求

        MOV AH,2                 ;功能号送AH

        INT 21H                  ;调用2号功能,显示一位数字

        DEC SI                   ;次数减1

        JNZ DISP                 ;5次未到,继续循环

        MOV AH,4CH               ;功能号送AH

        INT 21H                  ;调用4CH号功能,返回DOS

CODE    ENDS

        END START

运行结果:

75249

思考题:

1.上述程序只显示了相加的结果,没有显示被加数和加数,如果在上述程序的基础上将显示格式改为47193+28056=75249,则程序如何修改?

2.上述程序没有考虑运算结果最高位有进位的情况,如果考虑可能产生的进位,则要显示完整的结果,程序如何修改?(提示:INC和LOOP指令均不影响CF)

【报告要求】

1.列出8086常用指令练习部分的逐条运行记录。

2.列出DEBUG下调试运行小程序的运行步-------------------运行结果。

3.回答思考题。

附:

DEBUG 命令

1.打 DEBUG 进入 DEBUG,显示提示苻 '_ '。

2.退出DEBUG命令:Q

3.显示内存命令:D 起始地址 结束地址

4.修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。

5.检查寄存器命令:R

标志位显示    1      0

CF     CY     NC

ZF     ZR     NZ

SF     NG     PL

AF     AC     NA

OF     OV     NV

PF     PE     PO

DF     DN     UP

IF     EI     DI

6.修改寄存器命令:R 寄存器名

7.小汇编命令:A 起始地址,不输入指令打回车键退出A命令。

8.反汇编命令:U 起始地址 结束地址

9.文件命名命令:N 盘号:文件名

10.读文件命令:L 内存地址

11.写文件命令:W 内存地址

10.读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数

11.写扇区命令:W 内存地址 盘号 扇区号 扇区数

12.运行命令:G=起始地址 结束(断点)地址

13.单步命令:T=起始地址 运行指令数,进入子程序内部。

14.单步命令:P=起始地址 运行指令数,不进入子程序内部。

15.内存搬家命令:M 起始地址 结束地址 目的地址


实验二  数制转换程序

【实验目的】

1.掌握汇编语言程序结构。

2.掌握建立、汇编、链接、调试和运行汇编程序的过程。

3.掌握DOS功能调用 INT 21H 02号功能字符显示输出方法。

4.掌握INT 21H 4C号功能返回系统的方法。

【实验性质】

验证性实验(学时数:2H)

【实验内容】

一、完成一个十六位二进制数到十六进制数的转换操作程序设计。

参考程序:

;将二进制数一边转换成十六进制数一边显示(用2号功能调用)

DATA    SEGMENT

BUFA    DW  1111001000110100B       ;F234H

DATA    ENDS

CODE    SEGMENT

        ASSUME CS:CODE,DS:DATA

BEG:    MOV AX,DATA

        MOV DS,AX

        MOV DX,BUFA

        MOV CH,4        ;循环控制十六进制数显示位数

        MOV CL,4       

ROTATE: ROL DX,CL       ;循环左移4位,将高位十六进制数移到低位

        MOV BX,DX       ;保护移动后的数

        AND DX,0FH      ;屏蔽掉高位保留该低位数

        CMP DL,9

        JG L

        ADD DL,30H      ;转换成ASCII码

        MOV AH,2        ;送显示

        INT 21H

        JMP NEXT

L:      ADD DL,37H

        MOV AH,2

        INT 21H

NEXT:   MOV DX,BX

        DEC CH

JNZ ROTATE

        MOV AH,4CH

        INT 21H

CODE    ENDS

        END START

二、把上题改造成COM文件的编程格式,汇编、链接和运行调试该程序。

参考程序:

CODE    SEGMENT

        ASSUME CS:CODE

        ORG 100H

BEG:    JMP START

BUFA    DW  0001001000110100B       ;1234H(用户程序数据区)

START:  MOV DX,BUFA

        MOV CH,4        ;循环控制十六进制数显示位数

        MOV CL,4       

ROTATE: ROL DX,CL       ;循环左移4位,将高位十六进制数移到低位

        MOV BX,DX       ;保护移动后的数

        AND DX,0FH      ;屏蔽掉高位保留该低位数

        CMP DL,9

        JG L

        ADD DL,30H      ;转换成ASCII码

        MOV AH,2        ;送显示

        INT 21H

        JMP NEXT

L:      ADD DL,37H

        MOV AH,2

        INT 21H

NEXT:   DEC CH

        MOV DX,BX

        JNZ ROTATE

        MOV AH,4CH

        INT 21H

CODE    ENDS

        END BEG

三、参照上述程序完成一个十六位二进制数到十进制数的转换操作程序设计。

四、加分题:完成从键盘输入一个任意十六位二进制数到十六进制数的转换操作程序设计。

提示:在数据区定义19个字节的字符串区,用INT  21H 的10#功能,进行字符串输入,判断实际输入的字节数是否为16个,每个字节的内容是否为30H或31H,不是,则提示重新输入或退出,是,则把该区域的16个ASCII码30H、31H的字符从低位到高位(或相反顺序)转换成1010110101110111的形式,用上述程序进行转换输出。

思考题

1)若在源程序中把INT 21H的'H'省去,会产生什么现象?

2)把 INT 21H 4CH号功能改为 INT 20H,行不行?

3)从键盘输入的二进制ASCII字符串,在转换成十六进制数据时,有哪几大步骤?

【实验要求】

1.列出自编程序的程序清单,并加适当注释。

2.写出汇编,连接及调试程序时产生的错误,其原因及解决办法。

3.总结EXE文件和COM文件的编程格式。

4.回答思考题。


实验三  数组排序程序

【实验目的】

1.循环控制条件的设计。

2.存储器操作数的寻址方式。

3.对内存的数据处理方法。

【实验性质】

验证性实验(学时数:3H)

【实验内容】

    1、在内存缓冲区存放10个无序整数,按照从小到大的顺序进行排序,用debug查看排序结果。

参考程序:

DATA    SEGMENT

ST_AD   DW 23,78,45,99,128,64,32,200,1,0

DATA    ENDS

PROGRAM SEGMENT

MAIN    PROC FAR

        ASSUME CS:PROGRAM,DS:DATA

START:  PUSH DS

        SUB AX,AX

        PUSH AX

        MOV AX,DATA

        MOV DS,AX

        MOV CX,10

        DEC CX

LOOP1:  MOV DI,CX

        MOV BX,0

LOOP2:  MOV AX,ST_AD[BX]

        CMP AX,ST_AD[BX+2]

        JGE COTINUE

        XCHG AX,ST_AD[BX+2]

        MOV ST_AD[BX],AX

COTINUE:ADD BX,2

        LOOP LOOP2

        MOV CX,DI

        LOOP LOOP1

        RET

MAIN    ENDP

PROGRAM ENDS

        END START

2、加分题:从键盘输入10个无序10进制整数,对这10个数进行排序,将排序后的结果送屏幕显示。

3、加分题:从键盘输入一个10进制整数,插入前面已整序的10个数中,要求插入后的11个数也是整序好的,将插入后的结果送屏幕显示。

【报告要求】

1.给出该程序的流程图。

2.给出调试通过的自编程序清单和调试记录

3.写出实验体会。


实验四  数据的输入与输出程序

实验目的

1.掌握键盘输入字符的方法和十六进制数字字符的ASCII码转换为二进制数的原理。

2.掌握子程序定义和调用的方法。

3.掌握循环移位指令的用法和无符号数比较大小的方法。

【实验性质】

验证性实验(学时数:2H)

实验内容

从键盘上输入4位十六进制数,将其转换为16位二进制数并在显示器上显示出来。要求输入的数字字符串以回车键结束。如果输入的数字超过4个,则以最后输入的4个为准。若按下的键不是十六进制数字字符,则显示出错信息。

参考程序:

实验提示

从键盘上输入的十六进制数字字符进入计算机后并不是相应的十六进制数或二进制数,而是与字符对应的ASCII码,现要找出ASCII码与该数字对应的二进制数之间的关系。关系如下:

【报告要求】

1.给出该问题的程序设计流程图。

2.给出该程序的全部代码,并加上注释。

3.总结实验体会。


实验五 子程序设计

【实验目的】

掌握一般子程序的调用和返回方法,掌握定义过程的伪指令的用法。

【实验性质】

设计性实验(学时数:3H)

【实验内容】

1、完成两个四位十进制数相加的程序设计,形式为:2345+7869=10214

(1)要求所有中断调用全部采用子程序的形式完成。

(2)要求考虑进位位。完善程序并调试通过。

(3)仿照下述程序,完成八位十进制数相加的程序设计。要求考虑进位位。完善程序并调试通过。

参考程序:

DISP    MACRO VAR

        MOV AH,2

        MOV DL,VAR

        INT 21H

        ENDM

DATA    SEGMENT

STR1    DB 'PLEASE INPUT A NUMBER (EXP:2345)$'

STR2    DB 'PLEASE INPUT ANOTHER NUMBER(EXP:7868)$'

STR3    DB  0DH,0AH,'$'

BUF1    DB  10,?,11 DUP(?)

BUF2    DB  10,?,11 DUP(?)

BUF3    DB  4 DUP(?),'$'

DATA    ENDS

CODE    SEGMENT

    ASSUME CS:CODE,DS:DATA

BEGIN:  MOV AX,DATA

        MOV DS,AX

        MOV DI,OFFSET STR1

        CALL DISPL             ;SHOW 'PLEASE INPUT NUMBER1:'

        MOV DI,OFFSET BUF1

        CALL GETNUM            ;GET NUMBER1 FROM KEYBOARD

        MOV DI,OFFSET STR3

        CALL DISPL             ;CRLF

        MOV DI,OFFSET STR2

        CALL DISPL             ;SHOW 'PLEASE INPUT NUMBER2:'

        MOV DI,OFFSET BUF2

        CALL GETNUM            ;GET NUMBER2 FROM KEYBOARD

        MOV DI,OFFSET STR3

        CALL DISPL             ;CRLF

        XOR BX,BX

        MOV BL,BUF1+1

        MOV BUF1+2[BX],'$'     ;BEHIND NUMBER1 ADD '$'

        MOV DI,OFFSET BUF1+2

        CALL DISPL             ;SHOW NUMBER1

        DISP '+'               ;SHOW '+'

        XOR BX,BX

        MOV BL,BUF2+1

        MOV BUF2+2[BX],'$'     ;BEHIND NUMBER2 ADD '$'

        MOV DI,OFFSET BUF2+2

        CALL DISPL            ;SHOW NUMBER2

        DISP '='              ;SHOW '='

        LEA SI, BUF1+2 

        LEA DI, BUF2+2

        CALL DAAD             ;ADD NUMBERS

        MOV DI,OFFSET BUF3

        CALL DISPL            ;SHOW RESULT

        MOV AH,4CH            ;RETURN DOS

        INT 21H

DAAD    PROC NEAR             ;SUBPROCESS OF ADD

        MOV BX,4

N1:     MOV AL,[SI+BX-1]

        ADC AL,[DI+BX-1]

        AAA

        ADD AL,30H

        MOV BUF3[BX-1],AL

        DEC BX

        JNZ N1

        RET

DAAD    ENDP

DISPL   PROC NEAR          ;SUBPROCESS OF DISPLAY

        MOV AH,9

        MOV DX,DI

        INT 21H

        RET

DISPL   ENDP   

GETNUM  PROC NEAR         ;SUBPROCESS OF GETNUM

        MOV AH,0AH

        MOV DX,DI

        INT 21H

        RET

GETNUM  ENDP

CODE    ENDS

        END BEGIN

2、加分题:根据输入的运算符来实现+、-、*、/ 四则运算,并考虑进位。做除运算时,应考虑除数为0。

【实验要求】

1.设计一个子程序,完成将缓冲区中的两个四位十进制数据送屏幕显示功能。

2.设计一个子程序,完成从键盘输入两个四位十进制数的加法操作程序设计。

3.设计一个子程序,完成两个八位十进制数作的加法运算操作程序设计。

4.设计一个子程序,完成两个四位十进制数作四则运算操作。运算要求从键盘输入。

【报告要求】

1.给出该程序设计的方案步骤。

2.列出自编程序清单并加注释。

3.写出心得体会。


实验六  宏调用程序设计

【实验目的】  

1.熟悉宏定义的一般结构。

2.掌握宏指令的编写方法和调用方法。

3.能区别宏调用和子程序调用的不同之处。

4.了解LOCAL伪操作的用法。

5.熟悉无参数宏指令和有参数宏指令的定义与调用。

【实验性质】

验证性实验(学时数:2H)

【实验内容】

1.设计一个子功能,完成显示一串文字信息。

2.设计一个子功能,能实现多个字或字节10进制数据连加或连减的功能。要求多字节10进制数据从屏幕输入。加或减按实际输入的符号决定。

参考程序:

BIN_SUB MACRO A,RESULT,N      ;宏定义实现数的连减

        PUSH AX

        PUSH BX

        PUSH CX

        LEA BX,A

        MOV CX,N

        DEC CX

        MOV AX,WORD PTR[BX]

L:      SUB AX,WORD PTR[BX+2]

        ADD BX,2

        LOOP L

        MOV RESULT,AX

        POP CX

        POP BX

        POP AX

        ENDM

DEC_DIV MACRO N,BX           ;宏定义实现二进制到十进制数转换并显示

        MOV AX,BX

        MOV CX,N

        MOV DX,0

        DIV CX

        MOV BX,DX

        MOV DL,AL

        ADD DL,30H

        MOV AH,2

        INT 21H

        ENDM

DATA    SEGMENT

BUFF    DW 0F000H,1111H,2222H,3333H,4444H,1111H

RESULT  DW ?

DATA    ENDS

CODE    SEGMENT

MAIN    PROC FAR

    ASSUME CS:CODE,DS:DATA

START:  PUSH DS

        SUB AX,AX

        PUSH AX

        MOV AX,DATA

        MOV DS,AX

        BIN_SUB BUFF,RESULT,6

        MOV BX,RESULT

        CALL BINIDEC 

        RET

MAIN    ENDP

BINIDEC PROC NEAR             ;定义子程序实现“除法取商”法

        DEC_DIV 10000D,BX

        DEC_DIV 1000D,BX

        DEC_DIV 100D,BX

        DEC_DIV 10D,BX

        DEC_DIV 1D,BX

        RET

BINIDEC ENDP

CODE    ENDS

        END START 

【实验要求】

1.列出自编程序清单并加注释。

2.写出宏调用心得体会。

相关推荐