实验1_清零汇编程序实验

一、实验要求

(1)把外部数据存储区 2000H~20FFH 的内容清零
(2)把外部数据存储区 2000H~20FFH 的内容全部填入FF

二、代码

(1)将把外部数据存储区 2000H~20FFH 的内容清零的汇编程序

	ORG 0000H
	LJMP MAIN
	ORG 0640H
MAIN: MOV R0,#00H            ;R0从00开始计数
	  MOV DPTR,#2000H
LOOP: CLR A
	  MOVX @DPTR,A
	  INC R0
	  INC DPTR               ;指向下一个地址
	  CJNE R0,#00H,LOOP     ;R0记完FF个数,跳出循环
	  SJMP $
	  END 

(2)将把外部数据存储区 2000H~20FFH 的内容清零的C语言程序

#include <reg51.h>
#include <absacc.h>
void main()
{
	unsigned char i;
	unsigned int j;
	for(i=0;i<=0xff;i++)
	{
		j = 0x2000 + i; //起始地址为外部数据存储区:0x2000;
		XBYTE[j]=0x00; //清零
	}
	
	while(1);
}

(3)把外部数据存储区 2000H~20FFH 的内容全部填入FF的汇编程序

		ORG 0000H
		LJMP MAIN
		ORG 0640H
	MAIN: MOV R0,#00H
	      MOV DPTR,#2000H
	LOOP: MOV A,#0FFH     ;A中写入FF  
		 MOVX @DPTR,A
		 INC R0
		 INC DPTR
		 CJNE R0,#00H,LOOP
		 SJMP $
		 END

(4)把外部数据存储区 2000H~20FFH 的内容全部填入FF的C语言程序

#include <reg51.h>
#include <absacc.h>
void main()
{
	unsigned char i;
	unsigned int j;
	for(i=0;i<=0xff;i++)
	{
		j = 0x2000 + i; //起始地址为外部数据存储区:0x2000;
		XBYTE[j]=0xff; //写入FF
	}
	
	while(1);
}
三、调试过程及结果

点击此放大镜进入调试在这里插入图片描述
在Memory窗口填入地址X:2000H回车即可查看该片区域的情况
(1)手动改一下某几个地址的值
在这里插入图片描述
(2)然后点击程序运行
在这里插入图片描述
程序运行后结果如下:
在这里插入图片描述
(3)打开第二个程序并且进入调试
可以看到2000H~20FFH对应的初始内容为00
在这里插入图片描述
执行完程序后
在这里插入图片描述

四、收获与思考

1、16进制的立即数最高位大于等于A时,需要再前面再加上去0(如写#FFH会报错,正确的形式应该是#0FFH)
2、在memory窗口查看ROM或RAM对应地址的内容(查看ROM是C: ,查看片内RAM是D: ,查看片外RAM是X:)
3、 汇编程序文件中不可以像C51文件那样包含其他头文件,所有程序必须写在同一个程序文件中。因此也不适用于大的项目文件的开发。
话说汇编语言有这么大的局限性我们为什么还要学汇编呢?
(某度来的,觉得讲得很有道理)
(1)汇编语言操作直接面向硬件。所以我们在使用汇编语言的时候,我们能够感知计算机的运行过程和原理,从而能够对计算机硬件和应用程序之间的联系和交互形成一个清晰的认识。(2)汇编语言能够让你更好的理解高级语言,尤其是高级语言中的C语言。汇编语言对于内存的操作都是基于内存地址的,而C语言中最令人头疼的指针概念,说白了就是内存的地址。
4、 运行了一次要rst复位后才能进行下一次的运行

其实对单片机中某地址的清零操作就是写入0,通过这个实验不仅知道如何对某些单元清零还知道如对具体地址写入数据。

  • 26
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是该程序的汇编实现,基于51单片机: ```asm ; 交通灯控制实验程序,汇编实现 ORG 0H MOV P1, #11111110B ; P1.0输出高电平,红灯亮起 MOV P3.2, #1 ; P3.2输入口上拉,按键未按下 MOV TMOD, #1 ; 定时器0工作在模式1,16位定时器 MOV TH0, #0 ; 计数初值为50000-1=49999=0xC34F MOV TL0, #0CFH ; 高8位为0xC3,低8位为0x4F SETB ET0 ; 开启定时器0中断 SETB EA ; 开启总中断 SETB TR0 ; 启动定时器0 LOOP: JB P3.2, $ ; 循环等待按键按下 MOV state, #1 ; 强制将状态改为绿灯 SJMP LOOP ; 无限循环 ORG 0BH ; 定时器0中断服务程序 INC cnt ; 每次中断计数器加1 MOV TH0, #0 ; 重置计数初值 MOV TL0, #0CFH ; 高8位为0xC3,低8位为0x4F CJNE state, #0, green_light ; 状态为绿灯 CJNE cnt, #30, exit_isr ; 红灯亮30次 CLR P1.0 ; 红灯熄灭 SETB P1.1 ; 黄灯亮起 SJMP exit_isr ; 退出中断服务程序 green_light: CJNE cnt, #50, exit_isr ; 绿灯亮50次 CLR P1.2 ; 绿灯熄灭 SETB P1.1 ; 黄灯亮起 MOV cnt, #0 ; 计数器清零 MOV state, #0 ; 状态改为红灯 exit_isr: RETI ; 退出中断服务程序 state DB 0 ; 交通灯状态,0表示红灯,1表示绿灯 cnt DB 0 ; 计数器,用于控制交通灯的状态 ``` 这段汇编代码实现了与前面C语言代码类似的功能,不同之处在于使用了不同的语法和指令。例如,使用了MOV指令代替赋值操作,使用了JB指令代替if语句,使用了INC指令代替自增操作,使用了CLR和SETB指令代替赋值0和1操作等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值