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

更新时间:2023-07-17 06:45:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

此文档是上海工程技术大学的微机课的三个实验,有的部分有

《微机原理与汇编语言程序设计》

实验指导书

上海工程技术大学 电子电气工程学院

此文档是上海工程技术大学的微机课的三个实验,有的部分有

目 录

实验一 80x86汇编编程环境和工具实验………………………… 1 实验二 80x86指令系统实验……………………………………… 4实验三 80x86汇编编程方法和技巧实验………………………… 7

此文档是上海工程技术大学的微机课的三个实验,有的部分有

实验一 80x86汇编编程环境和工具实验

一、实验目的

1 、掌握汇编语言开发环境和DEBUG的基本命令 2 、掌握Intel 80X86的寻址方式

二、实验环境

1 、硬件:Intel 80X86 2 、软件:DEBUG

三、实验内容

1 、查看内存中的数据

使用Debug的D命令查看微型计算机主板ROM中写有生产日期,在内存FFF00H-FFFFFH的某几个单元中,找到这个生产日期并试图改变它,记录操作过程和结果; 2 、修改内存中的数据

使用Debug的E命令向内存B8100H开始的单元依次写入以下数据,观察产生的结果并记录操作过程和结果:

B8100H-B8107H:41 01 42 02 43 03 44 04 3 、查看内存中的指令

使用Debug的U命令查看8086上电复位后执行的第一条指令的内容,8086上电复位后执行的第一条指令地址为FFFF0H,试用Debug的A命令改变存储器地址FFFF0H上的指令,记录操作过程和结果,观察是否能改变8086上电复位后执行的第一条指令;

1 )使用E命令将以下数据依次写入内存空间(200B0H-200BFH),并截图记录写入后的内存相关地址上的内容(数据):

200B0H-200BFH:62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88 2 )使用A命令将以下指令写入内存空间(起始地址:200CH:0004H),并截图记录写入后的内存相关地址上的内容(指令):

MOV AX,200B MOV DS,AX

此文档是上海工程技术大学的微机课的三个实验,有的部分有

ADD AL,[0004] ADD AX,[0004]

ADD BYTE PTR [0006],9C ADD WORD PTR [0006],9C MOV BX,000A MOV AL,[BX] MOV AX,3[BX] MOV SI,0001 MOV AH,[SI+5] MOV AX,2[BX][SI] JMP 0004

3 )使用R命令将CS设置为200CH,IP设置为0004H,然后使用T命令进入单步调试状态,观察指令的执行情况,写出指令的执行序列、每条指令的寻址方式和每条指令执行前后相关寄存器和存储器(以字节为单位)的变化情况;

四、实验结果

1 、查看内存中的数据

Debug相关命令和写入前后的截图 2 、修改内存中的数据

Debug相关命令和写入后的结果截图 3 、查看内存中的指令

Debug相关命令和第一条指令内容截图

4 、使用Debug工具将以下数据和指令写入内存并观察运行结果 1 )使用E命令将以下数据依次写入内存空间(200A0H-200BFH),并截图记录写入后的内存相关地址上的内容(数据):

Debug相关命令和写入后的结果截图

2 )使用A命令将以下指令写入内存空间(起始地址:200CH:0004H),并截图记录写入后的内存相关地址上的内容(指令):

Debug相关命令和写入后的结果截图

3 )使用R命令将CS设置为200CH,IP设置为0004H,然后使用T命令进入单步调试状态,观察指令的执行情况,写出指令的执行序列、每条指令的寻址方式和每条指令执行前后相关寄存器和存储器(以字节为单位)的变化情况:

此文档是上海工程技术大学的微机课的三个实验,有的部分有

五、实验思考

1 、通常使用Debug工具的T命令,会使CPU执行当前指令后停止继续执行并显示当前CPU各个寄存器的状态和下一条要执行的指令,而当使用它执行修改堆栈段寄存器的指令如mov ss,ax时,却不是这样,它的下一条指令如mov sp,10紧接着也执行了,想想这是为什么? 2 、结合使用Debug工具的T命令和D命令,观察指令mov ss,ax执行前后,内存中栈中的数据是否会发生改变?如果会,为什么?

