单片机的指令系统是如何区分访问程序存储器空间、内部数据存储器空间、外部数据存储器空间和位地址空间的

单片机的指令系统是如何区分访问程序存储器空间、内部数据存储器空间、外部数据存储器空间和位地址空间的,第1张

刚把我当年学微机原理(51系)的word笔记找出来,希望能有用!

2-2 8051单片机内部包含哪些主要逻辑部件?各自的功能是什么?

答:8051单片机内部包含:

1、中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。

2、存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器。在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。

3、定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式,也可以设置成定时方式,并以其定时计数结果对计算机进行控制。

4、并行I/O口:8051有四个8位并行I/O接口(P0~P3),以实现数据的并行输入输出。

5、串行口:8051单片机有一个全双工的串行口,可实现单片机和单片机或其他设备间的串行通信。

6、中断控制系统:8051共有5个中断源,非为高级和低级两个级别。它可以接收外部中断申请、定时器/计数器申请和串行口申请,常用于实时控制、故障自动处理、计算机与外设间传送数据及人机对话等。

2-3 8051单片机的存储器分哪几个空间?通过什么信号来区别不同空间的寻址?

答:有四个物理上相互独立的存储空间:片内ROM地址为0000H-0FFFH此时/EA=1;片外ROM地址为0000H-0FFFFH此时/EA=0。片内数据存储器地址为00H-0FFH;片外数据存储器地址为0000H-0FFFFH;区分片内片外数据存储器通过指令MOV与MOVX。

2-6 内部RAM低128单元划分为哪三个主要部分?各部分主要功能是什么?

答:分为三部分:工作寄存器去,位寻址区,毁州用户RAM区(堆栈、数据缓冲)。

工作寄存器区(00H-1FH):32个RAM单元共分四组,每组8个寄存单元(R0-R7)。寄存器常用于存放 *** 作数及中间结果等。位寻址区(20H-2FH):此部分16个单元的每一位都有一个8位表示的位地址,位寻址取得每一个单元既可作为一般RAM单元使用,进行字节 *** 作,也可以对单元中的每一位进行位 *** 作。用户RAM区:也是数据缓冲区,一般用于存放用户数据及作堆栈区使用。

3-1 MCS-51的寻址方式及特点

MCS-51的寻址方式有七种:

1.直接寻址:指令中直接给出 *** 作数所在的单元地址或位地址

2.立即寻址:在指令中紧跟在 *** 作码之后的字节是 *** 作数

3.寄存器寻址: *** 作数在指令中给出的寄存器内

4.寄存器间接寻址:指令中指定的寄存器内存的是 *** 作数的地址

5.变址寻址:指令中给出由基址加变址形纤竖蔽成的16位地址作为 *** 作数的地址

6.相对寻址:指令中给出相对偏移量,该相对偏移量与PC当前值求和得到转移地址

7.位寻址:指令中给出的位地址或位寄存器里存是所寻的位 *** 作数

3-2 MCS-51的指令按功能分类及各类的作用

MCS-51的指令按功能分5类:

1.数据传送指令:主要用于数据的传送与交换和栈 *** 作。 P69

2.算术运算指令:主要用纤改来作算术四则运算、增量、减量及二—十进制调整。 P76

3.逻辑运算指令:主要用来作“与”、“或”、“异或”、“清除” “求反”及“左右移位”等逻辑运算。P81

4.位 *** 作指令:主要用来作 “与”、“或”、 “清除”、“置位” “求反”等布尔 *** 作及“位传送” *** 作。 P83

5.控制转移指令:主要用于改变程序计数器PC的值, 以控制程序执行的走向,有转移、调用及返回 *** 作.P84

3-3 变址寻址和相对寻址中偏移量的异同点

变址寻址 :@A+DPTR ;基址:DPTR, 变址:A

@A+PC ;基址:PC当前值, 变址:A

变址:A 中为8位二进制无符号数偏移量(A)∈[0,255] 即[00H,0FFH]相对寻址: 相对偏移量为8位二进制带符号数的补码

rel ∈[-128,+127]

[rel]补码∈[00H,0FFH]

相同点:偏移量∈[00H,0FFH]

不同点:变址寻址 中偏移量为8位二进制无符号数相对寻址中偏移量为8位二进制带符号数的补码

3-4 指出下面每条指令的寻址方式:(源和目的 *** 作数分开写)

MOV A,#30H –寄存器、立即–30H 立即数

MOV C,30H –寄存器、位 –30H 位地址

MOVX A,@DPTR –寄存器、间接

jC LAB1 –相对

MOV 30H,@R1 –直接、间接 –30H 字节地址

MOV 30H,R5 –直接、寄存器 –30H 字节地址

MOVC A,@A+PC –寄存器、变址

sjmp LAB2 –相对

4-5在用JMP指令实现128分支的程序中,试用LJMP代替AJMP指令。修改后的程序有何特点?最多能实现多少分支?

答:AJMP指令表 128分支占128*2=256 字节MEMORY

LJMP指令表 可以实现256/3=85 个分支

特点:各分支可在64KB存储器中转移。

5-2什么叫I/O接口?I/O接口的作用是什么?

I/O接口是计算机和外设进行数据交换的桥梁。

I/O接口的作用:

锁存作用:防止由于CPU速度快,外设慢而产生的丢数现象

