ARM汇编语言程序设计实例解析-阶乘操作
- 格式:pdf
- 大小:75.53 KB
- 文档页数:3
一、arm的认知及基本概念(一).arm的基本概念1.什么是armarm是一家英国电子公司的名字,全名是Advanced RISC Machine这家企业设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器,ARM公司只设计芯片而不生产,它将技术授权给世界上许多公司和厂商。
目前采用arm技术知识产权内核的微处理器,即通常所说的arm微处理器所以arm也是对一类微处理器的通称。
arm指令集体系版本号(软件)为V1 ~ V7目前V1 ~ V3已很少见。
从V4版不再与以前的版本兼容。
arm的CPU系列(硬件)主要有ARM7 ~ ARM112.典型的嵌入式处理器arm 占市场79.5%ARMmips 占市场13.9%MIPSmicroSPARC 占市场3.1%SUNPowerPc 占市场2.8%IBM其它占市场0.8%3. arm的应用范围:工业控制:如机床、自动控制等无线通信:如手机网络应用:如电子产品:如音视频播放噐、机顶盒、游戏机、数码相机、打印机其它各领域:如军事、医疗、机器人、xx等4.计算机体系结构见图:xx.xx计算机体系图xx.xx体系结构处理器使用同一个存储器,经由同一个总线传输完成一条指令需要3个步骤:即取指令->指令译码->执行指令指令和数据共享同一总线的结构哈佛体系结构将程序指令存储和数据存储分开中央处理器首先到程序指令存储器中读取程序指令。
解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。
5.复杂指令集与精简指令集CISC 复杂指令集:采用冯.诺依曼体系结构。
数据线和指令线分时复用(只能通过一辆车)。
存储器操作指令多汇编程序相对简单指令结束后响应中断CPU电路丰富面积大功耗大RISC 精简指令集:采用哈佛体系结构。
数据线和指令线分离(同时能通过多辆车)。
对存储器操作有限汇编程序占空间大在适当地方响应中断CPU电路较少体积小功耗低ARM采用RISC精简指令集Thumb是ARM体系结构中一种16位的指令集。
实验ARM汇编程序的编写以及启动代码的分析一、实验目的:练习ARM汇编程序的编写,对提供的程序的启动代码进行分析,了解S3C2410初始化过程, 初始化代码主要是包含在start.s中。
二、实验原理:启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。
启动程序过程●系统硬件初始化系统上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,执行完,系统进行堆栈和存储器的初始化。
使用了外设,则需要设置相关的寄存器,确定其刷新频率、总线宽度等信息。
●代码段复制到RAM中运行需要把系统的代码复制到RAM中运行。
映像文件内部共有三种输出段:RO段、RW段和ZI段。
ARMLink同时还产生了这三种输出段的起始和终止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$RW$Limit、Image$ZI$Base和Image$$ZI$$Limit。
可以在程序中使用这些定位信息。
将ROM中的代码和数据搬移到RAM中。
●建立二级中断向量表在ARM系统中,中断向量表位于0X0开始的地址处,意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash存储器中的中断向量表里去,降低系统的运行效率。
因此在RAM中建立自己的二级中断向量表,当中断发生后,程序直接从RAM中取中断向量进入中断子程序。
尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。
三、实验内容:1.运行一个简单的串口程序,单步执行初始化代码,观察寄存器变化。
2.分析系统上电后的初始化工作包括哪些内容。
3.分析中断的处理过程,包括中断向量表的建立、中断源的识别及中断IRQ 服务程序是如何进入的。
汇编子程序设计阶乘汇编语言是一种底层的程序语言,用于编写机器指令的程序。
子程序设计是汇编语言的一个重要概念,用于将程序模块化以便重复使用。
阶乘是一个经典的数学问题,定义为对于正整数n,阶乘的值表示为n!,等于从1到n的所有正整数相乘的结果。
例如,5!=5×4×3×2×1=120。
在汇编语言中,实现阶乘可以通过递归或迭代的方式完成。
下面我们将详细讨论这两种方法。
一、递归方式实现阶乘:递归方式是一种将问题分解为更小规模的子问题的编程技术。
在实现阶乘时,可以通过递归方式计算出n-1的阶乘,然后将结果与n相乘得到n。
以下是使用递归方式实现阶乘的汇编代码示例:```assemblysection .dataresult db 1section .textglobal _start_start:mov eax, 5call factorialmov [result], eax;此处可添加输出结果的代码mov eax, 1int 0x80factorial:push ebpmov ebp, espmov eax, [ebp+8] ; 读取传入的参数n cmp eax, 1jle end_factorialdec eaxpush eaxcall factorialpop eaximul eax, [ebp+8] ; 计算阶乘结果end_factorial:mov esp, ebppop ebpret```以上代码中,_start是程序的入口点。
我们传入参数5给阶乘的子程序,然后将结果存储在result变量中。
请注意,在第一个call指令后,我们将使用eax寄存器存储结果。
factorial是计算阶乘的子程序。
我们通过比较n是否小于等于1来确定是否终止递归。
如果n大于1,则我们将n减1,并将其压入栈中作为下一次递归的参数。
然后,我们通过调用相同的子程序计算n-1的阶乘结果。
汇编语言程序设计报告课程设计题目:采用汇编语言实现阶乘运算学号:10081437*名:***院系:测试与光电工程学院专业:测控技术与仪器指导教师:陈振华采用汇编语言实现阶乘运算学生姓名:张子琦班级:10081437指导老师:陈振华摘要:汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。
尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。
因此掌握汇编语言是学好微机原理和接口设计的第一步。
编写计算N!的程序。
数值由键盘输入,结果在屏幕上输出。
[1]关键字:汇编语言 N!键盘输入屏幕输出指导老师签名:Factorial implemented in assembly language Student name :Ziqi Zhang Class:10081437Supervisor:Zhenhua ChenAbstract:Assembly language is the basis of the principles and applications of the microcomputer, the microcomputer host functions and interfaces to achieve should be achieved through the assembly language. Despite the low efficiency of assembly language programming programming, but it’s high operating efficiency, and speed. Therefore, the assembly language is the first step to learn Microcomputer Principle and Interface Design. Written calculation of N! Procedures. Numerical keyboard input, output results on the screen.Key words:Assembly language N! Keyboard input Screen outputSignature of Supervisor:目录1 背景[2] (1)1.1汇编语言 (1)1.2设计概述 (2)2 功能描述 (2)3 详细设计 (2)3.1原理及设计思路 (2)3.2流程图 (3)3.3源程序代码[1][2] (4)4 运行过程 (8)4.1编译源程序 (8)4.2汇编 (8)4.3连接并生成可执行文件 (9)4.4运行程序 (9)5 心得体会 (10)6 参考文献 (10)7 致谢 (11)1 背景[2]1.1汇编语言汇编语言是直接面向处理器(Processor)的程序设计语言。
ARM汇编语言编程详解硅谷芯微嵌入式学院技术贡献网址:4.1 汇编语言使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。
每一种汇编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。
在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。
先介绍一个例子来说明ARM汇编程序的格式。
例1 计算20+8,结果放入R0寄存器。
AREA Buf, DATA, READWRITE ;声明数据段Buf Count DCB 20 ;定义一个字节单元Count AREA Example, CODE, READONLY ;声明代码段ExampleENTRY ;标识程序入口CODE32 ;声明32位ARM指令STARTLDRB R0, Count ;R0 = Count =20MOV R1, #8 ;R1 = 8ADD R0, R0, R1 ;R0 = R0 + R1B STARTEND例1中定义了两个段:数据段Buf和代码段Example 。
数据段中定义了字节单元Count,其中Count用来保存一个被加数;代码段中包含了所有源程序代码,程序中首先读取Count字节单元的内容,然后与立即数8相加,计算结果保存到R0中。
由例1可见,ARM汇编语言的源程序是分段的,由若干个段组成一个源程序。
源程序的一般格式为:AREA name1, attr ;声明特定的段标号语句1 ;语句...语句nAREA name2, attr标号语句n+1...语句n+mEND ;结束符每一个段都有一个名字,并且段名是唯一的。
每个段以符号AREA作为段的开始,以碰到下一个符号AREA 作为该段的结束。
段都有自己的属性,如是代码段(CODE)还是数据段(DATA),是只读(READONLY )还是可读写(READWRITE)?这些属性可以在attr栏中设定。
arm汇编指令乘法ARM汇编指令中的乘法指令主要是用于两个操作数之间的乘法运算。
ARM架构提供了多种乘法指令,包括带有延迟和不带延迟的乘法指令。
在本文中,我们将重点介绍ARM汇编指令中的乘法指令及其使用方法。
ARM汇编指令中的乘法指令有两种类型:乘法和乘法累加。
乘法指令一般用于两个操作数之间的乘法运算,将两个操作数相乘的结果存储到指定的寄存器中。
而乘法累加指令除了执行相乘操作外,还可以将运算结果与另一个操作数相加,并将结果存储到指定的寄存器中。
首先,我们来看一下ARM汇编指令中的乘法指令。
乘法指令提供了不同位数的操作数,包括32位和64位。
常见的乘法指令有`MUL`和`MLA`。
`MUL`指令用于两个32位操作数的乘法运算,其语法格式如下:```MUL{S}{cond} Rd, Rm, Rs````Rd`是目标寄存器,用于存储运算结果。
`Rm`和`Rs`分别是要进行乘法运算的两个操作数。
例如,下面的示例代码演示了使用`MUL`指令计算两个操作数的乘积,并将结果存储到目标寄存器`R0`中:```assemblyMUL R0, R1, R2```注意,`MUL`指令不会影响条件码。
接下来,我们介绍乘法累加指令`MLA`。
`MLA`指令用于执行两个32位操作数之间的乘法累加运算,其语法格式如下:```MLA{S}{cond} Rd, Rm, Rs, Rn````Rd`是目标寄存器,用于存储运算结果。
`Rm`和`Rs`分别是要进行乘法运算的两个操作数,`Rn`是要与乘法运算结果相加的操作数。
以下示例代码演示了如何使用`MLA`指令计算两个操作数的乘积,并将结果与另一个操作数相加,并将最终结果存储到目标寄存器`R0`中:```assemblyMLA R0, R1, R2, R3```除了上述的乘法和乘法累加指令,ARM架构还提供了一些其他的乘法指令,如`SMULxy`和`SMLAxy`,其中`x`和`y`可以是`B`、`T`、`BB`或`TT`。
一、实验目的1. 掌握子程序的设计方法;2. 掌握递归子程序的设计思想;3. 体会堆栈操作在子程序嵌套中的重要作用。
二、实验原理及基本技术路线图(方框原理图)一个子程序作为调用程序去调用另一子程序,这种关系称为子程序嵌套。
由于子程序嵌套对堆栈的使用很频繁,因此还要确保堆栈有足够空间,并要注意堆栈的正确状态,这包括CALL、RET、RET N、PUSH、POP、INT、IRET等与堆栈操作有关指令的正确使用。
在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。
显然递归调用是子程序嵌套的一种特殊情况。
使用递归算法往往能设计出效率较高的程序。
设计递归子程序时,必须保证每一次后继调用都不能破坏它上一次调用时所生成的参数和中间结果,并且该过程不会修改它本身。
这就意味着当使用汇编语言设计递归子程序时,必须考虑每一次调用都应该把它的参数、寄存器和所有的中间结果保存到不同的存储区域。
最好的办法是利用堆栈来存储这些信息,一次调用所保存的信息称为一帧。
递归调用要使用大量的堆栈空间,一定要保证堆栈足够大,而且也要保证堆栈的正确使用,避免死机等不可预料的情况发生。
求N!算法流程图:三、所用仪器、材料(设备名称、型号、规格等) 1. 操作系统平台:Windows Server 2003 2. 汇编环境:Microsoft MASM 5.0 3. 文本编辑器:记事本 四、实验方法、步骤1. 将MASM5.0的文件置于C:\assembly\目录下;2. 将masm.exe和link.exe所在目录(C:\assembly\MASM5)添加到Path环境变量中;3.在C:\assembly\下新建一个JC.asm文件,打开JC.asm,输入汇编程序代码;4. 运行一个命令行窗口,将当前目录切换到C:\assembly\,然后输入命令:masm JC.asm [Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止,此时会生成JC.obj文件;5. 输入命令:link JC.obj [Enter],观察输出结果,如果没有错误,则生成JC.exe;6. 输入命令:debug JC.exe [Enter],调试程序,并记录运行过程;7. 完成实验报告。
ARM汇编解决阶乘及⼤⼩写转换的问题环境以及硬件⼀、硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bit RISC microprocessor 芯⽚,仿真器为 J-LINK⼆、编写指令软件为 Integrated Development Environment ,软件仿真为 ARMulate.dll三、需要基于ARM7硬件平台的C语⾔启动代码,⽤于分配中断向量表,初始化ISR地址,初始化堆栈空间,初始化应⽤程序执⾏环境,配置存储器系统,设定时钟周期,呼叫主应⽤程序。
四、这⾥仅有关键算法代码ARM汇编求⼀个数的阶乘题⽬:R1寄存器内数据的阶乘运算,结果存放在R0mov r1,#6 ;将⽴即数 6 送⾄ R1,即为‘6'的阶乘,可以更改mov r0,r1 ;将 R1 的值给R0loop ;定义⼀个循环体标签subs r1,r1,#1 ;将 R1-R1 的给R1mul r0,r0,r1 ;将 R0*R1 的值给R0cmp r1,#1 ;将 R1 与 1 做⽐较BNE loop ;上⾯的值不相等则跳转⾄ loopARM汇编⼤⼩写转换以及存⼊内存题⽬:将内存地址0XC100000开始处的字符串"Welcome to CSUST!"中对应的⼩写字母转换成⼤写,⼤写变换成⼩写。
说明:此算法存在局限性,只能转换不包含ASSIC码值⼤于‘127'和在‘91~96'之间的字符串STRING_WELCOMEDCB "Welcome to CSUST!\n\0" ;声明⼀个字符串STRINGLDR r0,=STRING_WELCOME ;取得字符串的⾸地址mov r1,#0x0c100000 ;将#0x0c100000给 R1,⽬的为将R1指向⽬标地址STRING2LDRB r2,[r0] ;取出⼀个字符给 R2cmp r2,#97 ;将 R2 与 97(即‘a')作⽐较BGE BIGWORD ;⼤于或等于 97 则跳转⾄ BIGWORD ⼦程序cmp r2,#65 ;将 R2 与 65(即‘A')作⽐较BGE SMALLWORD ;⼤于或等于 65 则跳转⾄ SMALLWORD ⼦程序B MYLOOP ;跳转⾄MYLOOP,存字符BIGWORD ;⼤写转⼩写⼦程序sub r2,r2,#32 ;⼤写字母的assci码-32 即可转换为⼩写B MYLOOP ;跳转⾄ MYLOOP,存字符SMALLWORD ;⼩写转⼤写⼦程序add r2,r2,#32 ;⼩写字母的assci码+32 即可转换为⼤写MYLOOP ;存字符⼦程序STRB r2,[r1] ;存⼊R1指定的内容add r0,r0,#1 ;R0=R0+1add r1,r1,#1 ;R1=R1+1CMP r2,#'\0' ;将R2与‘\0'作⽐较,⽬的是判断是否已经取完了字符串BNE STRING2 ;上⼀个⽐较不相等则跳转⾄ STRING2 继续取字符ASSIC码表说明1、程序均为原创,不⼀定为最好的解法,欢迎留⾔或者私信交流;2、需要开发环境或者其他资料的也欢迎留⾔或者私信;3、若有侵犯个⼈或团体的权益请及时联系我;4、本⽂为原创,转载或引⽤请注明出处到此这篇关于ARM汇编解决阶乘及⼤⼩写转换的⽂章就介绍到这了,更多相关ARM汇编⼤⼩写转换内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
一、arm的认知及基本概念(一).arm的基本概念1.什么是armarm是一家英国电子公司的名字,全名是Advanced RISC Machine这家企业设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器,ARM公司只设计芯片而不生产,它将技术授权给世界上许多公司和厂商。
目前采用arm技术知识产权内核的微处理器,即通常所说的arm微处理器所以arm也是对一类微处理器的通称。
arm指令集体系版本号(软件)为V1 ~ V7目前V1 ~ V3已很少见。
从V4版不再与以前的版本兼容。
arm的CPU系列(硬件)主要有ARM7 ~ ARM112.典型的嵌入式处理器arm 占市场79.5%ARMmips 占市场13.9%MIPSmicroSPARC 占市场3.1%SUNPowerPc 占市场2.8%IBM其它占市场0.8%3. arm的应用范围:工业控制:如机床、自动控制等无线通信:如手机网络应用:如电子产品:如音视频播放噐、机顶盒、游戏机、数码相机、打印机其它各领域:如军事、医疗、机器人、xx等4.计算机体系结构见图:xx.xx计算机体系图xx.xx体系结构处理器使用同一个存储器,经由同一个总线传输完成一条指令需要3个步骤:即取指令->指令译码->执行指令指令和数据共享同一总线的结构哈佛体系结构将程序指令存储和数据存储分开中央处理器首先到程序指令存储器中读取程序指令。
解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。
5.复杂指令集与精简指令集CISC 复杂指令集:采用冯.诺依曼体系结构。
数据线和指令线分时复用(只能通过一辆车)。
存储器操作指令多汇编程序相对简单指令结束后响应中断CPU电路丰富面积大功耗大RISC 精简指令集:采用哈佛体系结构。
数据线和指令线分离(同时能通过多辆车)。
对存储器操作有限汇编程序占空间大在适当地方响应中断CPU电路较少体积小功耗低ARM采用RISC精简指令集Thumb是ARM体系结构中一种16位的指令集。
ARM汇编语言程程序设计精讲
阶乘操作实例解析
求一个数的阶乘(64位结果)
用ARM汇编语言设计程序实现求20!(即20的阶乘),并将其64位结果放在[R9:R8]中。
(R9中存放高32位)
解:程序设计思路:64位结果的乘法指令通过两个32位的寄存器相乘,可以得到64位的结果,在每次循环相乘中,我们可以将存放64位结果两个32位寄存器分别与递增量相乘,最后将得到的高32 位结果相加。
程序设计流程如图7-1所示:
程序设计流程图
程序代码如下:
在ARM集成开发环境下编程ADS:
;
声明代码段Fctrl
AREA
Fctrl,CODE,READONL Y
ENTRY ; 标识程序入口
CODE32 ; 声明32 位ARM 指令START
MOV R8 , #20 ;低位初始化
MOV R9 , #0 ;高位初始化
SUB R0,R8,#1 ;初始化计数器
Loop
MOV R1 , R9 ;暂存高位值
UMULL R8 , R9 , R0 , R8 ;[R9:R8]=R0*R8
MLA R9 , R1 , R0 , R9 ;R9=R1*R0+R9
#1 ;计数器递减
,
R0
,
SUBS R0
BNE Loop ;计数器不为0继续循环Stop
B Stop
END ; 文件结束
程序执行后输出结果如下:R8=0x82B40000
R9=0x21C3677C。
ARM汇编语言程程序设计精讲
阶乘操作实例解析
求一个数的阶乘(64位结果)
用ARM汇编语言设计程序实现求20!(即20的阶乘),并将其64位结果放在[R9:R8]中。
(R9中存放高32位)
解:程序设计思路:64位结果的乘法指令通过两个32位的寄存器相乘,可以得到64位的结果,在每次循环相乘中,我们可以将存放64位结果两个32位寄存器分别与递增量相乘,最后将得到的高32 位结果相加。
程序设计流程如图7-1所示:
程序设计流程图
程序代码如下:
在ARM集成开发环境下编程ADS:
;
声明代码段Fctrl
AREA
Fctrl,CODE,READONL Y
ENTRY ; 标识程序入口
CODE32 ; 声明32 位ARM 指令START
MOV R8 , #20 ;低位初始化
MOV R9 , #0 ;高位初始化
SUB R0,R8,#1 ;初始化计数器
Loop
MOV R1 , R9 ;暂存高位值
UMULL R8 , R9 , R0 , R8 ;[R9:R8]=R0*R8
MLA R9 , R1 , R0 , R9 ;R9=R1*R0+R9
#1 ;计数器递减
,
R0
,
SUBS R0
BNE Loop ;计数器不为0继续循环Stop
B Stop
END ; 文件结束
程序执行后输出结果如下:R8=0x82B40000
R9=0x21C3677C。