此文档是上海工程技术大学的微机课的三个实验,有的部分有

实验二 80x86指令系统实验

一、实验目的

1 、进一步熟悉汇编语言开发工具和环境

2 、掌握在微机上开发汇编语言程序的过程和方法 3 、学会使用8086的相关指令设计简单的应用程序

二、实验环境

1 、硬件:Intel 80X86

2 、软件:MASM, LINK, DEBUG或emu8086

三、实验内容

1 、屏幕显示程序

使用数据传送指令编写程序,在80×25屏幕上的不同位置上用不同的颜色显示自己的学号(如“0211XXXXX”)、姓名拼音(如“Zhang San”)和字符串“Hello World!”;

此文档是上海工程技术大学的微机课的三个实验,有的部分有

2 、堆栈操作程序

堆栈操作程序如下所示,写出每条指令执行后相关寄存器和存储器相关单元的变化情况 CODESEG SEGMENT

ASSUME CS:CODESEG START: ;entry MOV AX,CS MOV SS,AX MOV SP,0 MOV AX,1234H MOV BX,0FEDCH PUSH AX PUSH BX POP AX

POP BX

EXIT: ; exit to operating system MOV AX, 4C00h INT 21h CODESEG ENDS

END START 3 、算术运算程序

1 )使用加法及其相关指令编写程序,分别求出以下四个十六进制数和十六进制数62A0H的和,将结果依次保存在寄存器AX、BX、CX和DX中,并根据结果设置标志位ZF/SF/CF/OF,由此判断每个运算分别作为无符号数运算和有符号数运算的结果有效性

①1234H ②9D60H ③CFH ④21H

2 )使用减法及其相关指令编写程序,分别求出以下四个十六进制数和十六进制数4AE0H的差,将结果依次保存在数据段的字变量Z1、Z2、Z3和Z4中,并根据结果设置标志位ZF/SF/CF/OF,由此判断每个运算分别作为无符号数运算和有符号数运算的结果有效性

①1234H ②EA04H ③90H ④5DH 数据段的定义如下所示

DATASEG SEGMENT Z1 DW ? Z2 DW ? Z3 DW ? Z4 DW ?

此文档是上海工程技术大学的微机课的三个实验,有的部分有

3 )使用乘法指令编写程序,求两个十进制数10001和101的积,并将结果保存在数据段的双字变量PRODUCT中

数据段的定义如下所示

DATASEG SEGMENT PRODUCT DD ? DATASEG ENDS 4 )使用除法指令编写程序,分别计算数据段第一个数除以第三个数和第二个数除以第三个数的结果,并将第一次和第二次运算的结果分别保存在数据段的变量R1(余数)、Q1(商)和R2(余数)、Q2(余数)中 数据段的定义如下所示

DATASEG SEGMENT

DD -100001 DD 100001 DW 100

R1 DW ? Q1 DW ? R2 DW ? Q2 DW ? DATASEG ENDS

4 、逻辑和移位运算程序

1 )使用逻辑和移位运算指令编写程序,依次完成以下寄存器操作:

①将段寄存器CS和DS的值分别送入通用寄存器AX和BX ②将AL的高4位清零,其他位不变 ③将BL的低4位置位,其他位不变

④将BH的第4、7位置位,第0、2位清零,第1、5位取反,其他位不变

⑤将AH的高4位和低4位分别送入DH和DL的低4位,并将DH和DL的高4位清零 2 )使用加法和移位运算指令编写程序:

计算AX←AL×13(其中:寄存器AL值被看作8位无符号数;13是十进制数)

四、实验程序 1 、屏幕显示程序 (附代码) 2 、堆栈操作程序 (附代码) 3 、算术运算程序

此文档是上海工程技术大学的微机课的三个实验,有的部分有

1 )加法

(附代码) 2 )减法

(附代码) 3 )乘法

(附代码) 4 )除法

(附代码) 4 、逻辑运算程序

1 )使用逻辑和移位运算指令编写程序,依次完成以下寄存器操作 (附代码)

2 )使用加法和移位运算指令编写程序,计算AX←AL×13 (附代码)

五、实验结果

3 、算术运算程序

1 )加法

