搜索
您的当前位置:首页正文

指令系统及程序设计

来源:好土汽车网
 1、用数据传送指令完成如下功能: (1)工作寄存器R2的内容送给R3; MOV A,R2 MOV R3,A;

两个工作寄存器之间不能直接进行数据传送

(2)内部RAM20H单元的内容送给内部RAM30H单元; MOV 30H,20H;

两个直接地址之间可以直接进行数据传送

(3)内部RAM20H单元的内容送给外部RAM20H单元; MOV R1,#20H MOV A,@R1 MOVX @R1,A;

内部RAM中的数据必须要先送到累加器A再由A送出到外部RAM去 (4)外部RAM20H单元的内容送给外部RAM2000H单元; MOV RI,#20H MOV DPTR,#2000H MOVX A,@R1 MOVX @DPTR,A;

两个外部RAM单元也不能直接进行数据传递,必须要先将外部RAM一个单元数据送给A再由A到另一个外部RAM单元中去 (5)ROM30H单元的内容送给内部RAM30H单元; MOV DPTR,#0030H MOV A,#00H MOVC A,@A+DPTR MOV 30H,A

要先将ROM指定单元数据送给A再由A到内部RAM指定单元中

(6)ROM3000H单元的内容送给外部RAM2000H单元;

MOV DPTR,#3000H MOV A,#00H MOVC A,@A+DPTR MOV DPTR,#2000H MOVX @DPTR,A

要先将ROM指定单元数据送给A再由A到外部RAM指定单元中去 小结: 1、

注意数据传送类指令有三种:MOV(内部数据传送)、MOVC(从程序存储器中取数)、MOVX(累加器A与外部数据存储器间进行数据传递),要注意区分三种指令,不要混淆; 2、

外部数据存储器(外部RAM)只能用寄存器间接寻址方式访问,且只能与累加器A进行数据传送; 3、

外部数据存储器(外部RAM)使用寄存器间接寻址的地址指针选取原则:地址在8位以内(00H-FFH)可以使用R0、R1,也可以使用DPTR;地址超过8位,只能使用DPTR; 4、

内部数据存储器(内部RAM)低128B可以用直接寻址方式也可以寄存器间接寻址方式访问;内部数据存储器高128B(仅52子系列有)只能用寄存器间接寻址方式访问,地址指针选取R0或R1; 5、

程序存储器(ROM)是只读的,从ROM中读取数据用MOVC指令,对应变址寻址方式,要预先在A和DPTR(MOVC A,@A+DPTR)或A(MOVC A,@A+PC)中设好相应的值;

2、外部RAM20H单元的内容和外部RAM21H单元的内容相乘,结果低八位送外部RAM22H单元,高八位送外部RAM23H单元 MOV R1,#20H MOVX A,@R1 MOV B,A INC R1 MOVX A,@R1 MUL AB INC R1

MOVX @R1,A INC R1 MOV A,B MOVX @R1,A

外部数据存储器(外部RAM)只能用寄存器间接寻址方式访问,且只能与累加器A进行数据传送;如MOVX B,@DPTR是非法指令。

3、完成两个三字节二进制数的加法:第一个数存在内部RAM的30H、31H、32H(32H为最低字节)单元,第二个数存在内部RAM的40H、41H、42H(42H为最低字节)单元,结果存入内部RAM的 30H、31H、32H(32H为最低字节)单元。 ORG 0000H SJMP MAIN ORG 0030H MAIN: CLR C MOV R2,#3 LOOP: MOV R0,#32H MOV R1,#42H MOV A,R0 ADDC A,R1 MOV R0,A DEC R0 DEC R1 DJNZ R2,LOOP SJMP $

注意三字节数加法,高字节做加法时要考虑到低字节所产生的进位,所以用ADDC指令。

4、用逻辑运算指令完成如下功能:

(1)内部RAM20H单元数的低三位清零,其余位保持不变;

ANL 20H,#0F8H;

(2)内部RAM20H单元数的高两位置1 ,其余位保持不变;

ORL 20H,#0C0H

