题42
编写把四位BCD码转换为二进制数的子程序。
程序源码:
;子程序入口参数:4位BCD码数分别存入4个内存单元,(R0)=千位数码地址,(R2)=3
;子程序出口参数:转换后的二进制数结果存入R3(高字节),R4(低字节)
ORG 0000H
MOV R3,#00H
MOV A,@R0
MOV R4,A
DB1:
MOV A,R4
MOV B,#10
MUL AB
MOV R4,A
XCH A,B
MOV B,#10
XCH A,R3
MUL AB
ADD A,R3
XCH A,R4
INC R0
ADD A,@R0
XCH A,R4
ADDC A,#0
MOV R3,A
DJNZ R2,DB1
END
强化指令2:DA A
***已知( A)=59H,执行指令 INC A 后,( A)= 5A H ,继续执行 DA A 后,(A)= ? ***
答案:
(A)= 60 H
小知识点补充9:
程序状态字PSW
PSW.7:Cy进位标志
PSW.6:Ac半进位标志
PSW.5:F0用户设定标志
PSW.4:RS1 4组工作寄存器组选择控制位
PSW.3:RS0 4组工作寄存器组选择控制位
PSW.2:OV溢出标志
PSW.0:P奇偶校验位 P=1表示A中有奇数个1
备注:
RS1 RS0: 00 内部RAM:00H-07H 01 内部RAM:08H-0FH 10 内部RAM:10H-17H 11 内部RAM:18H-1FH
小知识点补充10:(与单片机C语言有关)
C51变量的存储类型
存储器类型 描述
data 直接寻址内部数据存储区,访问变量速度最快(128B)
bdata 可位寻址内部数据存储区,允许位与字节混合访问(16B)
idata 间接寻址内部数据存储区,可访问全部内部地址空间(256B)
pdata 分页(256B)外部数据存储区,由MOVX @Ri类指令访问
xdata 外部数据存储区(64KB),由MOVX @DPTR类指令访问
code 程序存储区(64KB),由MOVC类指令访问
C51的存储器模式
存储器模式 默认存储器模式 特点
SMALL data 小模式,变量默认在片内RAM,空间小,速度快
COMPACT pdata 紧凑模式,变量默认在片外RAM的页(256B,页号由P2口决定)
LARGE xdata 大模式,变量默认在片外RAM的64KB的范围内,空间大,速度慢
sfr:对特殊功能寄存器定义
sbit:对可独立寻址的位变量的定义
absacc.h中的内容:
/*--------------------------------------------------------------------------
ABSACC.H
Direct access to 8051, extended 8051 and Philips 80C51MX memory areas.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __ABSACC_H__
#define __ABSACC_H__
#define CBYTE ((unsigned char volatile code *) 0)
//访问code字符型
#define DBYTE ((unsigned char volatile data *) 0)
//访问data区字符型
#define PBYTE ((unsigned char volatile pdata *) 0)
//访问pdata或IO区字符型
#define XBYTE ((unsigned char volatile xdata *) 0)
//访问xdata或IO区字符型
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
#ifdef __CX51__
#define FVAR(object, addr) (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr) (*((object const far *) (addr)))
#define FCARRAY(object, base) ((object const far *) (base))
#else
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
#endif
#endif
概念考题1:在 MCS-51中需要外加电路实现中断撤除的是( B )
A.定时中断 B. 脉冲触发方式的外部中断
C.串行中断 D. 电平触发方式的外部中断
小知识点补充11:
SJMP、AJMP和 LJMP的异同点
SJMP:相对寻址方式转移指令,短转移指令,转移范围为当前 PC的值的 -128~127
字节。
AJMP:绝对转移指令,转移范围为当前PC值所在的页面 2K范围内。
LJMP:长转移指令。转移范围为64K,与当前PC值无关
题43
内部 RAM 60H 和 70H开始的单元分别存放着 16 个 16 进制数,请将对应单元的内容相加(不考虑溢出),并将和存入外部 RAM 1000H 开始的单元中。
解析:
每个单元存放 2 个 16 进制数, 故 16 个 16 进制数占用 8 个单元
程序源码:
ORG 0000H
LJMP START
ORG 0030H
START:
MOV R0,#60H
MOV R1,#70H
MOV DPTR,#1000H
CLR C
MOV R2,#08H
LOOP:
MOV A,@R0
ADDC A,@R1
MOVX @DPTR,A
INC R0
INC R1
INC DPTR
DJNZ R2,LOOP
SJMP $
END
题44
请编写多字节无符号数减法程序。被减数存放在内部 RAM 20H开始的 8 个单元中,减数存放在内部 RAM 30H开始的 8 个单元,请将差存放到外部 RAM 1000H开始的 8 个单元中,借位存放到 OV标志中。
注意:所有数据均按照从低字节到高字节的顺序存放。
备注:前文有类似题
程序源码:
ORG 0000H
LJMP START
ORG 002FH
START:
MOV R0,#20H
MOV R1,#30H
MOV DPTR,#1000H
MOV R7,#08H
CLR C
LOOP :
MOV A,@R0
SUBB A,@R1
MOVX @DPTR,A
INC R0
INC R1
INC DPTR
DJNZ R7,LOOP
MOV OV,C
SJMP $
END