此文档是上海工程技术大学的微机课的三个实验,有的部分有

通过计算验证程序运行结果的正确性

10001×101=? 4 )除法

使用debug或emu8086显示存储器中保存除法运算结果的变量R1、Q1、R2和Q2的内容并截图,通过计算验证程序运行结果的正确性

-100001∕+100=? 100001∕ 100=? 4 、逻辑运算程序

1 )使用逻辑和移位运算指令编写程序,依次完成以下寄存器操作 (附程序运行后CPU寄存器结果截图【Debug的R命令】) 2 )使用加法和移位运算指令编写程序,计算AX←AL×13 (附程序运行后CPU寄存器结果截图【Debug的R命令】)

六、实验思考

1 、使用Debug的T命令和P命令调试程序(如遇到INT 21h等指令)时,有何区别? 2 、使用Winhex软件观察由汇编语言源程序编译链接后生成的exe文件的内容,然后使用debug或emu8086观察该exe文件被command.exe加载后其在内存中的映像,比较两者异同? 3 、使用加法和移位运算指令编写程序,计算DX:AX←AX×13(其中:寄存器AX值被看作有符号字数据;13是十进制数,并且运算结果的高16位和低16位分别存放在DX和AX中)

此文档是上海工程技术大学的微机课的三个实验,有的部分有

实验三 80x86汇编编程方法和技巧实验

一、实验目的

1 、学会顺序、分支和循环结构设计汇编程序 2 、掌握子程序设计

二、实验环境

1 、硬件:Intel 80X86

2 、软件:MASM, LINK, DEBUG或emu8086

三、实验内容

1 、顺序结构程序: 1 )数值计算程序

① 编写程序,完成以下计算:(120 - C + A * B) / C,并把所得的商和余数分别保存在X和Y中。

数据段设计如下: DATASEG SEGMENT A DW 300 B DW -300 C DW 200 X DW ? Y DW ?

2 、分支结构程序: 1 )成绩判断程序

此文档是上海工程技术大学的微机课的三个实验,有的部分有

编写程序,判断数据段DSEG中的中年份变量YEAR(取值0-25000)是否是闰年,如果是闰年,则CX=1;否则CX=0。

3 )将以下C语言程序改写成对应的汇编语言程序,并使用debug或emu8086工具观察程序运行结果

short a=32,b=0xFFF0,c=-9; void main() {

if (a+b > 0 && c%3 == 0)

a = 62; else

a = 21;

}

3 、循环结构程序: 1 )内存数据计算程序

编写程序,计算存储器从地址FFFFH:0000H到FFFFH:000BH所有字节单元数据的校验和(校验和是不计进位的累加,长度1个字节,结果保存在DL) 2 )字符串空格数统计程序

编写程序,统计以00H为结束符地址为ASCII_STR的字符串长度以及字符串中小写字母“o”的个数(结果分别保存在寄存器CX和数据段DATASEG的字节变量O_NUM中)

DATASEG SEGMENT

ASCII_STR DB “Hello, Our World for today!”, 0 O_NUM DB ? DATASEG ENDS 3 )复制代码程序

此文档是上海工程技术大学的微机课的三个实验,有的部分有

1 )数的阶乘 ① 编写子程序

子程序名:FACTORIAL

实现功能:计算n!(1≤n≤5) 入口参数:BL(n)

② 使用该子程序,计算1!+2!+ +5!并将其保存在数据段DSEG的字变量RESULT中 2 )屏幕显示 ① 编写子程序

子程序名:LCD_DISPSTR

实现功能:从80列×25行屏幕的某行某列开始显示某个固定长度的字符串 入口参数:DX(DH:屏幕输出起始行[0-24]∕DL:屏幕输出起始列[0-79])

SI(字符串地址),CX(字符串长度)

出口参数:无 ② 使用该子程序在80列×25行的屏幕四角上显示“hello world!”,如下图所示:

3 )数值显示 ① 编写子程序

子程序名:BTOC

实现功能:将二进制形式的字节数据(0-255)转换为十进制形式的字符串 入口参数:AL(二进制形式的字节数据)

② 使用该子程序、数的阶乘子程序和屏幕显示子程序,从屏幕的第24行第0列开始显示1!+2!+ +5!的运算结果 4 )选择排序 ① 编写子程序