(3)内部RAM20H单元数的高两位取反,其余位保持不变; XRL 20H,#0C0H

(4)内部RAM20H单元数的所有位取反;

XRL 20H,#0FFH 说明:

1、逻辑与通常用来将累加器A或内部RAM某单元的某几位清0; 2、逻辑或通常用来将累加器A或内部RAM某单元的某几位置1; 3、逻辑异或通常用来将累加器A或内部RAM某单元的某几位取反; 4、注意根据要求选取的立即数

5. MOV R0,#30H ; (R0)=30H MOV A,@R0 ; (A)=(30H)=64H MOV DPTR,#1000H ; (DPTR)=1000H MOVX @DPTR,A ; (1000H)=(A)=64H MOV A,50H ; (A)=(50H)=04H

MOV DPTR,#TAB ; (DPTR)=(TAB)=2000H

MOVC A,@A+DPTR ; (A)=((A)+(DPTR))=(2004H)=00H MOV P1,A ; (P1)=(A)=00H

6.(SP)=6AH (R0)=35H, (R1)=45H,(6AH)=(34H),(69H)=(33H),(68H)=(32H),(67H)=(31H),(66H)=(30H) (40H)=(30H),(41H)=(31H),(42H)=(32H),(43H)=(33H),(44H)=(34H) 本程序段的功能为:把40H之后5个字节单元的内容存入堆栈,而把30H之后的5个字节单元的内容送到40H之后的5个字节单元里

7、试编写一个程序,其功能为将内部RAM中30H~32H的内容左移一位

7. ORG 0000H SJMP MAIN

ORG 1000H MAIN: MOV R7,#3 MOV R0,#30H MOV A,32H MOV C,ACC.7 LOOP: MOV A,@R0 RLC A MOV @R0,A INC R0 DJNZ R7,LOOP SJMP $

8、试编程将连续存放在外部RAM中1000H开始的100个单元的内容送到2000H开始的地址单元中?

ORG 0000H

LJMP MAIN ORG 0030H MAIN: MOV SP,#6FH MOV R7,#100 MOV DPL,#00H LOOP: MOV DPH,#10H MOVX A,@DPTR MOV DPH,#20H MOVX @DPTR,A INC DPL DJNZ R7,LOOP SJMP $ 说明:

1、此题目的外部RAM两个区域地址都超过了8位,所以不能使用R0或R1作为地址指针,只能使用DPTR

2、DPTR是16位的特殊功能寄存器,其高八位为DPH、低八位为DPL,DPH和DPL可单独使用;

3、此题目外部RAM的两个区域高八位地址不同,低八位一致,可以通过改变DPH的内容,选择不同的存储区域;

9、统计从片内RAM 30H到39H的连续10个单元中的正数、负数和零的个数? ORG 0000H SJMP START ORG 1000H START: MOV R7,#10 MOV R0,#30H

MOV R1,#00H ;正数计数 MOV R2,#00H ;零计数 MOV R3,#00H ;负数计数 LOOP: MOV A,@R0 JZ ZERO JB ACC.7 NEG INC R1 AJMP OUT NEG: INC R3 AJMP OUT EUZ: INC R2 OUT: INC R0 DJNZ R7,LOOP SJMP $

八位有符号数最高位是符号位,符号位为0代表零或正数;符号位为1代表负数。

10、试编程计算2+4+6+8+…..+100的值 ORG 0000H SJMP START

ORG 0030H START: MOV SP,#6FH

MOV 41H,#00H;结果高字节单元清零 MOV 40H,#00H;结果低字节单元清零 MOV 30H, #2;第一个加数 MOV R7, #50;共50个数相加 LOOP: NEXT:

CLR C;进位标志清零

CLR A;累加器(被加数)清零 ADDC A, 30H;做加法

JNC NEXT;没有进位就转NEXT INC 41H;有进位,高字节加1 INC 30H INC 30H; DJNZ R7, LOOP

MOV 40H,A;存和的低8位 SJMP $

因篇幅问题不能全部显示,请点此查看更多更全内容

Top