指令SUBB A,@R1的第二操作数的寻址方式是

单片机内部包含哪些主要功能部件它们的作用是什么?

是微处理器的核心是运算和逻辑计算的中心。

)片内震荡器及时钟电路:提供标准时钟信号所有动作都依据此进行。

程序存贮器:存贮程序及常用表格

数据存贮器:存贮一些中间变量和常数等。

计数器:完全硬件定时器

)一个可编程全双工串荇口

、什么是指令?什么是程序

答:指令是规定计算机执行某种操作的命令。

程序是根据任务要求有序编排指令的集合

存储器空间茬物理结构上可以划分为

个空间,而在逻辑上又可以划分为

存储器空间在物理结构上设有4个存储器空间:片内程序存储器、片外程序存

儲器、片内数据存储器、片外数据存储器在逻辑上有3个存储器地址空间:片内、片外统一的

程序存储器地址空间,片内

B数据存储器哋址空间片外

KB的数据存储器地址空间。

使用的是哪组工作寄存器他们的地址是多少?

如何确定和改变当前工作

、什么是堆栈堆棧有何作用?在程序设计时有时为什么要对堆栈指针

在操作中要使用两组工作寄存器,

答:堆栈是一个特殊的存储区主要功能是暂时存放数据和地址,通常用来保护断点和现场堆栈

为位寻址区,这些单元有其他

功能因此在程序设计时,需要对

在操作中要使用两组工莋寄存器

的时钟周期、机器周期、指令周期是如何分配的?当振荡频率为

答:时钟周期为时钟脉冲频率的倒数他是单片机中最基本的、最小的时间单位。机器周期是指完

成一个基本操作所需要的时间一个机器周期由

个时钟周期组成。指令周期是执行一条指令所

需要的時间由若干个机器周期组成。

扩展系统中片外程序存储器和片外数据存储器共处同一地址空间为什么不会发生总

答:访问片外程序存儲器和访问数据存储器使用不同的指令用来区分同一地址空间。

的作用是什么常用状态标志有哪些位?作用是什么

位寄存器,用于存放程序运行的状态信息

中各位状态通常是在指令

执行的过程中自动形成的,

但也可以由用户根据需要采用传送指令加以改变

:辅助进位标志位,又称为半进位标志位

}

3.4指出下列指令源操作数的寻址方式和功能

6)SJMP LOOP ;相对寻址。程序转到标号为LOOP的语句处执行

3.5内部RAM的00H单元的寻址方式:

2)因为00H是工作寄存器区,所以还可以寄存器寻址MOV A,R0

特殊功能寄存器中的操作数的寻址方式:

3.6变址寻址和相对寻址中的地址偏移量异同:

1)变址寻址的偏移量是一个00H ~ FFH范围内的无符号数;相对尋址偏移量是一个带符号的8位二进制补码范围为-128 ~ +127。

2)变址寻址的偏移量放在累加器A中相对寻址的偏移量直接在指令中给出。

3)都是将基地址与地址偏移量相加形成操作数地址。

3.7写出下列指令的机器码指出指令中50H和66H各代表什么?

1)指令50H的含义机器码

2)指令66H的含义机器碼

3.8写出下列指令的机器码指出下列程序执行后的结果。

}

  寻址方式在汇编中是很重要嘚汇编所有的操作都是和和内存或者寄存器打交道的,在80C51里面一共7种寻址方式

这个没什么好说的,就是往寄存器或者内存里面写立即數在80C51汇编里面立即数前面带一个#(这个和Intel其他汇编和AT&T的都是不一样的)。

在80C51汇编中如果数字前面不带#,就表明这个是一个地址而且昰绝对地址

MOV A, 20H ;把20H对应的内存的一个字节的内容传送到A中

MOV C, 20H ;把20H对应的内存的一个字的内容传送到C中(位寻址)

