微机原理emu8086课程设计.docx

上传人:b****6 文档编号:13010510 上传时间:2023-06-10 格式:DOCX 页数:12 大小:266.28KB
下载 相关 举报
微机原理emu8086课程设计.docx_第1页
第1页 / 共12页
微机原理emu8086课程设计.docx_第2页
第2页 / 共12页
微机原理emu8086课程设计.docx_第3页
第3页 / 共12页
微机原理emu8086课程设计.docx_第4页
第4页 / 共12页
微机原理emu8086课程设计.docx_第5页
第5页 / 共12页
微机原理emu8086课程设计.docx_第6页
第6页 / 共12页
微机原理emu8086课程设计.docx_第7页
第7页 / 共12页
微机原理emu8086课程设计.docx_第8页
第8页 / 共12页
微机原理emu8086课程设计.docx_第9页
第9页 / 共12页
微机原理emu8086课程设计.docx_第10页
第10页 / 共12页
微机原理emu8086课程设计.docx_第11页
第11页 / 共12页
微机原理emu8086课程设计.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

微机原理emu8086课程设计.docx

《微机原理emu8086课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理emu8086课程设计.docx(12页珍藏版)》请在冰点文库上搜索。

微机原理emu8086课程设计.docx

微机原理emu8086课程设计

 

Emu8086的应用分析

摘要:

Emu8086是一个可在Windows环境下运行的8086CPU汇编仿真软件。

它集成了文本编辑器、编译器、反编译器、真调试、虚拟设备和驱动器为一体,并具有在线使用指南,这对刚开始学习汇编语言的人是一个很有用的工具。

您可以在真器中单步或连续执行程序,其可视化的工作环境让使用者操作更容易。

您可以在程序执行中动态观察各寄存器、标记位以及存储器中的变化情况。

仿真器会在模拟的PC中执行程序,以避免程序运行时到实际的硬盘或内存中存取数据。

此外,该软件完全兼容Intel新一代处理器,包括了PentiumⅢ、Pentium4的指令。

关键词:

Emu8086微机原理程序文件

一、软件启动

双击进入启动界面如图1所示,用户可以选择新建文本、程序示例、快速启动指南、最近使用文档。

图1启动界面

Emu8086软件提供的实例中包含了几十种典型的程序代码,其中包括:

数值计算、逻辑运算、屏幕显示、键盘输入、文件打印、马达控制、温度控制、交通灯控制等。

在软件提供的快速指南中提供了多种在线帮助工具,包括:

文件索引、8086CUP指令使用指南、系统中断调用列表以及用法等。

用户可以通过该工具快速地掌握8086CPU指令体系和emu8086汇编真软件的使用。

程序编辑结束后,点击模拟,即可进入模拟状态:

点击运行之后即可用屏幕模拟器进行模拟,如

:

二、程序代码

1、数值计算

(1)十进制系统

目前使用最多的是十进制。

十进制系统有10个数字0,1,2,3,4,5,6,7,8,9。

利用这些数字能表示任何数值,例如754这些数字是由每一位数字乘以“基数”的幂累加而成的(上一个例子中基数是10因为十进制中有十个数字)。

位置对于每一个数字是很重要的。

例如,你将上一个例子中的“7”放到结尾:

547

数值就成为:

特别提醒:

任何数字的0次幂都是1,0的0次幂也是1

(二)二进制

计算机没有人类聪明(至少现在是这样),制造一个只有开关或者称为0,1两种状态的电子机器很容易。

计算机使用二进制系统,只有两个数字0,1基地为2每一位二进制数称作一位(BIT),4BIT组成一个半字节(NIBBLE),8BIT组成一个字节(BYTE),两个字节组成一个字(WORD),两个字组成一个双字(DOUBLEWORD)(很少使用):

习惯上在一串二进制后面加上“b”,这样,我们可以知道101b是二进制表示十进制的5。

二进制10100101b表示十进制的165,计算方法如下:

(三)十六进制系统

十六进制系统使用16个数字0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F基底是16.十六进制非常紧凑,便于阅读。

将二进制转换为十六进制很容易,半字节(4bits)对应一位十六进制如下表

Decimal

(base10)

Binary

(base2)

Hexadecimal

(base16)

0

0000

0

1

0001

1

2

0010

2

3

0011

