当前位置:文档之家› Arm汇编格式

Arm汇编格式

Arm汇编格式
Arm汇编格式

ARM经典汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A MOV R7,#0AH CLR 00H MOV A,@R0 Q12:INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,Q13 SETB C Q13:MOV A,R2 JC Q11 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 Q11:MOV A,@R0 DJNZ R7,Q12 JB 00H,QUE1 SJMP $ END

2 ARM汇编希尔排序法对10个带符号数进行排序Code: void shell(int src[],int l,int r){ int ih; r++; for(ih=1;ih<(r-l)/9;ih=ih*3+1); //eax,ih //ebx,il //ecx,ir //edx,cmps _asm{ push eax push ebx push ecx push edx push esi push edi;貌似这堆进栈用处不大哎 mov edi,src mov eax,dword ptr [ih] LIH: cmp eax,0 jna EXIH mov ebx,eax dec ebx LLH: cmp ebx,dword ptr [r] jnb EXLLH mov ecx,ebx mov edx,dword ptr [edi+ecx*4]

LCMP: mov esi,eax dec esi cmp ecx,esi jna EXCMP push ecx sub ecx,eax cmp edx,dword ptr [edi+ecx*4] pop ecx jnb EXCMP push ebx push ecx sub ecx,eax mov ebx,dword ptr [edi+ecx*4] pop ecx mov dword ptr [edi+ecx*4],ebx pop ebx sub ecx,eax jmp LCMP EXCMP: mov dword ptr [edi+ecx*4],edx inc ebx jmp LLH EXLLH: push ecx mov ecx,3 push edx cdq

ARM汇编语言源程序格式

ARM汇编语言源程序格式ARM汇编语言源程序格式2010-11-16 13:52 来源:MCU嵌入式领域 常用ARM源程序文件类型 汇编语言程序的结构1 汇编语言程序的结构2 汇编语言程序的结构3 汇编语言程序的结构4 ARM的汇编语言程序一般由几个段组成,每个段均由AREA伪操作定义。 段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,如代码段的默认属性为READONLY,数据段的默认属性为READWRITE。 本程序定义了两个段,第一个段为代码段codesec,它在存储器中存放用于程序执行的代码以及main函数的本地字符串;第二个段为数据段constdatasec,存放了全局的字符串,由于本程序没有对数据进行写操作,该数据段定义属性为READONLY。 汇编语言的行构成1 格式: [标签]指令/伪操作/伪指令操作数[;语句的注释] 所有的标签必须在一行的开头顶格写,前面不能留空格,后面也不能跟C 语言中的标签一样加上":";

ARM汇编器对标识符的大小写敏感,书写标号及指令时字母的大小写要一致; 注释使用";"符号,注释的内容从";"开始到该行的结尾结束 汇编语言的行构成2 标签 标签是一个符号,可以代表指令的地址、变量、数据的地址和常量。 一般以字母开头,由字母、数字、下划线组成。 当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个ROUT伪操作之前。 指令/伪操作 指令/伪操作是指令的助记符或者定义符,它告诉ARM的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能。 汇编语言的标号1 标号代表地址。 标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外编号的地址值在链接时确定。 在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计数器(PC)和偏移量计算地址即程序相对寻址。 在映像中定义的标号代表标号到映像首地址的偏移量。映像的首地址通常被赋予一个寄存器,根据该寄存器值与偏移量计算地址即寄存器相对寻址。 例如:

ARM汇编语言和C_C_语言混合编程的方法_史斌

嵌入式技术 电 子 测 量 技 术 ELECT RO NIC M EA SU REM EN T T ECHN O LO G Y 第29卷第6期 2006年12月  ARM汇编语言和C/C++语言混合编程的方法 史斌 (天津大学电子信息工程学院天津300072) 摘 要:文中首先对在嵌入式系统设计中广泛应用的A RM系列微处理器做了简要介绍;接着详细阐述了基于A RM 核的嵌入式微处理器的汇编语言和C/C++语言混合编程的方法:包括代码简洁而功能有限的在线汇编技术和功能强大、基于模块化设计的A T PCS规则;最后给出了详细的示例代码和分析。 关键词:嵌入式系统;A RM;汇编语言;在线汇编;A T PCS规则 Programming of ARM with both assembly and C/C++language Shi Bin (S chool of Electronic&Information Engin eering Tianjin University,Tianjin300072) A bstract:T his article briefly introduced A RM serial micropro ce sso r,w hich is ex tensiv ely used in embedded sy stem desig n;and then g ave the tw o metho ds of A RM-cor e embedded processor prog ramming with both assembly and C/C++ Language including in-line assembly w hich is co mpact but have so me limits and A T PCS rules w hich are pow erful and mo dularized.A t last,the re is some source code w ith analy sis for demo nstra tion. Keywords:embedded sy stem;A RM;assembly;in-line assembly;A T PCS 0 引 言 A RM是一种高性能、低功耗的32位RISC嵌入式处理器系列。目前在各种嵌入式系统中A RM获得了广泛的应用。 A RM编程可以使用汇编语言和C/C++语言,使用汇编语言编程目标代码效率较高,但较为繁琐,设计大型系统时不易维护;而C/C++语言比较简洁明了,但代码效率即使经过优化,也比汇编语言低,特别是在一些实时性强和需要精细处理的场合,C/C++语言难以胜任。因此一个折中的办法是:使用C/C++语言写整体框架,而使用汇编语言实现局部模块,这就涉及到汇编语言和C/C ++语言混合编程的问题。为此本文介绍了在ADS中常用的2种汇编语言和C/C++语言混合编程方法:在线汇编(in-line assem bly)和AT PCS(A RM-T humb Produce C all S tandard)规则。 1 在线汇编(in-line as sembly) 在线汇编的具体含义就是:在C/C++代码中插入一段汇编代码,以实现某种C/C++无法达到的效果,例如: { INTM SK=0xfffff fff;//屏蔽所有的向量中断, C/C++代码 __asm//插入一段汇编代码 { M RS r0,CPS R;//将状态积存器的内容传递到r0 ORR R0,R0,0x000000C0;//通过或运算将r0的第6,7两位置1,其它位不变 M SR CPSR_c,r0;//将r0的低8位送到CPS R的低8位,以屏蔽FIQ中断 } IN TPND=0xfffff fff;//清除全部中断标志位, C/C++代码 } 因为CPS R是一个物理寄存器,没有存储器的I/O映射,而A RM的C/C++语言使用的是ANSI标准,不像KeilC51那样有诸如sbit和sfr的扩展,所以访问C PS R的唯一方法就是用汇编语言;通过在C/C++代码中插入一段简短的汇编代码,来实现对CPSR的访问。再比如一些波形发生的场合,需要每隔一段精确的时间向端口送数据,那么C/C++代码经编译后产生的指令数是无法预知的,所以无法实现精确定时,因此就要使用在线汇编。 在线汇编通过__asm关键字实现,一般格式为: ……//C/C++代码 __asm { 指令1;指令2;指令3;…… 89

ARM汇编语言程序设计总结

1.存储器访问指令 LDR STR LDR Load 32-bit word to Memory. Syntax LDR{cond} Rd, [Rn] LDR{cond} Rd, [Rn, offset] LDR{cond} Rd, [Rn, offset]! LDR{cond} Rd, label LDR{cond} Rd, [Rn], offset Description LDR{cond} Rd, [Rn] (zero offset) Rn is used as address value. LDR{cond} Rd, [Rn, offset] (Pre-indexed offset) Rn and offset are added and used as address value. LDR{cond} Rd, [Rn, offset]{!} (Pre-indexed offset with update) Rn and offset are added and used as address value. The new address value is written to Rn. LDR{cond} Rd, label (Program-relative) The assembler calculates the PC offset and generates LDR{cond} Rd, [R15, offset]. LDR{cond} Rd, [Rn], offset (Post-indexed offset) Rn is used as address value. After memory transfer, the offset is added to Rn. Example LDR R8,[R10] //loads r8 from the address in r10. LDRNE R2,[R5,#960]! //(conditionally) loads r2 from a word 960 bytes above the address in r5, and increments r5 by 960. LDR R0,localdata //loads a word located at label localdata STR Store register 32-bit words to Memory. The address must be 32-bit word-aligned. Syntax STR{cond} Rd, [Rn] STR{cond} Rd, [Rn, offset] STR{cond} Rd, [Rn, offset]! STR{cond} Rd, label

实验一 ADS下简单ARM汇编程序实验

实验一ADS下简单ARM汇编程序实验 实验目的: 1、熟悉ADS1.2下进行汇编语言程序设计的基本流程; 2、熟悉在ADS中创建工程及编写、编译和运行汇编语言程序的方法; 3、熟悉AXD中各种调试功能。 实验环境: 1、硬件:PC机。 2、软件ADS1.2。 实验内容: 1、在ADS中新建工程,并设置开发环境。 2、在Code Warrior 环境中编辑、编译和链接汇编语言程序,并生成可执行文件。 3、在AXD中调试汇编程序; 4、使用命令行界面编辑、编译和链接汇编程序。 实验过程: 本实验要求在ADS环境下,编写一个汇编程序,计算S=1+2+3……+n的累加值。 把累加结果S存入到存储器的指定位置;在AXD中调试该程序,使用ARMulator模拟目标机。 1、新建工程。 打开Code Warrior,选择File->New(project)选项,使用ARM Executable Image模版新建一个工程。

2、设置编译和链接选项。 由于我们使用的是模拟机,设置汇编语言编译器的模拟处理器架构为Xscale;在ARM Linker 中,选择output选项卡并选择Linktype为Simple类型,确认RO Base为0x8000,修改RW Base为0x9000,如下图所示。

3、为当前工程添加源程序文件。 ARM汇编程序源文件后缀名为S大小写均可。 确保添加入当前工程复选框选上。

4、编辑源程序代码。 参考程序add.s : ;armadd源程序 N EQU 7 ;累加次数 ;定义名为Adding的代码段 AREA Adding,CODE,READONL Y ENTRY MOV R0,#0 MOV R1,#1 REPEAT ADD R0,R0,R1 ADD R1,R1,#1 CMP R1,#N BLE REPEA T LDR R2,=RESULT STR R0,[R2] HERE B HERE 定义名为Dataspace的数据段 AREA Dataspace,DATA,READWRITE RESULT DCD 0 END 5、编译汇编源代码文件。 右击add.S文件,选择Compile,如果没有成功会弹出错误和警告窗口。 生成.O目标代码文件。

ARM汇编语言程序设计总结.

ARM汇编语言程序设计总结 一、常用指令 1.存储器访问指令 LDR STR LDR Load 32-bit word to Memory. Syntax LDR{cond} Rd, [Rn] LDR{cond} Rd, [Rn, offset] LDR{cond} Rd, [Rn, offset]! LDR{cond} Rd, label LDR{cond} Rd, [Rn], offset Description LDR{cond} Rd, [Rn] (zero offset) Rn is used as address value. LDR{cond} Rd, [Rn, offset] (Pre-indexed offset) Rn and offset are added and used as address value. LDR{cond} Rd, [Rn, offset]{!} (Pre-indexed offset with update) Rn and offset are added and used as address value. The new address value is written to Rn. LDR{cond} Rd, label (Program-relative) The assembler calculates the PC offset and generates LDR{cond} Rd, [R15, offset]. LDR{cond} Rd, [Rn], offset (Post-indexed offset) Rn is used as address value. After memory transfer, the offset is added to Rn. Example LDR R8,[R10] //loads r8 from the address in r10. LDRNE R2,[R5,#960]! //(conditionally) loads r2 from a word 960 bytes above the address in r5, and increments r5 by 960. LDR R0,localdata //loads a word located at label localdata STR Store register 32-bit words to Memory. The address must be 32-bit word-aligned.

arm常用几个汇编语言的程序

.一。从一数到十 COUNT EQU 0x30003100 ;定义变量COUNT的基地址 AREA Example1,CODE,READONL Y;声明代码段Example1为只读 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START LDR R1,=COUNT ;将0X30003100赋给R1 MOV R0,#0 ;执行R0=0 STR R0,[R1] ;存储R0寄存器的数据到R1指向的存储单元LOOP LDR R1,=COUNT ;将0X30003100赋给R1 LDR R0,[R1] ;将R1中的数值作为地址,取出此地址中的数据保存到R0中 ADD R0,R0,#1 ;执行R0=R0+1 CMP R0,#10 ;将R0与10进行比较 MOVHS R0,#0 ;若R0大于等于10,则R0=0 STR R0,[R1] ;存储R0寄存器的数据到R1指向的地址单元 B LOOP ;跳转到LOOP END ;汇编文件结束 二,9的8次幂 X EQU 9 ;初始化X为9 n EQU 8 ;初始化N为8 AREA Example3,CODE,READONL Y ;生明代码段Example3为只读 ENTRY ;标识程序入口路 CODE32 ;声明32位ARM指令 START LDR SP,=0x30003F00 ;把0x30003F00 赋给SP(R13)LDR R0,=X ;把9赋给R0 LDR R1,=n ;把8赋给R1 BL POW ;跳转到POW,并把下一条指令地址存入到R14中HALT B HALT ;等待跳转 POW STMFD SP!,{R1-R12,LR} ;将R1-R12入栈,满递减堆栈MOVS R2,R1 ;将R1赋给R2,并影响标志位 MOVEQ R0,#1 ;若Z=1,则R0=1 BEQ POW_END ;若Z=1,跳转到POW_END MOV R1,R0 ;将R0中值赋给R1 SUB R2,R2,#1 ;将R2-1的只赋给R2 POW_L1 BL DO_MUL ;跳转到DO-MUL,并把下一条指令地址存入R14中SUBS R2,R2,#1 ;将R2-1的值赋给R2,并影响标志位 BNE POW_L1 ;若Z=0,跳转到POW_L1 POW_END LDMFD SP!,{R1-R12,PC} ;数据出栈,存入到R1-R12,PC中 DO_MUL MUL R0,R1,R0 ;把R1*R0的值赋给R0 MOV PC,LR ;LR中的值赋给PC END ;汇编结束

ARM汇编语言编程详解

ARM汇编语言编程详解 硅谷芯微嵌入式学院技术贡献网址:https://www.doczj.com/doc/6a7338590.html,

4.1 汇编语言 使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。每一种汇编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。

先介绍一个例子来说明ARM汇编程序的格式。 例1 计算20+8,结果放入R0寄存器。 AREA Buf, DATA, READWRITE ;声明数据段Buf Count DCB 20 ;定义一个字节单元Count AREA Example, CODE, READONLY ;声明代码段Example ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START LDRB R0, Count ;R0 = Count =20 MOV R1, #8 ;R1 = 8 ADD R0, R0, R1 ;R0 = R0 + R1 B START END

例1中定义了两个段:数据段Buf和代码段Example 。数据段中定义了字节单元Count,其中Count用来保存一个被加数;代码段中包含了所有源程序代码,程序中首先读取Count字节单元的内容,然后与立即数8相加,计算结果保存到R0中。 由例1可见,ARM汇编语言的源程序是分段的,由若干个段组成一个源程序。源程序的一般格式为: AREA name1, attr ;声明特定的段标号语句1 ;语句 ... 语句n AREA name2, attr 标号语句n+1 ... 语句n+m END ;结束符

ARM汇编程序基本知识

ARM汇编程序基本知识 1.汇编程序的基本组成 ARM汇编语言程序中,程序是以程序段为单位组织代码的。段是相对独立的指令或者代码序列,拥有特定的名称。段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。段使用AREA伪操作来定义,并且说明相关属性,如 代码段定义 AREA Init, CODE, READONLY … 数据段定义 AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3 …… 等 一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。在格式上,一个汇编程序需要至少有一个ENTRY(关于ENTRY具体内容看伪操作符ENTRY),还需要在汇编源文件结束处,写上END表示该源文件的结束。 如一个基本的汇编源程序 AREA Init, CODE, READONLY ;定义一个代码段 ENTRY ;标记程序入口点 Start LDR R0,0x3FF5000 ;标号Start可以要,也可以不要 LDR R1,0Xff STR R1,[R0]

LDR R0,=0x3FF5000 LDR R1,0x01 STR R1,[R0] …… END ;END伪操作表示本源文件结束 当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译链接时,最终形成一个可执行的映像文件。一个可执行映像文件通常由以下几部分组成 一个或者多个代码段,代码段属性为只读(只读数据也放在代码段?RO) 零个或者多个初始化数据的数据段,可读写(存放初始化了的变量数据,RW) 零个或者多个不包含初始化数据的数据段,可读写(所有未初始化的变量,也就是ZI) 链接器根据系统默认或者用户设定的规则,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会相同。 2.汇编语句应该注意的地方 汇编语句格式 [LABEL] OPERATION, [OPERAND], [;COMMENT] LABEL必须在一行的开头写。 OPERATION包括指令、伪操作、宏指令或伪指令。每一条操作助记符必须全部大写或者全部小写。在写操作助记符前,必须有空格。 OPERAND 表示操作的对象,可以使常量、变量、标号、寄存器或者表达式,不同的对象之间必须用逗号分开。 例子: AREA EX2,CODE,READONLY ;操作助记符前面必须有空格

ARM嵌入式系统课后习题部分答案

一填空题1.1嵌入式系统从大的方面分为(嵌入式系统硬件平台)和(嵌入式软件)两大部分。 1.2驱动层程序一般包括(硬件抽象层HAL)、(板级支持包BSP)和(设备驱动程序)。 1.3嵌入式系统核心是嵌入式处理器,可分为(嵌入式微处理器)、(嵌入式微控制器)、嵌入式DSP处理器和(嵌入式片上系统SoC)4大类。 2.2ARM7TDMI处理器分为(ARM)和(Thumb)两种操作状态。 2.3ARM状态下,SP寄存器指的是(R13)、LR寄存器指的是(R14)、PC 寄存器指的是(R15). 2.4ARM处理器支持的数据类型中,字节为(8)位、半字为(16)位、字为(32)位。 3.1ARM7TDMI(-S)指令集包括(ARM)指令集和(Thumb)指令集。 3.2LDR指令用于从(存储器)中将一个32位的字数据传送到(目的寄存器)中。 3.3指出下面各条指令的寻址方式。 SUB R0,R1,R2 ;寻址方式:(寄存器寻址)。 SUBS R0,R0,#1 ;寻址方式:(立即寻址)。 MOV R0,R2,LSL#3 ;寻址方式:(寄存器移位寻址)。SWP R1,R1,[R2] ;寻址方式:(寄存器间接寻址)。LDR R2,[R3,#0x0C] ;寻址方式:(基址寻址)。 4.3ARM汇编语言源程序中语句一般有(指令)、(伪指令)、(伪操作)和

宏指令组成。 6.1对Flash存储器的编程可通过(JTAG仿真/调试器)、( ISP )和(IAP)3重方法来实现。 6.2异常向量表可以来自4个不同的存储器区域,分别是(片内Flash )、(片内SRAM )、( Boot Block )和片外存储器。 6.3LPC2000系列的定时器主要用于3个方面:(对内部事件进行计数的间隔定时器)、(通过捕获输入实现脉宽解调器)、(自由运行的定时器)。 二选择题 1.1可以表示微控制器的缩略词是( B ) A. MPU B. MCU C. WDT D.SPI 1.2ROM类存储器包括( ABD ) A. NOR Flash B. EPROM C. SRAM D. PROM 1.3不属于ARM的系列是( D ) A. MCS-96 B. 80C51 C. LPC2000 D.80X86 2.2ARM7处理器系列采用( A )级流水线。 A. 3 B. 5 C. 6 D. 8 2.3下面ARM处理器模式中属于特权模式的有( BCD ) A. 用户模式 B. 中断模式 C. 系统模式 D. 管理模式 3.2LDM(或STM)指令允许一条指令最多传送( C )个寄存器。 A. 4 B. 8 C. 16 D. 24 3.3BL指令限制在当前指令的( B )地址范围。

相关主题
文本预览
相关文档 最新文档