微机原理及汇编语言
程序设计
实验指导书
计算机实验中心
目 录
实验一 DEBUG的使用………………………………………3
实验二 数制转换程序……………………………………8
实验三 数组排序程序……………………………………10
实验四 数据的输入与输出程序…………………………11
实验五 子程序设计………………………………………12
实验六 宏调用程序设计…………………………………14
【实验目的】
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.写出宏调用心得体会。
实验报告实验名称专业班级信息安全学号姓名实验一汇编语言上机过程和Debug常用调试命令一实验目的学习程序设计的基本方法和技能熟练掌…
汇编语言实验报告题目1实验方法2用表格形式显示字符3分类统计字符个数4查找电话号码学生学院计算机学院专业班级06学号31学生姓名指…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
汇编语言程序设计实验报告实验室S318最后一次实验时间20xx年5月18日第12周星期二12节学院计算机科学与技术学院专业计算机科…
计算机组成原理实验报告计算机组成原理实验报告1计算机组成原理实验报告一实验目的1掌握微程序控制器的组成原理2掌握微程序的编制写入观…
微机原理与接口技术课程设计报告交通灯控制系统班级学号姓名成绩20xx年7月1日1目录1课程设计的目的和要求32系统的主要功能作用及…
《微机原理与接口技术》课程设计报告交通灯控制系统班级:学号:姓名:指导教师:成绩:20##年7月1日目录1、课程设计的目的和要求3…
微机原理课程设计设计任务及要求交通信号灯的控制通过8255A并口来控制LED发光二极管的亮灭A口控制红灯B口控制黄灯C口控制绿灯输…
微机原理及接口技术课程设计报告题目竞赛抢答器的设计学院中北大学信息与通信工程专业小组成员指导教师丁永红20xx年06月23日1设计…