3

4

0100

4

5

0101

5

6

0110

6

7

0111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

15

1111

F

习惯上我们在一个十六进制数的后面加上"H",以便和其他进制区别,这样我们就知道5Fh是一个十六进制数表示十进制的 95。

习惯上,我们也在以字母开头(从A到F)的十六进制数前面加上"0" 例如:

0E120h.十六进制1234h 等于 4660:

2、逻辑运算

(1)与运算(AND)

AND-两个操作数各个位逻辑与运算。

运算法则如下

1AND1=11AND0=0

0AND1=00AND0=0

只有当两个操作数都是1时,运算结果才是1。

(2)或运算(OR)

OR--两个操作数各个位逻辑或运算。

运算法则如下

1OR1=11OR0=1

0OR1=10OR0=0

如果操作数中有1那么结果一定是1。

(3)异或运算(XOR)

XOR- 两个操作数各个位逻辑异或运算。

运算法则如下

1XOR1=01XOR0=1

0XOR1=10XOR0=0

3、堆栈

堆栈是内存中用于保存临时数据的一片区域.当使用CALL指令时,堆栈用于保存过程的返回地址,RET指令能够从堆栈中取得该地址并使程序返回到那里。

当使用INT指令,发生的也与此类似。

堆栈保存标志寄存器,代码段和偏移量。

IRET指令用来从中断返回。

我们同样可以使用堆栈保存任何数据。

对于堆栈的操作只有两条:

PUSH-将16位数值压入堆栈.POP-将16位数值从堆栈中弹出

PUSH指令的使用方法:

PUSHREG

PUSHSREG

PUSHmemory

PUSHimmediate

REG(寄存器):

AX,BX,CX,DX,DI,SI,BP,SP.

SREG(段寄存器):

DS,ES,SS,CS.

memory(内存):

[BX],[BX+SI+7],16位变量,等等...

immediate(立即数):

5,-24,3Fh,10001101b,等等...

POP指令的使用方法:

POPREG

POPSREG

POPmemory

REG(寄存器):

AX,BX,CX,DX,DI,SI,BP,SP.

SREG(段寄存器):

DS,ES,SS,(除了CS).

memory(内存):

[BX],[BX+SI+7],16位变量,等等...

注意:

PUSHandPOP都只操作16位数据!

注意:

在80186其极以后的CPU中才能使用PUSH立即数这样的指令堆栈使用LIFO(后进先出)算法,意思是:

加入我们按照如下顺序压入数值:

1,2,3,4,5再使用POP指令弹出,结果将是54321

注意:

有多少条PUSH指令就要对应有多少条POP指令,否则堆栈会被占用,无法正确返回操作系统。

前面讲过使用RET指令返回操作系统,所以在程序开始时会将返回地址压入堆栈(通常都是0000h)I PUSH和POP指令在我们寄存器不够用的时侯特别有用,我们有如下技巧:

将寄存器原始数值存入堆栈(使用PUSH)使用寄存器从堆栈中弹出寄存器原先数值再放入寄存器(使用POP)下面是一个例子:

ORG100h

MOVAX,1234h

PUSHAX;将AX存入堆栈.

MOVAX,5678h;修改AX值

POPAX;返回AX原先的值

RET

END

堆栈的另外一个作用是交换数值,下面是一个这样的例子:

ORG100h

MOVAX,1212h;将1212h存入AX.

MOVBX,3434h;将3434h存入BX

PUSHAX;将AX数值存入堆栈.

PUSHBX;将BX数值存入堆栈

POPAX;BX原值存入AX

POPBX;AX原值存入BX

RET

END

之所以能这样是因为堆栈是用LIFO(后进先出)算法,当我们压入1212h和3434h之后,使用pop弹出我们首先得到的是3434h然后才是1212h。

堆栈的内存区域由SS寄存器(堆栈段),SP寄存器(栈指针)设置设置。

一般来说操作系统在程序开始时会设置这些。

"PUSH源" 指令做如下工作:

将SP寄存器减2将源的值写入内存SS:

SP地址处"POP目的" 指令做如下工作:

内存SS:

SP地址处数值写入目的将SP寄存器加2由SS:

SP指出的地址称作堆栈顶对于COM文件,堆栈段通常就是代码段,堆栈指针设置为0FFFEh.在地址SS:

0FFFEh处存放程序结束时RET指令返回地址。

你可以点击[stack]按钮直接观察堆栈操作。

堆栈顶由“<”符号标记。

4、宏

宏与过程很相似,但并不是完全相似。

宏看起来像过程,但是当你的代码编译完成之后就消失了,取而代之的是真正的代码。

如果你声明一个宏,而在代码中从来没有调用,编译器在编译过程中将忽略它。

宏的定义:

nameMACRO[参数,]

<指令>

ENDM

与过程不同,宏要求定义参数并使用。

例如:

MyMacroMACROp1,p2,p3

MOVAX,p1

MOVBX,p2

MOVCX,p3

ENDM

ORG100h

MyMacro1,2,3

MyMacro4,5,DX

RET

上述代码在编译过程中将展开成:

MOVAX,00001h

MOVBX,00002h

MOVCX,00003h

MOVAX,00004h

MOVBX,00005h

MOVCX,DX

关于宏与过程需要注意如下要点:

当你想使用一个过程,你应该使用CALL指令,例如:

CALLMyProc当你想使用一个宏,你只需要输入它的名称。

例如:

MyMacro过程是存在于内存中某一特定位值的,即使你调用这个过程100次,cpu只是执行内存中这一段的代码。

在遇到RET指令后还会回到调用该过程的位值。

这是通过使用堆栈保存返回地址来实现的。

CALL指令占用3字节,无论调用多少次过程,最终输出的可执行文件并不会因此而显著增大。

宏会在程序代码中展开。

如果你使用相同的宏100次,输出的可执行文件将会变得越来越大,因为每一次调用宏中的指令都会插入到调用宏的位值。

你可以使用堆栈或者通用寄存器来向过程传递参数向宏传递参数的方法是在宏名称后面直接接上参数。

例如:

MyMacro1,2,3用ENDM指令结束宏就足够了标记过程结束,你需要在ENDP指令前加上过程名称。

宏会直接在代码中展开,因此,如果你在宏中使用标记,当宏被调用2次或两次以上的时侯就会出现"Duplicatedeclaration"(重复定义)这一错误。

为了避免该错误在变量,标记或者过程名称之前加上“local”指令。

例如:

MyMacro2MACRO

LOCALlabel1,label2

CMPAX,2

JElabel1

CMPAX,3

JElabel2

label1:

INCAX

label2:

ADDAX,2

ENDM

ORG100h

MyMacro2

MyMacro2

RET

微机的最基础语言——汇编语言,是计算机最基础的语言。

然而越基础的东西越重要,因此它在重大的编程项目中应用的最为广泛。

就我个人理解,汇编是对寄存器的地址,以及数据单元进行最直接的修改。

而在某些时候,这种方法是的最有效,也是最可靠的。

但是它也有缺点,最重要的一点就是它本身较为复杂:

对某个数据进行修改时,本来很简单一个操作会用比较烦琐的语句来解决,而这些语句本身在执行和操作的过程中,占用大量的时间和成本。

因此,在一些讲求效率的场合,这种语言并不可取,所以可以适当对它进行取舍。

掌握汇编语言对以后其他语言的学习有极大的帮助和促进作用。

通过该课程的学习,基本上对微型计算机原理与接口技术有了一定的了解,对整个内容感觉还是比较晦涩难懂。

但是对于其学习方法还是有一定的掌握。

EMU8086的工作界面很简洁,它能模拟真实微处理器工作的每一步骤,通过单步调试显示指令执行后CPU内部寄存器、存储器、堆栈、变量和标志寄存器的当前值,操作简单直观,通过它我们可以很快掌握汇编程序设计和接口技术等知识。

在实验过程中也是我们学习到了很多知识,很多课堂上不是很了解的知识也得到了清晰地理解。

与实验室里的星研比较,EMU8086有着很大的优势,在编译、运行的步骤上尤为简单。

三、鸣谢

感谢丁老师的教授和指导,通过认真的学习,我大概的了解了一些芯片,例如8253、8255、8259A等芯片。

在学习过程中,丁老师也给我们细心讲解了一个个重要的知识点,并为我们详细解答了我们学习过程中遇到的问题及疑惑。

在本学期结束之际,我再次感谢丁老师给予我及同学们在学习上的帮助和支持!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2