keil汇编程序设计实例
Keil创建一个汇编程序地步骤
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中NewProject选项,如图1 - 1所示。
Fih Edit Yi的'■■ 1 ■ ■project Bebu( Ptriph«rtls Tools SVCS Yindor Htlpijt £00窟圏|©|| 1憾皆幽昌■ HarProject?^ |[■port J1 Visionl Projects"Qp«i Project图1 - 13、然后选择你要保存的路径“ C:/实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel89C51,如图1 - 2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图 1 —3所示。
CPU |Vendor:Atm«lDevic«:AT89CS2rFamily:■CS-S1rQ.*t«・tpti on:Select Devi c* for Tar1"Us* E M• *nd«d [ink" CLX51 ) i nxt «*d BIS IUst E KTL dc-<1 AxsfefftbLtr (AXH〕i tiEr lE.d. ◎£ J M-» 1Ell. Edu 0“C«buc PtL>pb*rdl looli SVCS findow ]|tlp窗aH 0 融・1© 口 JS1 B B^"|「°. 宰塞>4%戈怡鹽TI「— - ----------------- --- -----■_ -——■—— …’ ----------------------------- ---- - ------------ 一― J -ss5sa^» [f^—r■*■胴ow5、在图1- 3中,单击“ File ”菜单,再在下拉菜单中单击“NeW'选项。
Keil 的使用与汇编语言上机操作 实验报告
实验名称 Keil 的使用与汇编语言上机操作指导教师罗志祥专业班级光电1406 姓名段昳晖学号 U2014***** 联系电话 137******一、任务要求1.掌握Keil环境的使用1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。
2. 编写多个十六位数的加法程序有4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高八位在后。
要求:和存于R3(高八位)和R2(低八位),进位位存于R4.二、设计思路1.掌握Keil环境的使用1)字节拆分、合并利用汇编语言中的XCHD和SWAP两个语句来实现将八位二进制数拆分为两个四位二进制数并分别存储于不同的存储空间的功能,BCD码与30H相或(加上30H)得到ASCII 码。
将两个ASCII码和0FH相与(高四位清零)得到BCD码,利用SWAP语句将高位数放至高四位,将高位数和低位数相或可实现字节的合并。
2)数据块填充将R0用作计数器,DPTR用作片外数据指针,A作为原始数据来源,依顺序在片外的存储单元内容填充数据。
利用循环语句来减少程序长度,并控制填充单元个数为片外100H个。
利用RO的进位实现,当且仅当RO=00H时,结束循环赋值过程,此时R0已经经历了从00H-0FFH的过程,即计数周期为100。
同时赋值循环也历经了一百次,完成了将片外RAM 7000H-70FFH单元按数据依次递增规律的填充。
2.多个十六位数的加法程序以2个十六位无符号数相加为基础,将输入的4个无符号数(以a、b、c、d代表),两两相加,所得的2个和,再作为加数,求和,得到4个数的和。
其中需要注意的是进位的处理。
四数求和进位,不仅有两和数相加产出的进位还要加上产生两和数时的进位。
其中2个十六位无符号数相加的原理为,先对两数低位求和,提取出其进位,加到两数高位和中,并将高位求和进位,即两数求和进位保存下来。
基于Keil的51单片机汇编程序多文件编译
段名 S E G M E N T 类型
可重定位段的存储类型有 : B I T 、 C O D E 、 D A T A、 I D A T A和 X D A T A 五种 ,分别与五个绝对地址段的指令相对应 。
一
个段在定义完成之后必须通过 R S E G指令选择激 活才能使用 。 当
■陈彩欢 甘 露。
本文结合 K e i 1 V i S i o n 2 程序 开发流程,描述 了 5 1单片机汇编程
通过 该方式 实 现多 文件 编译时 ,插 入 的源文件 既可 以是 扩展 名
为. A S M 的汇编源程序文件 ,也可 以是扩展名为. I N C的包 含文件。注意 在被包含 的源 文件结尾不 能有 E N D指令 ,否则编译会停止运行。
通过多文件编译的使用大大提高了汇编程由于绝对地址段在定义的时候对地址进行了分配链接定位器不序代码的可读性可扩展性同时也很大程度地提高程序代码的执行效能够对其地址进行更改因此很容易造成地址重叠或者内存空间浪费率以及内存空间的使用率避免内存空间的浪费
2 0 1 4年第 7期
电子通信技术
基于 K e i l 的5 1 单 片机汇编程序 多文件编译
通过可重定位段 的使 用 ,在编译 的链接 阶段 , 链 接/ 定位器会将各 个具有相同段名的段合并成一个段 , 并分配绝对地址 , 生成包含绝对地 址的 目标文件和扩展名为. M 5 1 的地址文件。
模块的概念进行描述。
一
个段可以是一块 程序代码 或者是 一个数 据块 。 根据其地址空间是
能够对其地址进行更改 ,因此很容易造成地址重叠或者内存空间浪费 ,
而且在后续对程序进行维护 、 升级 的时候很有 可能需要重新对地址进行 分配 , 非常不利 于程序 的扩展和维护 。 因此绝对地址段通 常是用在某些 特定的场合 ,例如确定中断 向量的人 口地址 、数据存储空间等。 3 、通过可重定位段 实现多文件编译
单片机汇编语言设计实例详解
单片机汇编语言设计实例详解引言:单片机是嵌入式系统中常见的控制器,它具有体积小、功耗低、成本低等特点,被广泛应用于家电、汽车、工业控制等领域。
而汇编语言作为单片机的底层语言,直接操作硬件资源,具有高效性和灵活性。
本文将以一个实例,详细讲解如何使用单片机汇编语言进行设计。
实例背景:假设我们要设计一个温度检测系统,要求实时监测环境温度,并在温度超过某个阈值时触发报警。
硬件准备:1. 单片机:我们选择一款常用的8051单片机作为例子。
2. 温度传感器:我们选择一款数字温度传感器,它可以通过串行通信与单片机进行数据交互。
3. 显示屏:为了方便实时显示温度信息,我们选用一款数码管显示屏。
软件准备:1. Keil C51:这是一款常用的单片机开发软件,支持汇编语言的编写和调试。
2. 串口调试助手:用于测试串口通信功能。
设计步骤:1. 硬件连接:将单片机与温度传感器、显示屏连接起来。
注意接线的正确性和稳定性。
2. 编写初始化程序:使用汇编语言编写单片机的初始化程序,包括端口初始化、中断向量表设置、定时器初始化等。
3. 串口通信设置:通过串口与温度传感器进行数据交互,需要设置串口通信的波特率、数据位数、停止位等参数。
4. 温度检测程序:编写汇编语言程序,实时读取温度传感器的数据,并将数据送至显示屏进行显示。
5. 温度报警程序:在温度超过设定阈值时,触发报警程序,可以通过蜂鸣器等外设发出警报信号。
6. 调试与测试:使用Keil C51进行程序调试,通过串口调试助手测试串口通信和温度显示、报警功能。
设计思路:1. 初始化程序设计:先设置端口的输入输出方向,再设置中断向量表,最后初始化定时器。
这样可以确保程序的稳定性和可靠性。
2. 串口通信设置:根据温度传感器的通信协议,设置串口的波特率、数据位数、停止位等参数。
注意要与传感器的通信规范保持一致。
3. 温度检测程序设计:通过串口读取温度传感器的数据,并进行相应的处理。
如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例
有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子对这个过程进行描述,希望能对初学者有所帮助。
几年来,在这个论坛里笔者得到很多热心人指导,因此也希望藉此尽一点绵薄之力。
在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。
例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。
该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。
step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
相关文件如下://main.c文件#include < reg51.h >#define uchar unsigned char#define uint unsigned intextern uint AFUNC(uchar v_achr,bit v_bflag);void main(){ bit BFLAG; uchar mav_chr; uint mvintrslt; mav_chr=0xd4; BFLAG=1; mvintrslt=AFUNC(mav_chr,BFLAG);}//CFUNC.c文件#define uchar unsigned char#define uint unsigned intuint AFUNC(uchar v_achr,bit v_bflag){ uchar tmp_vchr; uint tp_vint; tmp_vchr=v_achr; tp_vint=(uint)v_bflag; return tmp_vchr+(tp_vint<<8);}step2. 在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;step3. 根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工 程的最后文件;step4. build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。
Keil创建一个汇编程序的步骤
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图1-1所示。
图1-13、然后选择你要保存的路径“C:/ 实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel 89C51,如图1-2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图1-3所示。
图1-2图1-35、在图1-3中,单击“File”菜单,再在下拉菜单中单击“New”选项。
新建文件后屏幕如图1-4所示。
图1-46、此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如1-5图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名如”Text1.asm”,然后,单击“保存”按钮。
图1-57、回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,并单击“Add File to Group ‘Source Group 1’”选项,在出现的对话框1-6中选中“Text1.asm”,此时出现对话框如图1-7所示,在Type 选择栏中选择第二项“Assembly Language File”,确定文件类型为汇编语言。
8、然后得到如图1-8所示的操作界面,注意比对左侧编辑框项目是否和图1-8一致,下面可以在右侧空白栏中编写汇编程序了。
图1-6图1-7图1-8实验一汇编语言实验一、实验目的1.利用单片机的P1 口作I/O 口,掌握P1 口同时作为输入和输出的用法。
2.掌握汇编语言程序编写方法。
二、实验设备(仪器)PC 微机一台,Keil软件三、实验内容1.寻址方式实验。
2. 单片机I/O口实验。
keil5 编译实例
keil5 编译实例Keil 5 是一款流行的集成开发环境(IDE),主要用于编写和编译单片机程序。
下面是一个简单的Keil 5 编译实例,演示如何创建一个51 单片机项目并将其编译成功。
1. 打开Keil 5 IDE。
如果这是第一次使用Keil 5,请先安装软件。
在安装过程中,选择原来Keil 5 MDK 的安装路径。
2. 创建一个新项目。
在Keil 5 主界面的“Project”菜单中,选择“New uVision Project”。
在弹出的对话框中,输入项目名称、选择单片机型号(如AT89C51),并设置项目保存路径。
点击“OK”完成项目创建。
3. 添加源文件。
在项目目录下,创建一个新文件夹,如“Source Files”。
在此文件夹中,创建一个 C 文件,例如“main.c”。
在此文件中,编写以下简单的代码:```c#include <reg52.h>void main() {while (1) {P1 = 0xfe; // 点亮P1 口的LEDdelay(1000); // 延时1 秒P1 = 0x00; // 熄灭P1 口的LEDdelay(1000); // 延时1 秒}}```4. 配置项目。
在项目目录下,找到“Keil uVision2”文件夹,双击“Options for Target 'Target 1'”打开配置对话框。
在“Output”选项卡中,确保“Assembly Output”和“C/C++ Output”均选中。
在“C/C++ Output”选项卡中,选中“Include path”并设置项目目录下的“Header Files”文件夹路径。
点击“OK”保存配置。
5. 编译项目。
点击Keil 5 主界面上的“Build”按钮或按F7 键开始编译项目。
编译完成后,查看“Output”窗口,如果显示“Build Finished”且没有错误和警告,说明编译成功。
Keil实例教程(一)编辑源代码,建立单一工程
Keil 工程文件的建立、设置与目标文件的获得单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
我们将通过一些实例来学习Keil软件的使用,在这一部份我们将学习如何输入源程序,建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。
图1所示电路图使用89C51单片机作为主芯片,这种单片机性属于MCS-51系列,其内部有4K的FLASH ROM,可以反复擦写,非常适于做实验。
89C51的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的第一个任务是让接在P1引脚上的发光二极管依次循环点亮。
一、Keil工程的建立首先启动Keil软件的集成开发环境,这里假设读者已正确安装了该软件,可以从桌面上直接双击uVision的图标以启动该软件。
(完整版)Keil创建一个汇编程序的步骤
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图1-1所示。
图1-13、然后选择你要保存的路径“C:/ 实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel 89C51,如图1-2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图1-3所示。
图1-2图1-35、在图1-3中,单击“File”菜单,再在下拉菜单中单击“New”选项。
新建文件后屏幕如图1-4所示。
图1-46、此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如1-5图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名如”Text1.asm”,然后,单击“保存”按钮。
图1-57、回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,并单击“Add File to Group ‘Source Group 1’”选项,在出现的对话框1-6中选中“Text1.asm”,此时出现对话框如图1-7所示,在Type 选择栏中选择第二项“Assembly Language File”,确定文件类型为汇编语言。
8、然后得到如图1-8所示的操作界面,注意比对左侧编辑框项目是否和图1-8一致,下面可以在右侧空白栏中编写汇编程序了。
图1-6图1-7图1-8实验一汇编语言实验一、实验目的1.利用单片机的P1 口作I/O 口,掌握P1 口同时作为输入和输出的用法。
2.掌握汇编语言程序编写方法。
二、实验设备(仪器)PC 微机一台,Keil软件三、实验内容1.寻址方式实验。
2. 单片机I/O口实验。
微机实验报告KEIL的利用与汇编语言上机操作
实验名称 Keil的利用与汇编语言上机操作成绩指导教师专业班级姓名学号联系一、任务要求二、设计思路三、资源分派四、流程图五、源代码(含文件头说明、语句行注释)六、程序测试方式与结果试探题Keil的利用与汇编语言上机操作一、任务要求编写多个十六位数的加法程序,有4个十六位无符号数,持续寄存在20H开始的片上数据区中,低八位先存,高八位在后。
要求:和存于R3(高八位)和R2(低八位),进位位存于R4。
二、设计思路1.先将20H21H和22H23H的两个16位数相加。
用R0,R1存储被加的两个数的地址,低位相加以后,结果保留在R2,将R0,R1存储的地址自加1,进行高位相加,结果保留在R3。
完成一次两个16位数的相加以后,低位相加结果存储在18H,高位结果存储在19H,进位保留在R42.R0改成18H,R1改成24H,将第一次的结果再和第三个数相加,假设有进位,R4加13.R0改成18H,R1改成26H,将第二次的结果再和第四个数相加,假设有进位,R4加14.最后R2贮存的是低八位,R3保留的高八位,R4保留的总进位三、资源分派20H--27H 保留四个16位数R2 保留每次加法的低8位R3 保留每次加法的高8位R0 R1每次加法运算的两个数的地址R4 保留进位结果19H 18H 两个16位数以后的数高低位的保留地址A 中间运算四、流程图五、源代码File name: jiafa.asmORG 0000HMOV 27H,#25HMOV 26H,#25HMOV 25H,#25HMOV 24H,#0E5HMOV 23H,#0F5HMOV 22H,#25HMOV 21H,#25HMOV 20H,#0F5H ;赋值CLR CMOV R2,#00H ;暂存每次加法的低位结果MOV R3,#00H ;暂存每次加法的高位结果MOV R4,#00H ;记录4个16位数相加的进位MOV R0,#20H ;第一次相加MOV R1,#22HMOV A,@R0ADD A,@R1MOV R2,A ;低位相加和保留到R2INC R0INC R1 ;地址加1,进行高位相加MOV A,@R0ADDC A,@R1MOV R3,A ;高位相加和保留到R3JNC JINW1 ;若是有进位,R4加1MOV A,R4ADD A,#01HMOV R4,AJINW1: CLR C ;将第一次相加的结果与第三个数相加MOV 18H,R2 ;保留每次运算后的低位结果在18HMOV 19H,R3 ;保留每次运算后的高位结果在19H MOV R0,#18H ;将结果和新的数相加MOV R1,#24H ;新数的地址MOV A,@R0ADD A,@R1MOV R2,AINC R0INC R1MOV A,@R0ADDC A,@R1MOV R3,AJNC JINW2MOV A,R4ADD A,#01HMOV R4,AJINW2:CLR C ;将第二次相加的结果与第四个数相加MOV 18H,R2MOV 19H,R3MOV R0,#18HMOV R1,#26HMOV A,@R0ADD A,@R1MOV R2,AINC R0INC R1MOV A,@R0ADDC A,@R1MOV R3,AJNC JINW3MOV A,R4ADD A,#01HMOV R4,AJINW3:SJMP $END六、程序测试方式与结果1.字节拆分、归并程序的调试:第一步:拆分为两个数第二步:转换为ASCII码第三步:掏出两个ASCII码并归并2.数据块填充程序调试:第一步:从7000H开始赋值,每赋值一次,R0加1记录次数,A也加1第二步:R0加到00H,终止循环赋值总共运行256次3.四个16位数的相加四个数别离为25F5H,F525H,25E5H,2525H观看每次相加以后各个寄放器的值,进位的值,25F5H与F525H相加,应该是11B1AH19H18H处别离是1B 1A ,R4保留的进位为111B1AH与25E5相加,结果应该是140FFH140FFH与2525H相加,结果应该是16624H测试以后的结果为16624H,R4保留进位位,高低8位别离保留在R3,R2七、试探题1.在调试时,Registers窗口中能够查看Regs和Sys,别离是工作寄放器和SFRVIEW-MEMORY WINDOWS-MEMORY 1/2/3/4,查看片内RAM,输入D:18H格式的语句,查看片外RAM,输入X:3000H格式的语句,查看程序代码,输入C:0100H格式的语句Disassembly窗口可查看各程序指令寄存的程序地址,在运用PC查表时能够用到,也能够查看指令的长度2.字节拆分、归并:(利用ADD指令)MOV 30H,#49HMOV A,30HANL A,#0FH ;掏出低位ADD A,#30H ;变成ASCII码MOV 31H,A ;结果存于31HMOV A,30HANL A,#0F0HSWAP A ;掏出高位ADD A,#30H ;变成ASCII码MOV 32H,A ;结果存于32HMOV A,31H ;掏出低位的ASCII码ANL A,#0FH ;转为BCDMOV 33H,A ;存于33HMOV A,32H ;掏出高位的ASCII码ANL A,#0FH ;转为BCDSWAP AADD A,33H ;高位低位相加,归并在一路MOV 33H,A ;把归并的数存在33H3.CLR A 改成MOV A,#FFHINC A 改成DEC A4.MOV DPTR,#7000H 改成MOV DPTR,#7010HCJNE R0,#00H,FILL1 改成CJNE R0,#14,FILL1 5.在每条ADD或ADDC指令的后面加上一条DA A指令。
用Keil在C中嵌入汇编
有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编比较常用的keil中嵌入汇编的方法如下所示:如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL 就知道这中间的一段是汇编了。
在有加入汇编的文件中,还要设置编译该文件时的选项Generate Assembler SRC File 生成汇编SRC文件Assemble SRC File封装汇编文件(如图三的状态为选中)选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。
为了能对汇编进行封装还要在项目中加入相应的封装库文件,在笔者的项目中编译模式是小模式所以选用C51S.LIB。
这也是最常用的。
这些库文件是中KEIL安装目录下的LIB目录中。
加好后就可以顺利编译了。
(注:我只在7.0以上版本使用过)汇编与C语言混合编程的关键问题1 C程序变量与汇编程序变量的共用为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:.ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff在汇编程序中引用而在C程序可直接定义的变量:unsigned char to_dte_buff[BUFF_SIZE];//DSP发向PC机的数据int to_dte_num;//缓冲区中存放的有效字节数int to_dte_store;//缓冲区的存放指针int to_dte_read;//缓冲区的读取指针这样经过链接就可以完成对应。
2 程序入口问题在C程序中,程序的入口是main()函数。
而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为main _start。
这样,混合汇编出来的程序得不到正确结果。
因为C到ASM 的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。
keil5 汇编32位除法
在Keil uVision5中,进行32位除法的一种方法是使用SDIV汇编指令。
SDIV指令用
于有符号整数的除法。
以下是一个简单的示例程序,演示如何在Thumb模式下使
用SDIV进行32位整数除法。
上述示例中,我们使用MOV指令将被除数和除数加载到R0和R1寄存器中。
然后,我们使用SDIV指令执行除法操作,将商存储在R2中,余数存储在R3中。
你可以根据需要添加更多的代码,比如将商存储到某个变量中。
请注意,在Thumb模式下,SDIV指令只能用于有符号整数。
如果需要无符号整数
除法,可以考虑使用UDIV指令。
请确保你的目标架构和指令集支持这些指令。
这只是一个简单的示例,实际应用中可能需要更多的代码来处理各种情况,比如除数为零的情况等。
在实际应用中,请根据你的需求和具体情况添加错误处理和边界检查。
(完整word版)keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程1. C语言中嵌入汇编1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM;Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;4、编译,即可生成目标代码。
来个实例吧:#i nclude <reg51.h>void main(void){P2=1;#pragma asmMOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;}2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用先来个例子:其中example.c和example.a51为项目中的两个文件***********************example.c***********************************************extern void delay100();main(){delay100;}***********************example.a51***********************************************?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段PUBLIC DELAY100; //声明函数RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方DELAY100:MOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DELRETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。
keil定义p2口按键汇编语言
keil定义p2口按键汇编语言Keil是一种广泛使用的集成开发环境(IDE),适用于嵌入式系统的软件开发。
在使用Keil进行嵌入式开发时,经常需要通过定义和配置硬件外设来实现特定的功能。
本文将介绍如何使用Keil来定义P2口作为按键输入,并以汇编语言编写相应的代码。
P2口是一种常见的GPIO(通用输入输出)口,可以通过配置来将其设置为输入模式,并检测其状态以实现按键的功能。
下面是一个示例的代码,展示了如何定义P2口为按键输入,并在键按下时触发相应的动作。
首先,在Keil的工程中,需要配置P2口为输入模式。
这可以通过修改相应的寄存器来实现。
具体而言,我们需要将P2口的对应位(比如P2.0)设置为0,以配置为输入模式。
接下来,在汇编代码中,我们可以使用P2口的状态来检测按键的状态。
当P2口为低电平时,表示按键被按下,我们可以执行相应的操作。
例如,可以设置一个变量来记录按键被按下的次数,或者触发其他的事件。
下面是一个示例的汇编代码,展示了如何检测P2口按键的状态并触发相应的动作:```ORG 0HMOV P2, #0FFH ; 配置P2口为输入模式MAIN:JB P2.0, KEY_PRESSED ; 如果P2.0为低电平,跳转到KEY_PRESSED标签JMP MAIN ; 如果P2.0为高电平,则继续循环检测KEY_PRESSED:; 在这里执行按键被按下时的操作; 可以设置一个计数器来记录按键被按下的次数,或触发其他的事件JMP MAIN ; 执行完操作后,跳回主循环END```在上述代码中,首先将P2口配置为输入模式,然后进入主循环。
在主循环中,通过JB指令检测P2.0口的状态,如果为低电平,则跳转到KEY_PRESSED标签。
在KEY_PRESSED标签中,可以执行按键被按下时的操作。
然后,通过JMP指令跳回主循环,继续检测P2口的状态。
这是一个简单的示例,演示了如何在Keil中使用汇编语言来定义P2口为按键输入。
KEILC51程序中如何嵌入汇编
KEILC51程序中如何嵌⼊汇编模块内接⼝:使⽤如下标志符:asm汇编语句endasm注意:如果在程序中使⽤了,注意在Keil编译器中需要激活Properties中的“Generate Assembler File” 和“Assembler File ”两个选项1、把"xx.c"加⼊⼯程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler File”和“Assemble SRC File”打上⿊勾有效;2、根据选择的编译模式,把相应的库⽂件象加"xx.c"⼀样加⼊⼯程中并放在"xx.c"下⾯,如smail模式下选"keil\\lib\s.lib"加⼊⼯程中,如果要进⾏把"keil\c51\lib\c51fpl.lib"也加⼊⼯程中。
即:在 Keil 安装⽬录下的 \C51\LIB\ ⽬录的LIB ⽂件如下:C51S.LIB - 没有的 Small moC51C.LIB - 没有的 Compact moC51L.LIB - 没有浮点运算的 moC51FPS.LIB - 带浮点运算的 Small modelC51FPC.LIB - 带浮点运算的 Compact modelC51FPL.LIB - 带浮点运算的 model3、在"xx.c"头⽂件中加⼊优化:⽐如 (4,speed)4、在"xx.c"中加⼊汇编代码#pragma ASM;Assembler Code Here#pragma ENDASM5、编译⽣成xx.hex例:#include<reg52.h>void delay(void){#pragma asmR5,#5DEL:R6,#2DEL1:R7,#255DJNZ R7,$DJNZ R6,DEL1DJNZ R5,DEL;MOV A,P1; A;MOV P1,A#pragma endasm}void delay1(unsigned int cnt){while(cnt--);}void main(){while(1){delay1(1000);P1=0x55;delay();}}有时候⽤到需要精确延时之类的⼦程序时,⽤C语⾔⽐较难控制,这时候就可以在C中嵌⼊汇编⽐较常⽤的keil中嵌⼊汇编的⽅法如下所⽰:如图⼀,在C⽂件中要嵌⼊汇编的地⽅⽤#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的⼀段是汇编了。
keil 汇编程序设计实例
山东职业学院
单片机编程语言概述
程序设计语言有3种: 机器语言、 汇编语言和高级语言。 1 机器语言:
计算机能直接识别和执行的二进制代码形式的指令称为机器指令,机器指令的集合称为机器语言。每种计算机 系统都有自己的机器语言, 即不同计算机系统机器语言不相同。
2 汇编语言
要求画出流程图,写出源程序,并调试正确。
循环程序实例1
;编程将RAM单元 00H-30H依次 填充数据00H- 30H。 ;即 (00H)=00H, (01H)=01H, ..., (30H)=30H
开始 (A)←0 (R0) ←0 (R1) ←31H ((R0))←(A) (R0)←(R0)+1 (A) ←(A)+1 (R1)-1=0?
Y N
结束
ORG 0000H MOV 50H,#0 MOV 51H,#0 MOV R0,#30H MOV R1,#16 L: MOV A, @R0 ADD A,51H MOV 51H,A CLR A ADDC A,50H MOV 50H,A INC R0 DJNZ R1,L SJMP $ END
循环程序练习2
循环程序实例2
;编程将RAM 30H 单元开始的16 个无符号数相 加,和的高字 节放在50H单元, 低字节放在51H 单元。
开始
(50H)(51H)←0 (R0) ←30H (R1) ←16 (51H) ←((R0))+(51H) (50H) ←进位+(50H) (R0) ←(R0)+1 (R1)-1=0?
Y N
ORG 0000H CLR A MOV R0,#0 MOV R1,#31H L: MOV @R0,A INC R0 INC A DJNZ R1,L SJMP $ END
keil编写样例
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define MotorData P0sbit d1=P1^0;uchar num;uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; void delay(uint z);void main(){for(num=0;num<8;num++){P0=CW[num];delay(5);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}(点亮发光二极管)点亮后停止#include<reg52.h>sbit p1_1=P1^0; //位声明定义void main(){p1_1=0;while(1);}(点亮发光二极管,,,一个一个交替亮)#include<reg52.h>sbit P1_1=P2^0;sbit P1_2=P2^1;sbit P1_3=P2^2;sbit P1_4=P2^3;sbit P1_5=P2^4;sbit P1_7=P2^6;sbit P1_8=P2^7;unsigned int a;void main(){while(1){a=500000;P1_1=0;while(a--);a=500000;P1_1=1;while(a--);a=500000;P1_2=0;while(a--);a=500000;P1_2=1;while(a--);a=500000;P1_3=0;while(a--);a=500000;P1_3=1;while(a--);a=500000;P1_4=0;while(a--);a=500000;P1_4=1;while(a--);a=500000;P1_5=0;while(a--);a=500000;P1_5=1;while(a--);a=500000;P1_6=0;while(a--);a=500000;P1_6=1;while(a--);a=500000;P1_7=0;while(a--);a=500000;P1_7=1;while(a--);a=500000;P1_8=0;while(a--);a=500000;P1_8=1;while(a--);}}(点亮发光二极管)#include<reg52.h>sbit p1_1=P1^0; //位声明定义unsigned int a; //定义一个变里,无符号整型void main(){while(1){a=50000; //赋一个初值P1_1=0;while(a--);a=50000;P1_1=1;while(a--);}}(点亮发光二极管并延时嵌套)(调用子函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1^0;void delay(); //函数的声明无返回型无参数型void main(){while(1){D1=0;delay();D1=1;delay();}void delay(){uint x,y;for(x=100;x>0;x--){ for(y=100;y>0;y--); //for语句的嵌套{}}}(蜂鸣器)(调用函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;P1=temp;beep=0;while(1){temp=_crol_(temp,1); //调用函数(循环左移一位)delay(60);P1=temp;}}void delay(uint z){uint x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}(数码管显示1)#include<reg52.h>sbit dula=P2^6; //位声名sbit wela=P2^7; //位声名void main(){wela=1; //位选打开P0=0xfc; //十六进制数wela=0; //位选关闭dula=1; //段选打开P0=0x3f;dula=0; //位选关闭while(1);}(数码管显示2)(带中断系统)//带编码表数组#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //位声名sbit wela=P2^7; //位声名sbit d1=P1^0;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(uint z);void main(){EA=1; //开总中断继存器EX0=1; //开外部中断0IT0=1; //也等于//TCON=0x01;wela=1;P0=c0; //八个数码管全亮wela=0;while(1){for(num=0;num<16;num++){d1=1; //在这里让d1灭掉dula=1;P0=table[num];dula=0;delay(1000);}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void exter0() interrupt 0 //表示中断服务子程序{d1=0;} //P3_2口有低电平时发生中断。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该伪指令的功能是规定其后面目标程序的起始地址。 它放在一段源程序(主程序、 子 程序)或数据块的前面, 说明紧跟在其后的程序段或数据块的起始地址就是指令中的 16 位地址。
例如: ORG 2000H START: MOV A, #7FH
c4 MCS-51汇编程序设计
山东职业学院
单片机编程语言概述
程序设计语言有3种: 机器语言、 汇编语言和高级语言。 1 机器语言:
计算机能直接识别和执行的二进制代码形式的指令称为机器指令,机器指令的集合称为机器语言。每种计算机 系统都有自己的机器语言, 即不同计算机系统机器语言不相同。
2 汇编语言
AI: BIT P1.0 经以上伪指令定义后, 在编程中就可以把FLG和AI作为位地址来使用。
源程序的编辑与汇编
源程序的编辑
使用任一文本编辑软件输入汇编语言源程序。 保存时,汇编语言源程序文件的扩展名为.ASM
…
伪指令
(2) 结束汇编伪指令END。 格式: [标号: ] END
END是汇编语言源程序的结束标志, 表示汇编结束。 在END以后所写的指令, 汇编程序都不予以 处理。 一个源程序只能有一个END命令。 在同时包含有主程序和子程序的源程序中, 也只能有一个 END命令, 并放到所有指令的最后, 否则, 就有一部分指令不能被汇编。
DS 20H DB 30H, 8FH 汇编后: 从 1000H开始, 预留 32(20H)个字节的内存单元, 然后从 1020H开始, 按照下一条DB指令赋值, 即 (1020H)=30H, (1021H)=8FH。 保留的存储空间将由程序的其它部分决定它们的用处。
伪指令
(6) 等值伪指令EQU。 格式: 标号:EQU 项 该伪指令的功能是将指令中项的值赋予本语句的标号。 项可以是常数、 地址标号或表达式。 例如:TAB: EQU 1000H TAB1: EQU TAB 前一条伪指令表示TAB地址的值为1000H, 后一条表示符号地址TAB1与TAB等值(可以互换), 需
(2006H) = 42H ; ′BCD′中B的ASCII码
(2002H)=7FH
(2007H) = 43H ; ′BCD′中C的ASCII码
(2003H) = 49H ; 十进制数 73 以十六进制数存放 (2008H) = 44H ; ′BCD′中D的ASCII码
(2004H) = 35H ; 数字 5 的ASCII码ห้องสมุดไป่ตู้
例如: ORG 1500H TAB2: DW 1234H, 80H
汇编以后: (1500H)=12H, (1501H)=34H, (1502H)=00H, (1503H)=80H。 (5) 预留存储空间伪指令DS。
格式: [标号: ]DS 表达式 该伪指令的功能是从标号指定的单元开始, 保留若干字节的内存空间以备源程序使用。 存储空间内 预留的存储单元数由表达式的值决定。 例如: ORG 1000H
TAB1: DB 30H, 8AH, 7FH, 73
DB ′5′,′A′,′BCD′
由于ORG 2000H, 所以TAB1的地址为2000H, 因此以上伪指令经汇编以后, 将对 2000H开始的若干
内存单元赋值:
(2000H) = 30H
(2005H) = 41H ; 字母A的ASCII码
(2001H)=8AH
伪指令
(4) 定义字伪指令DW。 格式: [标号: ]DW 项或项表 DW伪指令与DB的功能类似, 所不同的是DB用于定义一个字节(8 位二进制数), 而DW则用于定义
一个字(即两个字节, 16 位二进制数)。 在执行汇编程序时, 机器会自动按高 8 位先存入, 低 8 位后存 入的格式排列, 这和MCS—51 指令中 16 位数据存放的方式一致。
要注意的是, 在同一程序中, 用EQU伪指令对某标号赋值后, 该标号的值在整个程序中不能再改变。 (7) 位地址赋值伪指令BIT。
格式: 标号 BIT位地址 该伪指令的功能是将位地址赋予特定位的标号, 经赋值后就可用指令中BIT左面的标号来代替BIT 右边所指出的位。 例如: FLG: BIT F0
(3) 定义字节伪指令DB。
格式: [标号: ]DB 项或项表
其中项或项表指一个字节, 或用逗号分开的字符串, 或以引号括起来的字符串(一个字符用ASCII 码表示, 就相当于一个字节)。 该伪指令的功能是把项或项表的数值(字符则用ASCII码)存入从 标号开始的连续存储单元中。
例如: ORG 2000H
3 高级语言
高级语言(如 PASCAL、 C、 FORTRAN、 BASIC等)是一种面向问题或过程的语言。 接近于自然语言和数 学算法, 与机器的硬件无关, 用户编程时不必仔细了解所用计算机的具体性能和指令系统。 高级语言不 但直观、 易学、 易懂, 而且通用性强, 可以在不同的计算机上运行, 因此可移植性好。
用助记符描述的指令系统, 称为汇编语言。 汇编语言也是面向机器的, 每种计算机系统都有它自己的汇编语言, 用汇编语言编写的程序, 称为汇编语言源程序或汇编源程序。
特点: (1)汇编语言比机器语言容易理解,但必须通过编译程序翻译成机器语言,才能被计算机执行。 (2)汇编语言直接访问CPU硬件,响应速度快,程序存储器利用率高。 (3)利用汇编语言编程要求程序设计人员必须对机器的硬件结构和指令系统熟悉。
本章内容
伪指令 源程序的编辑与汇编 汇编语言程序设计
设计步骤 流程图 设计实例
伪指令
在编制汇编语言源程序的过程中,除了使用mcs-51指令系统外,还使用伪指令。汇编语言 源程序通过汇编程序的编译生成目标代码(机器语言程序),伪指令是对汇编过程进 行控制的指令,主要用来指定程序或数据的起始位置, 给出一些连续存放数据的确定 地址, 或为中间运算结果保留一部分存储空间以及表示源程序结束等。伪指令不要求 计算机进行任何操作, 也没有对应的机器码, 不产生目标程序, 不影响程序的执行。不 同版本的汇编语言, 伪指令的符号和含义可能有所不同, 但是基本用法是相似的。