隔离作用:防止DB上的信息重叠

变换作用:在CPU与外设之间进行信息类型、电平、传送接收方式变换

联络作用:在CPU与外设之间进行联络,Ready Busy

5-3 I/O端口有哪两种编址方式?各有什么特点?

I/O端口编址方式:统一编址、独立编址

统一编址:I/O接口与内存储器采用一套地址,完全相存储器单元一样处理,使用访问存储器的指令。如:movx 类指令。

独立编址:采用一套与存储器不同的地址,利用/MREQ(存储器请求)和/IORQ(输入输出请求), CPU 有专门的I/O指令 如:IN, OUT 。

5-4 I/O数据有哪四种传送方式?

无条件传送方式

条件传送方式(查询方式)

中断方式

存储器直接存取(DMA)方式

5-6 结合图5-17说明DMA传送的工作过程

外设向DMAC发DMA申请

DMAC向CPU发BUSRQ

CPU发BUSAK响应

DMAC发存储器地址和读写信号

DMA控制结束,恢复CPU对总线控制

5-13 中断允许寄存器IE各位的定义是什么?请写出允许定时器/计数器T/C1溢出中断的指令。

IE.8:EA,中断允许触发器

IE.4:ES,串行口中断允许位

IE.3:ET1, 定时器/计数器1中断允许位

IE.2:EX1,外部中断1允许位

IE.1:ET0, 定时器/计数器0中断允许位

IE.0:EX0, 外部中断1允许位

允许定时器/计数器T/C1溢出中断的指令:

Setb ET1

Setb EA

Setb TR1

5-17 MCS-51的中断处理程序能否存储在64kB程序存储器的任何区域?若可以,则如何实现?

可以。

实现方法:在中断向量入口处,放一条长跳转指令,跳转到中断服务程序处。

是这样的

a=3就是a指向3,然后笑拿a = 4就是a指向4,这是编译后的运行方式,和代码中的引用传递是有区别的。

区别在于,a值的改变不会影响到b的值,即使a和b是对象,b=c(c是另一个对象),a的碰升搭值也不变;但是b.d=c,那么a.d也会变成c。

你可以这样想:

值传递的变量就是指向值的指针;

而引用传递(类)就是指向一笑告组指针的指针。

实际赋值时都是指针等于指针。

您好:

你是在学习数据结构方面的知识信神吧。

首先呢,你学习栈,要了解栈的定义,明白它是怎么一回事,就是去理解他的思想。

最后才去用代码来体现出来。

栈是先进后出,其实是用代码控制的,

其实你要他先进先出也可以。

你只要明白他的原理就行。

代码,你可以理解为跟计算的一种对话的语言。

不用想的那么复杂。

就好比说话,你只要知道你要说什么就行(算法),而不用刻意明白要怎么说(语法)。

下面给我出我以前写的代码,关于栈的,顺序栈,其实还有链栈。

/*   数据结构-栈   */

/*   异常的细节处理还没弄好*/

#include <iostream>

#include <stdlib.h>

#include <malloc.h>

#define len_chu_shi 50   //初始空间大小

#define len_zeng_jia 10  //额外增加空间大小

#define OK 0       //正确

#define OVER -2     //

#define ERROR -1 冲坦察  //

using namespace std

typedef int elem_type          //元素类型

typedef int function_type      //函数类型

typedef struct zhan

{

   elem_type *top    //栈顶

   elem_type *base   //栈底

   int len           //当前空间大小

}zhan                //栈结构

function_type Init_zhan(zhan *exam)//初始化栈

function_type Get_top(zhan *exam,elem_type *e)//获取栈顶元素

function_type Add_top(zhan *exam,elem_type *e)//增加栈顶元素

function_type Delete_top(zhan *exam, elem_type *e)//删除栈顶元素

int main(int argc,char *argv[])

{

   zhan 散茄*example = (zhan *)malloc(sizeof(zhan))

   Init_zhan(example)

   return OK

}

function_type Init_zhan(zhan *exam)

{

   exam->base = (elem_type *)malloc(len_chu_shi*sizeof(elem_type))

   if(!exam->base)  //分配失败

     exit(OVER)

   exam->top = exam->base

   exam->len = len_chu_shi

   return OK

}//--end

function_type Get_top(zhan *exam,elem_type *e)

{

   if(!exam->base)

     exit(OVER)

   *e = *(exam->top - 1)  //不能用自减运算符,那样会改变栈顶指针的值

   return OK

}//--end

function_type Add_top(zhan *exam,elem_type *e)

{

   if(exam->len <= exam->top - exam->base)  //我个人觉得,如果 已经"<",就已经数据溢出了,就应该报错

     exam->base = (elem_type *)realloc(exam->base,(exam->len + len_zeng_jia)*sizeof(elem_type))

   if(!exam->base)  //分配失败

     exit(OVER)

   *(exam->top++) = *e   //应该是先改变栈顶指针的内容,然后栈顶指针再自增

   exam->len += len_zeng_jia

   return OK

}//--end

function_type Delete_top(zhan *exam, elem_type *e)

{

   if(!exam->base)  //空栈

     exit(OVER)

   *e = *(--exam->top)  //应该是栈顶指针先自减,然后获取栈顶指针的内容

   return OK

}//--end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12295142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存