子程序名:MIN

实现功能:找出以00H为结束符全部由小写字母组成的字符串中最小的字母 入口参数:SI(字符串地址)

出口参数:AL(字符串中最小的字母),BX(最小的字母在数组中的位置:0∽len-1)

此文档是上海工程技术大学的微机课的三个实验,有的部分有

② 使用该子程序,应用选择排序法按字母顺序由小到大排序字符串STR

DSEG SEGMENT

STR1 DB "lbzxkhag",00h DSEG ENDS

③ 使用该子程序和屏幕显示子程序,从屏幕的第0行第0列开始显示排序后的字符串STR

五、实验结果

1 、顺序结构程序:

截图保留程序运行后的结果(使用debug或emu8086查看数据段中有符号字变量X和Y的值,并写出它们所表示的十进制数值) 2 、分支结构程序: 1 )成绩判断程序

截图保留程序运行后的结果(使用Debug或emu8086查看寄存器DX) 2 )闰年判断程序

截图保留程序运行后的结果(使用debug或emu8086查看寄存器CX)

3 )将以下C程序改写成对应的汇编程序,并使用debug或emu8086观察程序运行结果 截图保留程序运行后的结果(使用debug或emu8086查看数据段中变量a) 3 、循环结构程序: 1 )内存数据计算程序

使用debug或emu8086截图保留程序运行前后的结果

——运行前,查看存储器相关地址上的数据(FFFFH:0000H∽FFFFH:000BH) ——运行后,查看寄存器DX 2 )字符串空格数统计程序

使用debug或emu8086截图保留程序运行后的结果

——运行后,查看寄存器CX和存储器数据段DATASEG中的字节变量O_NUM 3 )复制代码程序

使用debug或emu8086截图保留程序运行后的结果

——运行后,以指令形式(U命令)查看存储器地址0H:200H开始的数据 4 、子程序: 1 )数的阶乘

使用debug和emu8086截图保留程序运行后的结果(数据段DSEG中变量RESULT值) 2 )屏幕显示

使用debug和emu8086截图保留程序运行后的结果(屏幕四角显示“hello world!”) 3 )选择排序

使用debug和emu8086截图保留程序运行后的结果(屏幕第0行第0列开始显示排序后的字符串STR) 4 )数值显示

使用debug和emu8086截图保留程序运行后的结果(屏幕第24行第0列开始显示的1!+2!+ +5!的运算结果)

此文档是上海工程技术大学的微机课的三个实验,有的部分有

六、实验思考

1 、编写程序,判断数据段DSEG中的中年份变量YEAR(取值-10000∽+10000)是否是闰年,

2 、将以下C语言程序改写成对应的汇编语言程序,并使用debug或emu8086工具观察程序运行结果

void main() {

short a=32,b=0xFFF0,c=-9; if (a+b > 0 && c%3 == 0) {

a = 62; { else{

a = 21;

}

3 、编写程序,计算1!+2!+ +n!

子程序名:FACTORIAL

实现功能:计算n!(1≤n≤12) 入口参数:BX(n)

4 、编写程序,使用冒泡法排序由小到大以下排序数据

5 、编写程序,使用选择排序法由小到大排序以下数据 12,10000,43,0,17,85,6,50

此文档是上海工程技术大学的微机课的三个实验,有的部分有

1 )编写子程序

子程序名:MIN

实现功能:找出数组中最小的元素及其位置 入口参数:SI(数组地址),CX(数组元素的个数) 出口参数:AX(数组最小元素值),BX(数组最小元素在数组中的位置:0-CX-1) 2 )使用该子程序应用选择排序法由小到大排序数组ARRAY

DSEG SEGMENT

ARRAY DW 12,10000,43,0,17,85,6,50 DSEG ENDS

6 、编写程序,在屏幕的第8行第8列、第9行第8列、第10行第8列, ,第13行第8列依次以十进制形式显示DSEG数据段中的双字数据

DSEG SEGMENT

DD -8, 123, -70054, 84050, -38, 0 DSEG ENDS

本文来源:https://www.bwwdw.com/article/f9a1.html

Top