(注意P口也是内存地址,可能会出判断题判断MOV P0, #02H是否合法类似的。)

在80C51中RX表示寄存器(要记住寄存器是有4组的)

4. 寄存器间接寻址:

在8086中我们很熟悉这个东西,比如在8086这种尋址方式就是 mov ax, [bx]但是80c51这个东西就很特别,在80c51中如果要使用寄存器间接寻址:

:片内RAM(采用Ri(R0和R1,只能这两个),SP)

MOV A, @R0 ;把R0里面的内容对应的内存(44H)的内容(30H)放入A寄存器中

这种方式是拿来访问ROM的(而且也只能访问ROM)

这个是专门针对相对跳转指令来说的这些指令等下看。要注意的是这个相对转移的偏移值的大小是-128~127的

(要注意的是80C51的PC值是不断+1的(80C51有个部件叫PC Incremter),也就是8位8位移动(因为80C51是个8位的芯片不能像80386那樣移动四个字节或者两个字节),也就是说80C51看到跳转指令的时候是让自己再获取PC对应的操作数(8位)然后继续+1的)

可位寻址的地方就是仩一个文章所说的那个用户低128位的那16字节地址(20H~30H),以及特殊寄存器的一些可以叫出名字的一些地方

位寻址的四种表示方式:

1. 直接操作哋址:00H


  书上废话太多,总结一下

1. MOVX:(外部内存操作,扩展的时候非常需要用到)

@Ri :A (写外部内容注意这个只能寻址到256位,如果RAM寻址比8位还高还需要给P2口提供高8位)

@DPTR :A (写外部内容,外部64KB的内容都可以访问到DPH由P2输出,DPL由P0输出)

2. PUSH:(压栈指令):

3. POP: (弹栈指令)

POP direct (注意PUSH和POP只能操作内存有一种情况是需要我们压入A的内容,则要使用POP/PUSH ACC)

4. XCH:(字节交换指令):

5. XCHD:(半字节交换指令):

A :@Ri(这个指令比較奇葩只能操作@Ri,是把Ri的内容指向的内存的低四位和A的低四位互换)

SWAP A(不解释了。)

  0. 不带进位加法指令(ADD)

1. 十进制调整指令(DA)

2. 帶进位的加法指令(ADDC)

4. SUBB(带借位的减法指令)

A :#datadirect,@RiRn(注意减法指令没有不带借位的)

6. MUL(无符号相乘指令,一定要记得是无符号的!)

MUL AB (A*B)(低8位在A上高8位在B上,如果A溢出OV = 1,B有结果否则0V = 0,结果只在A中进位CY总是会被清零,P的值按A的值来决定)

7. DIV(无符号除法指令)

DIV AB (A/B)(A是商B是余数,OV的值只与除数是否为0有关如果除数是0,那么OV = 1否则0V = 0,CY会被清零P的值按A的值来决定)。

1. ANL(按位与)ORL(按位或),XRL(按位异或)

C :bit(可位寻址)

bit(可位寻址) :C

2. CLR(清零)CPL(取反),RL(循环左移)RLC(带CY位的循环左移),RR(循环右移)RRC(带CY位的循环祐移)

操作A和位,注意带CY位的循环移动是把最高位放到CY位上然后最低位是根据上一个CY位来的。

  这些指令相当好记因为只用记英文僦知道这些指令是干嘛的了。

可以跳转到一个16位的绝对地址

2. AJMP(短转移指令):

可以跳转到一个11位的绝对地址

3. SJMP(相对转移指令):

rel是目标地址相对PC的偏移值(这里应该这样理解处理器一看到SJMP指令,要先指向SJMP指令的下一条指令所以先PC + 2(当然了其实一个一个加的,先遇到SJMP的8位操作码然后再识别8位操作数,问题就是这个8位的操作数这个8位的操作数实际上是编译的时候已经算好的了,是按照目标地址 - (SJMP的汇编哋址 + 2)来算的 )

比如当我执行SJMP $的时候$在这里是助记符而已,表明的当前地址所以在编译的时候,会在SJMP的目的操作数上替换成-2所以等SJMP執行时就自动跳转到本身了。

4. JMP(散转移指令):

这个指令是为了实现跳转表的跳转表就是我们经常写的C的那个switch在汇编层实现的东西,具體格式就是JMP @A+DPTR(A + DPTR里面的内容是要跳转到的位置的据对地址)

这些指定都加多了一些条件,然后进行的都是相对转移(比如JZ就是JUMP IS ZERO(当结果為0的时候就进行转移(和8086看ZF位不一样,80C51是看的A的值是否为0如果A的内容为0,则转移否则不转移)),JNZ刚好相反)

CJNE是比较不相等才转移(紸意这个指令只能用于无条件数有条件数是不适用的,因为它只看CY)

DJNZ是最常用的拿来做循环的指令(曾几何时我没用这个指令被老师說我程序写的太复杂),这个指令很容易拿来实现for这个指令最大的特点就是可以边比较边把寄存器或者目的地址内容减1,直到减到0为止

JB,JBCJNB指令都是看对应的位地址的情况然后跳转,JB是目的位地址是1则跳否则不跳,JNB功能刚好和JB的相反JBC除了能比较位为1然后跳转意外,還能把对应的位地址清零

JC和JNC则是看的是CY标记位

ACALL和LCALL这两个指令就不用说了,一个短调用一个是长调用这两个命令都要和RET指令一起用。RETI是囷中断一起用的RETI除了会把压入栈的地址弹出来外还会把80C51内部的挂起的中断请求给撤销掉,以响应下次中断(和8086的IRQ是一样的)


  C51虽然長得和C差不多,写的时候和C也差不多但是毕竟不是正统的CS的产物,有一点奇奇怪怪的东西还是需要注意一下的

  首先C51的整形(unsigned int和int都昰16位的(并不是32位),而且我建议大家写程序的时候不要去定义一个什么宏uchar来表示什么unsigned char这种做法简直是在侮辱编辑器,要是keli写的不够爽鈳以换VScode或者Notepad++)而unsigned long 和long都是32位的,float是32位的同时C51有bit型,这个是C没有的东西

  特殊功能寄存器型(sfr,sfr16),分别可以指向8位特殊寄存器(当然必须是可寻址的那些了)16位特殊寄存器。

  比如sfr FUCK = 0x90; 我们就定义了FUCK这个变量指向0x90这个地址对应的特殊功能寄存器(当然我们知道这个是P1昰8位的)

  sbit可以定义一个可位寻址,这个可以定义内部RAM的位寻址空间以及特殊功能寄存器

  C51另一个特色是可以自定义存储类型,这個在外部拓展写代码的时候是很重要的

  另外我们也可以在C51中定义存储模式,C51定义了三种存储模式SMALL(默认存储类型是data,存在片内RAM速度快),COMPACT(pdata(紧凑模式)存储于片外分片RAM),LARGE(xdata大模式存储于片外64KB的RAM,速度慢)

  注意在C51里面,中断子程序的写法是这样的void Fun()interrupt m uisng n(沒有返回值和没有参数并且后面带着interrupt(使用哪个中断(中断从0-4分别为外部中断0,定时器中断0外部中断1,定时器中断1串口中断))和using(80c51一共4个工作寄存器组))。


  选了一些题目有一些是书上作业,有一些是老师布置过的题目

1. 将R1的内容传送到R0(注意80c51MOV指令不能寄存器對寄存器)

5. 现外部RAM 2000H和内部RAM20H有内容设计程序实现将这两个单元内容相加,将其结果的十位和各位送到外部RAM的2000H百位送到F0位

6. 屏蔽20H的高4位(注意逻辑指令是可以直接操作内存的,不要傻乎乎地转A)

7. 将E0H的低4位取反高4位不变(注意这个世界有异或运算这种东西)

  (PS如果是减法,由于减法是没有不带借位减法的所以在第一步必须CLR C,其他只要把ADD和ADDC换成SUBB就可以了)

JB ACC.7 LESS ;注意这里不要用SUBB题目没有告诉我们这是无符号数,SUBB的话要看OV和CY

10. 在内部RAM21H单元开始存储了有一组单字节的不带符号数数据长度是30H,要求求出最大的数放入BIG单元

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信