keil 汇编程序设计实例
实验四 汇编语言程序设计实验(KEIL)
实验四汇编语言程序设计实验一、实验目的1.了解单片机基本程序结构,掌握码数转换和查表程序设计方法;2.掌握在µVision环境中分析程序及其操作结果。
二、实验仪器和设备Keil软件;THKSCM-2综合实验装置;三、实验原理及实验内容1.示例及相关设置(1)建立一个文件夹:lx41。
(2)利用菜单File的New选项进入编辑界面,输入下面的源文件,以lx41.asm文件名存盘到lx41文件夹中。
ORG0000HMOV R2,#32HMOV A,R2SWAP AANL A,#0FHMOV B,#0AHMUL ABMOV R3,AMOV A,R2ANL A,#0FHADD A,R3MOV20H,ASJMP$END(3)在lx41文件夹下建立新工程,以文件名lx41存盘(工程的扩展名系统会自动添加)。
(4)在Project菜单的下拉选项中,单击Options for Target‘Target1’,在弹出的窗口中要完成一下设置:○1单片机芯片选择AT89C51选择完器件,按“确定”后会弹出一个提示信息框,提示“Copy Startup Code to Project Folder and Add File to Project?”,选择“是”。
○2晶振频率设为11.0592MHz。
○3Output标签下的Create HEX File前小框中要打钩。
○4在Debug标签选择Use Simulator(软件模拟)。
(5)在Project菜单的下拉选项中,单击build Target选项完成汇编,生成目标文件(.HEX)。
利用单步、执行到光标处两种方法运行程序,观察程序运行的结果。
(6)观察结果,分析程序,说明功能。
(7)修改程序,完成与此对应的反向转换。
(参考修改程序如下)ORG0000HMOV R2,21HMOV A,R2SWAP AANL A,#0FHMOV B,#10HMUL ABMOV R3,AMOV A,R2ANL A,#0FHADD A,R3MOV20H,ASJMP$END2.示例及相关设置(1)建立一个文件夹:lx42。
keilC中嵌入汇编的方法
keilC中嵌⼊汇编的⽅法注:本⽂摘⾃⽹络在这个例⼦⾥,阐述了编写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 SRCFile”和“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菜单,在弹出的下拉菜单中选中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创建一个汇编程序的步骤
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 C语言与汇编语言混合编程
keil C语言与汇编语言混合编程1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler 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 汇编程序设计实例
山东职业学院
单片机编程语言概述
程序设计语言有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
KeilC51使用教程
Keil C语言程序设计示例教程(开发C8051F310)使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。
KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目的创建和使用方法。
1.首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图, 创建了一个名为“PRJ_C8051”文件夹2.点击桌面上的Keil uVision4图标,出现启动画面:3.点击“project --- New uVision Project”新建一个工程:4.在对话框,选择放在刚才建立的“PRJ_C8051”文件夹下,给这个工程取个名为Test_C8051F310, 然后保存,工程的后缀为uvporj。
5.弹出一个框,在CPU类型下我们找到并选中“Silicon Laboratories. Inc.”下的C8051F3106.加入C8051起动码7.建立一个源程序文本8.在下面空白区别写入或复制一个完整的C程序:9.输入源程序文件名名称,示例输入“Test_C8051F310.c”,然后保存:10.把刚创建的源程序文件加入到工程项目文件中。
11.设置---目标(第1步~ 第4步)15.工程项目创建和设置全部完成!点击保持并编译16.在C8051F310中的C语言程序示例//-----------------------------------------------------------------------------// Includes// 在c8051f310.h在头文件中定义了C8051F310的寄存器、输入/输出的端口//-----------------------------------------------------------------------------#include <c8051f310.h> // SFR declarations//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F30x//-----------------------------------------------------------------------------sfr16 TMR2RL = 0xca; // Timer2 reload valuesfr16 TMR2 = 0xcc; // Timer2 counter//-----------------------------------------------------------------------------// Global CONSTANTS//-----------------------------------------------------------------------------#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hzsbit LED = P0^0; // LED='1' means ON//-----------------------------------------------------------------------------// Function PROTOTYPES//-----------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);void Timer2_Init (int counts);void Timer2_ISR (void);//-----------------------------------------------------------------------------// MAIN Routine//-----------------------------------------------------------------------------void main (void){// disable watchdog timerPCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer// enable)SYSCLK_Init (); // Initialize system clock to// 24.5MHzPORT_Init (); // Initialize crossbar and GPIOTimer2_Init (SYSCLK / 12 / 10); // Init Timer2 to generate// interrupts at a 10Hz rate.EA = 1; // enable global interruptswhile (1) // spin forever{}}//-----------------------------------------------------------------------------// SYSCLK_Init//-----------------------------------------------------------------------------//// This routine initializes the system clock to use the internal 24.5MHz / 8// oscillator as its clock source. Also enables missing clock detector reset.//void SYSCLK_Init (void){OSCICN = 0x80; // configure internal oscillator for// its lowest frequency RSTSRC = 0x04; // enable missing clock detector }//-----------------------------------------------------------------------------// PORT_Init//-----------------------------------------------------------------------------//// Configure the Crossbar and GPIO ports.// P3.3 - LED (push-pull)//void PORT_Init (void){// assignmentsXBR0 = 0x00; // no digital peripherals selectedXBR1 = 0x40; // Enable crossbar and weak pull-ups//P3MDOUT |= 0x08;P0MDOUT |= 0x03; // enable LED as a push-pull output}//-----------------------------------------------------------------------------// Timer2_Init//-----------------------------------------------------------------------------//// Configure Timer2 to 16-bit auto-reload and generate an interrupt at// interval specified by <counts> using SYSCLK/48 as its time base.//void Timer2_Init (int counts){TMR2CN = 0x00; // Stop Timer2; Clear TF2;// use SYSCLK/12 as timebase CKCON &= ~0x60; // Timer2 clocked based on T2XCLK;TMR2RL = -counts; // Init reload valuesTMR2 = 0xffff; // set to reload immediatelyET2 = 1; // enable Timer2 interruptsTR2 = 1; // start Timer2}//-----------------------------------------------------------------------------// Interrupt Service Routines//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// Timer2_ISR//-----------------------------------------------------------------------------// This routine changes the state of the LED whenever Timer2 overflows.//void Timer2_ISR (void) interrupt 5{TF2H = 0; // clear Timer2 interrupt flagLED = ~LED; // change state of LED}17.KEIL C语言与汇编语言的混合编程方法C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}汇编部分需要用#pragma asm和#pragma endasm包起来18.KEIL C混合编程中的错误与解决方法1)Keil提示“asm/endasm”出错的解决方法如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...sendata.c(81): error C272: 'asm/endasm' requires src-control to be active sendata.c(87): error C272: 'asm/endasm' requires src-control to be active Target not created解决方法如下:首先project workspace窗口右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
Keil程序运行main函数之前的汇编
Keil开发的ARM程序main函数之前的汇编分析——BIN文件中RW段的数据移动系统平台:STM32系列STM32F103ZE,512KB内部FLASH,64KB片内存储;FLASH地址范围0x0800 0000 ~ 0x0808 0000,用于存放代码;片内存储地址范围0x2000 0000 ~ 0x2001 0000,用于存放数据;Cortex-M3上电后来到复位中断(已将前4个字节的值存入MSP堆栈指针),转到__main 标号,完成RW段的移动、ZI段的初始化,建立堆栈,初始化库函数,然后跳转到main函数,开启C程序之旅,执行流程如图1所示。
图1 main函数之前的汇编程序执行流程图本文主要讨论RW段的移动,RW段就是程序中赋了初值的变量,它的搬移我看到过两种方式。
在BIN文件中,RO段和RW段之间有8个双字的Region$$Table,4个双字一组,分别用于完成RW段的搬移和ZI段的初始化。
(1)__scatterload_copy来完成此时RW段的内容保存到内存开始的地方,本文中是0x20000000,用这一方式完成后,内存中存放的不是RW数据的内容,而是一个地址。
这个地址是在FLASH中,即指向了其在RO段的地址,实际的内容是在RO段中。
(2)通过__uncompressed1实现RW是程序中初始化的变量,但是这些变量有可能初值是0,因此为了节省空间,实际在BIN文件中RW段是压缩过的。
调用__uncompressed1解压缩RW段的数据内容,并将其保存到内存开始的地方。
图2 BIN文件中压缩RW段内容图2是BIN文件中RW段的数据内容,影印部分显示,大小是164字节。
其中0x0001 C72C前面8个双字的内容是Region$$Table,将其列出如下。
0x0801 C72C BIN文件中RW段的开始地址0x2000 0000 RW段要存放到RAM中的地址0x0000 0334 要存放到RAM中的RW段数据大小0x0800 0184 执行函数__scatterload_copy或者__uncompressed1上面4个双字完成RW段的搬移。
KeilC的使用与汇编语言上机操作
《微机实验》报告实验名称KeilC的使用与汇编语言上机操作指导教师曹丹华专业班级 xxxxxxxxxxxxxxx 姓名 xxxxxx 学号 xxxxxxxxxxx联系方式 xxxxxxxxxxxxx一、任务要求1.掌握KeilC环境的使用1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。
2. 编写两个十六位数的加法程序。
有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。
二、设计思路对于16位的两个无符号数做加法,应该先做低8位加法(半加器),再做高8位带进位加法(全加器),最后保存C位。
三、资源分配两个数的低8位存放位置:20H、30H两个数的高8位存放位置:21H、31H程序从0000H开始,做加法过程中将数据存放在R4和R3,完成后将C位转存到R2。
四、流程图五、源代码;这个程序实现了两个16位数:2A10H和0021H相加ORG 50HLJMP MAINORG 0000HMAIN: CLR C ;将进位清零MOV 20H,#10HMOV 21H,#2AHMOV 30H,#21HMOV 31H,#00HMOV R0,20H ;将A中的低位存入R0中MOV A,30H ;将B中的低位存入A累加器中ADDC A,R0 ;将低位相加MOV R4,A ;其和存入R4CLR A ;清零累加器AMOV R0,21H ;将A中的高位存入R0MOV A,31H ;将B中的高位存入A累加器ADDC A,R0 ;将高位以及进位位相加MOV R3,A ;其和存入R3中CLR A ;清零累加器AADDC A,#0 ;将进位存入AMOV R2,A ;将进位存入R2SJMP HERE ;原地踏步END六、程序测试方法与结果、软件性能分析测试采用直接加两个给定的数的方法,检查加法结果和进位是否正常。
(完整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中调用即可。
keil5 汇编32位除法
在Keil uVision5中,进行32位除法的一种方法是使用SDIV汇编指令。
SDIV指令用
于有符号整数的除法。
以下是一个简单的示例程序,演示如何在Thumb模式下使
用SDIV进行32位整数除法。
上述示例中,我们使用MOV指令将被除数和除数加载到R0和R1寄存器中。
然后,我们使用SDIV指令执行除法操作,将商存储在R2中,余数存储在R3中。
你可以根据需要添加更多的代码,比如将商存储到某个变量中。
请注意,在Thumb模式下,SDIV指令只能用于有符号整数。
如果需要无符号整数
除法,可以考虑使用UDIV指令。
请确保你的目标架构和指令集支持这些指令。
这只是一个简单的示例,实际应用中可能需要更多的代码来处理各种情况,比如除数为零的情况等。
在实际应用中,请根据你的需求和具体情况添加错误处理和边界检查。
keil 内联汇编格式
keil 内联汇编格式
Keil是一个流行的嵌入式开发环境,用于编写、编译和调试嵌入式系统的程序。
在Keil 中,你可以使用内联汇编语言来编写代码。
下面是一个简单的内联汇编的例子:
c复制代码
void delay(void)
{
__asm
{
MOV R0, #200000
MOV R1, #0
dly_loop:
SUB R1, R1, #1
CMP R1, #0
BNE dly_loop
}
}
在这个例子中,__asm关键字告诉编译器这是一个内联汇编代码块。
在这个代码块中,我们使用MOV指令将200000移动到寄存器R0中,然后将0移动到寄存器R1中。
然后我们进入一个循环,每次循环都将R1的值减1,直到R1的值变为0。
当R1的值不为0时,我们跳回循环的开始。
注意,具体的汇编指令和语法可能会根据你的处理器和编译器而变化。
你需要参考你的硬件和编译器的文档来获取正确的语法和指令。
实验一:汇编语言程序设计与仿真调试平台软件keil的使用
实验一:汇编语言程序设计与仿真调试平台软件keil的使用一、实验目的1.学习编程、汇编与仿真调试平台软件keil的使用方法和技巧。
2.通过调试运行,理解和掌握程序存储器ROM的结构特点、存储寻址、空间分配特点;理解和掌握数据存储器RAM的功能分区、结构特点。
3.熟悉针汇编语言源程序的设计过程,加强对编译内容、过程、机器码的进一步理解。
4.掌握对小功能软件运行结果的验证方法。
二、实验仪器、材料1.微型计算机2.Keil uVision4软件三、实验内容1.学习编程、汇编与模拟平台软件Keil uVision4的使用;2.针对AT89C51单片机进行小功能软件的汇编语言源程序设计;3.对汇编语言源程序进行编译-修改-编译;4.模拟运行机器代码,观察软件的运行过程。
四、实验步骤与实验结果:1.Keil uVision4软件的使用1)养成良好习惯,先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合。
2)点击Keil uVision4图标,出现启动画面;3)点击“project --- New uVision Project”新建一个工程;4)在对话框,选择放在刚才建立的文件夹下,给这个工程取个名字后保存,不需要填后缀;5)弹出一个框,在CPU类型下我们找到并选中“Atmel”下的AT89C51;弹出下面的窗口点击“否”6)以上工程创建完毕,接下来开始建立一个源程序文本;7)在下面空白区别写入或复制一个完整的汇编语言程序;例如输入以下内容:ORG 0000HMOV R0,#40HMOV R1,#41HMOV A, R0MOV 30H,AMOV 20H,30HMOV A,#30HMOV @R0,AMOV A,30HMOV R1,AMOV A,@R0MOV R7,AMOV DPTR,#1700HMOV 30H,R7MOV 20H,@R0MOV 21H,#10HMOV @R0,21HMOV @R1,#01HSJMP $END8)输入源程序文件名称,可以随便命名。
51单片机 KEIL汇编嵌入C语言,程序防干扰设计,TIMER0作为软件清狗,TIMER2设置为串口波特率发生器
;***************************
;*
*
;*
初始化程序
*
;*
*
;****************************
CLEARMEMIO:
CLR A
;清 A
DEC A
;A 为#0FFH
MOV P1,A
;端口置 1
MOV P2,A
;端口置 1
MOV P3,A
;端口置 1
MOV SP,#70H
LCALL INT_SERIAL_RX
RETI
NOP
NOP
NOP
LJMP ERR
;软件陷阱
;****************************
; INT_T1 定时器 1 中断程序 ;
;****************************
INT_T1:
NOP
NOP
LCALL INT_TIMER1
关键的 C 函数 KEIL_ASM_C_INC.C 程序 如下所述: #pragma code small #include<reg52.h> #define uchar unsigned char sbit LED_T0=P1^0; sbit LED_T1=P1^1; sbit PIN_WDI=P3^4; //变量定义 uchar temp,count0=0,count1,count_s; uchar flag_S=0,flag_P=0,flag_N=0; /*************************************************** 11059200[12*(65536-19456)]=11059200/(12*46080)=1/20 函数功能:TIMER0 初始化,Timer0 清看门狗,50ms 产生中断 入口参数:void **************************************************/ void init_timer0(void) {
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口有低电平时发生中断。
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 uVision5建立汇编语言工程的过程
v1.0 可编辑可修改
1 Keil uVision5建立汇编语言工程的过程
1、创建一个自己编程的个性文件夹,启动Keil uVision5集成开发环境
2、在Keil uVision5界面主菜单下,选择project→new uVision project命令
3、将工程文件保存在先前创建的文件夹中,随便输一个自己喜欢的名字:*.uvproj
4、在对话框的树形目录中选中STC15F2K60S2→确定
5、提示是否添加,单击NO
6、右键左侧窗口Target1下的source group 1
7、选择Add New Item to Group‘Source Group 1’
8、在出现的对话框中选择:Asm File(.s)
9、在Name文本框中输入你的文件名,为:*.a51
10、单击Add,在Target1下的source group 1子目录中添加了*.A51的汇编文件
11、在右侧的窗口中,自动打开了*.A51空白文件,可以编辑了!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
要求画出流程图,写出源程序,并调试正确。
循环程序实例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?
开始 (A)←(30H) (A)=(31H)?
Y N
(42H)←(A)
(A)<(31H)? (40H)←(31H) (41H)←(A)
N
(41H)←(31H) (40H)←(A)
ORG 0030H START: MOV A,30H CJNE A,31H,K1 MOV 42H,A SJMP WAN K1: JNC K2 MOV 40H,31H MOV 41H,A SJMP WAN K2: MOV 41H,31H MOV 40H,A WAN: SJMP $ ;死循环
3 高级语言
高级语言(如 PASCAL、 C、 FORTRAN、 BASIC等)是一种面向问题或过程的语言。 接近于自然语言和数 学算法, 与机器的硬件无关, 用户编程时不必仔细了解所用计算机的具体性能和指令系统。 高级语言不 但直观、 易学、 易懂, 而且通用性强, 可以在不同的计算机上运行, 因此可移植性好。
结束
分支程序练习
在RAM30H、31H单元中各有一个无符号数,编程比较其大小,大数 放入40H单元,小数存入41H单元,若相等,存入42H单元中。
要求使用减法比较两个数的大小,画出流程图, 写出源程序,并调试正确。
多分支程序实例
;彩灯控制程序
;P3.2、 P3.3、 P3.4、 P3.5连四 个按键,P1口连接8个发光二 极管编号1-8,要求: ;按P3.2键,1,2号灯变化 ;按P3.3键,3,4号灯变化 ;按P3.4键,5,6号灯变化 ;按P3.5键,7,8号灯变化
伪指令
(6) 等值伪指令EQU。 格式: 标号:EQU 项 该伪指令的功能是将指令中项的值赋予本语句的标号。 项可以是常数、 地址标号或表达式。 例如:TAB: EQU 1000H TAB1: EQU TAB 前一条伪指令表示TAB地址的值为1000H, 后一条表示符号地址TAB1与TAB等值(可以互换), 需 要注意的是, 在同一程序中, 用EQU伪指令对某标号赋值后, 该标号的值在整个程序中不能再改变。 (7) 位地址赋值伪指令BIT。 格式: 标号 BIT位地址 该伪指令的功能是将位地址赋予特定位的标号, 经赋值后就可用指令中BIT左面的标号来代替BIT 右边所指出的位。 例如: FLG: BIT F0 AI: BIT P1.0 经以上伪指令定义后, 在编程中就可以把FLG和AI作为位地址来使用。
X,Y,Z分别保存在RAM30H、31H、32H单元,设X>Y,编程计算 S=(X-Y)*Z,结果S存入34H(高字节)和35H(低字节)单元中。
开始 ORG 0030H (A)←X (A)←(A)-Y (B)←Z START: MOV A,30H CLR C SUBB A,31H MUL AB
(B,A)←(A)*(B) (34H)←(B) (35H)←(A) 结束
用助记符描述的指令系统, 称为汇编语言。 汇编语言也是面向机器的, 每种计算机系统都有它自己的汇编语言, 用汇编语言编写的程序, 称为汇编语言源程序或汇编源程序。 特点: (1)汇编语言比机器语言容易理解,但必须通过编译程序翻译成机器语言,才能被计算机执行。 (2)汇编语言直接访问CPU硬件,响应速度快,程序存储器利用率高。 (3)利用汇编语言编程要求程序设计人员必须对机器的硬件结构和指令系统熟悉。
彩灯控制程序流程图
开始
根据按键设置(A) (A)=?
1 2 3 4
1,2号灯变
3,4号灯变
5,6号灯变
7,8号灯变
彩灯控制参考程序
K0: K1:
ORG 0000H MOV A,#0 JB P3.2,K2 JNB P3.2,$ MOV A,#1 AJMP J1 JB P3.3,K3 JNB P3.3,$ MOV A,#2 AJMP J1 JB P3.4,K4 JNB P3.4,$ MOV A,#3 AJMP J1 JB P3.5,K0 JNB P3.5,$ MOV A,#4 AJMP J1 J1: TAB: MOV DPTR,#TAB RL A ;(A)*2 JMP @A+DPTR AJMP KS0 AJMP KS1 AJMP KS2 AJMP KS3 AJMP KS4 AJMP K0 XRL P1,#00000011B AJMP K0 XRL P1,#00001100B AJMP K0 XRL P1,#00110000B AJMP K0 XRL P1,#11000000B AJMP K0 END
伪指令
(4) 定义字伪指令DW。 格式: [标号: ]DW 项或项表 DW伪指令与DB的功能类似, 所不同的是DB用于定义一个字节(8 位二进制数), 而DW则用于定义 一个字(即两个字节, 16 位二进制数)。 在执行汇编程序时, 机器会自动按高 8 位先存入, 低 8 位后存 入的格式排列, 这和MCS—51 指令中 16 位数据存放的方式一致。 例如: ORG 1500H TAB2: DW 1234H, 80H 汇编以后: (1500H)=12H, (1501H)=34H, (1502H)=00H, (1503H)=80H。 (5) 预留存储空间伪指令DS。 格式: [标号: ]DS 表达式 该伪指令的功能是从标号指定的单元开始, 保留若干字节的内存空间以备源程序使用。 存储空间内 预留的存储单元数由表达式的值决定。 例如: ORG 1000H DS 20H DB 30H, 8FH 汇编后: 从 1000H开始, 预留 32(20H)个字节的内存单元, 然后从 1020H开始, 按照下一条DB指令赋值, 即 (1020H)=30H, (1021H)=8FH。 保留的存储空间将由程序的其它部分决定它们的用处。
伪指令
(2) 结束汇编伪指令END。 格式: [标号: ] END END是汇编语言源程序的结束标志, 表示汇编结束。 在END以后所写的指令, 汇编程序都不予以 处理。 一个源程序只能有一个END命令。 在同时包含有主程序和子程序的源程序中, 也只能有一个 END命令, 并放到所有指令的最后, 否则, 就有一部分指令不能被汇编。 (3) 定义字节伪指令DB。 格式: [标号: ]DB 项或项表 其中项或项表指一个字节, 或用逗号分开的字符串, 或以引号括起来的字符串(一个字符用ASCII 码表示, 就相当于一个字节)。 该伪指令的功能是把项或项表的数值(字符则用ASCII码)存入从 标号开始的连续存储单元中。 例如: ORG 2000H TAB1: DB 30H, 8AH, 7FH, 73 DB ′5′,′A′,′BCD′ 由于ORG 2000H, 所以TAB1的地址为2000H, 因此以上伪指令经汇编以后, 将对 2000H开始的若干 内存单元赋值: (2000H) = 30H (2005H) = 41H ; 字母A的ASCII码 (2001H)=8AH (2006H) = 42H ; ′BCD′中B的ASCII码 (2002H)=7FH (2007H) = 43H ; ′BCD′中C的ASCII码 (2003H) = 49H ; 十进制数 73 以十六进制数存放 (2008H) = 44H ; ′BCD′中D的ASCII码 (2004H) = 35H ; 数字 5 的ASCII码
MOV 34H,B MOV 35H,A SJMP $ ;死循环
顺序程序练习
X,Y,Z分别保存在RAM30H、31H、32H单元,编程计 算S=(X+Y)/Z,结果S存入34H(商)和35H(余数)单元中。
要求画出流程图,写出源程序,并调试正确。
分支程序实例
在RAM30H、31H单元中各有一个无符号数,编程比较其大小,大数 放入40H单元,小数存入41H单元,若相等,存入42H单元中。
;极值查找程序 ;在内部RAM30-4FH单元存放着一组无符号数,编写程序查找出这些无符 号数的最大值,将结果存放于50H单元。编写完程序以后,在这些单元 输入一些数据,运行程序,观察实验结果。
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
结束
循环程序练习1
;编程将外部RAM1000H-1030H单元的内容,复制到内部 RAM30H-60H单元。
要求画出流程图,写出源程序,并调试正确。
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
K2:
KS0: KS1:
K3:
KS2:
KS3: KS4:
K4:
彩灯控制练习
;P3.2、 P3.3、 P3.4、 P3.5连四个按 键,P1口连接8个发光二极管编号1-8, 要求: ;按P3.2键,单号灯变化 ;按P3.3键,双号灯变化 ;按P3.4键,1-8号灯全亮 ;按P3.5键,1-8号灯全灭
分 析 任 务
算 法 优 化
总 体 设 计
调 试 程 序
流程图
形象直观地表示程序的执行过程
开始 任务描述1 任务描述2 判断选择 任务描述3 任务描述4
结束
程序基本结构
顺序 分支 循环
循环条件 任务1 任务2