ARM嵌入式系统编程期末考试

算术运算:

   AREA  Exam,CODE,READONLY                     
   ENTRY                                                                  
      ADR     r4,a		(取a的地址放到r4)       
      LDR     r0,[r4]   (按照r4的地址找到值a,将值放到r0) 
   END
      ADR     r4,b		(取b的地址放到r4)
      LDR     r1,[r4]	(按照r4的地址找到值b,将值放到r1)
      ADD     r3,r0,r1	(r3=r0+r1)
      ADR     r4,c		(取c的地址放到r4)
      LDR     r2,[r4]	(按照r4的地址找到值c,将值c放到r2)
      SUB     r3,r3,r2	(r3=r3-r2)
      ADR     r4,x		(取x的地址放到r4)
      STR     r3,[r4]	(将r3的值存放到地址为r4的寄存器中)
 stop
      B  stop
      
a   DCD   0x03 
b	DCD   0x02
c   DCD   0x01
x   DCD   0x0

逻辑运算

   AREA  Exam,CODE,READONLY
   ENTRY      
      ADR   r4,a           (取a的放到r4)          
      LDR   r0,[r4]        (按照r4的地址找到值a,将值放到r0)
   END
      MOV   r0,r0,LSL #2    (r0=r0<<2)
      ADR   r4,b           (取b的放到r4)          
      LDR   r1,[r4]        (按照r4的地址找到值b,将值放到r1)
      AND   r1,r1,#15       (得到r1的后4位)
      ORR   r1,r0,r1       (r1=r0||r1)
      ADR   r4,x		   (取x的地址放到r4)
      STR   r1,[r4]	       (将r1的值存放到地址为r4的寄存器中)
stop
      B  stop

 a   DCD     0x03 
 b   DCD     0x02
 c   DCD     0x01
 x   DCD     0x0

分支语句

方法一:

      AREA  Exam,CODE,READONLY
      ENTRY   
      ADR    r4,a  
      LDR    r0,[r4]   
      ADR    r4,b
      LDR    r1,[r4]
      CMP    r0,r1      (比较r0和r1)
      BGE    tblock     (如果r0>r1,跳转到tblock)
      NOP               (空语句)
 fblock
      ADR     r4,c
      LDR     r0,[r4]
      ADR     r4,d
      LDR     r1,[r4]
      ADD     r0,r0,r1
      ADR     r4,x       (读取x偏移量的地址的值,读取到r4)
      STR     r0,[r4]    (将r0的值存放到寄存器地址为r4的寄存器中)
      B       stop
tblock  
      ADR     r4,c  
      LDR     r0,[r4] 
END
      ADR     r4,d
      LDR     r1,[r4]
      SUB     r0,r0,r1
      ADR     r4,x
      STR     r0,[r4]
stop
      B  stop
      
a    DCD    0x03  
b    DCD    0x02 
c    DCD    0x01 
d    DCD    0x04
x    DCD    0x04

方法二:

      AREA  Exam,CODE,READONLY
      ENTRY                                                            
      ADR    r4,a                                                      
      LDR    r0,[r4]                                                       
      ADR    r4,b
      LDR    r1,[r4]
      CMP    r0,r1
      ADR    r4,c
      LDR    r0,[r4]
      ADR    r4,d
      LDR    r1,[r4]
      SUBGE  r0,r0,r1   (r0=r0-r1;GE的意思是大于等于,可以用在任何一句之后)
      ADDLT  r0,r0,r1   (如果NV相异,则执行r0=r0+r1;否则不执行)
      ADR    r4,x
      STR    r0,[r4]
 stop
      B   stop

a    DCD    0x03
b    DCD    0x02
c    DCD    0x01
d    DCD    0x04
x    DCD    0x04
      END 

循环处理

      AREA  Exam,CODE,READONLY
      ENTRY                                                            
      MOV   r0,#0                                                      
      MOV   r8,#0
      ADR   r2,N
      LDR   r1,[r2]
      MOV   r2,#0
      ADR   r3,c
      ADR   r5,x
 loop
      LDR   r4,[r3,r8]
      LDR   r6,[r5,r8]
      MUL   r9,r4,r6
      ADD   r2,r2,r9 
      ADD   r8,r8,#4 
      ADD   r0,r0,#1
      CMP   r0,r
      BLT   loop
stop
      B  stop

N    DCD    0x03
C    DCD    0x01, 0x02, 0x03, 0x04, 0x05, 0x06
x    DCD    0x01, 0x02, 0x03, 0x04, 0x05, 0x06
     END

数据块复制操作

	  AREA Exam,CODE,READONLY
      ENTRY                                                            
      LDR   R0,=DATA_DST
      LDR   R1,=DATA_STC
      MOV   R10,#5
LOOP
      LDMIA   R1!,{R2-R5}
      STMIA   R0!,{R2-R5}
      SUBS    R10,R10,#1
      BNE     LOOP
stop
       B  stop

DATA_STC    DCD  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
DATA_DST    DCD   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        END 

练习:

求一个数的阶乘(64位结果)

用ARM汇编语言设计程序实现求20!,并将其64位结果放在[R9:R8]中(R9中存放高32位)。

      AREA  Fctrl,CODE,READONLY  (声明代码Fctrl)
      ENTRY                      (标识程序入口)
      CODE32                     (声明32位ARM指令)
START
      MOV      R8 , #20          (低位初始化)
      MOV      R9 , #0           (高位初始化)
      SUB      R0 , R8 , #1      (初始化计数器,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)
      SUBS     R0 , R0 , #1      (计数器递减,R0=R0-1)
      BNE      Loop              (计数器不为0继续循环)
Stop
      B     Stop
      END                        (文件结束)

对数据区进行64位累加操作

先对内存地址0x3000开始的100个字内存单元填入0x10000001~0x10000064字数据,然后将每个字单元进行64位累加,结果保存于[R9:R8]中(R9中存放高32位) 。

      AREA  Fctrl,CODE,READONLY  (声明代码Fctrl)
      ENTRY                      (标识程序入口)
      CODE32                     (声明32位ARM指令)
START
      MOV      R0 , #0x3000      (初始化寄存器)
      MOV      R1 , #0x10000001
      MOV      R2 , #100
loop_1                           (第一次循环赋值)
      STR      R1 , [R0] , #4    (将R1中的值存到R0所指定的地址中, 同时R0=R0+4)
      ADD      R1 , R1 , #1
      SUBS     R2 , R2 , #1
      BNE      loop_1
 
     MOV      R0 , #0x3000
     MOV      R2 , #100
     MOV      R9 , #0
     MOV      R8 , #0      
     
loop_2                          (第二次循环累加)
      LDR     R1 , [R0] , #4    (将R0地址中的值存到R1中, 同时R0=R0+4)
      ADDS    R8 , R1 , R8      (R8=R8+1,进位影响标志位)
      ADC     R9 , R9 , #0      (R9加上R8对R9的进位)
      SUBS    R2 , R2 , #1
      BNE     loop_2
Stop
      B     Stop
      END                       (文件结束)

用ARM指令实现内存数据区块拷贝操作

内存数据区定义如下:

Src
    DCD 1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12
Dst
    DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

请用ARM汇编语言编写程序,实现将数据从源数据区Src拷贝到目标数据区Dst,要求以4个字为单位进行块拷贝,如果不足4个字时则以字为单位进行拷贝。

NUM EQU 18		                    (设置要拷贝的字数)
      AREA Copy_Data, CODE,READONLY (声明代码段Copy_Data)
      ENTRY                         (标识程序入口)					
      CODE32                        (声明32位ARM指令)		
START
      LDR     R0, =Src		        (R0=源数据区指针)			
      LDR     R1, =Dst				(R1=目标数据区指针)
      MOV     R2, #NUM				
      MOV     SP, #0x9000				
      MOVS    R3,R2, LSR #2		    (获得块拷贝的次数)
      BEQ     Copy_Words			 
      STMFD   SP!, {R5-R8}			(保存将要使用的寄存器R5~R8)
Copy_4Word
      LDMIA   R0!, {R5-R8}			 (LDM指令执行后自增4)
      STMIA   R1!, {R5-R8}			 (STM指令执行后自增4)
      SUBS    R3, R3, #1					
      BNE	  Copy_4Word			
      LDMFD   SP!, {R5-R8}		    (恢复寄存器R5~R8)
 Copy_Words
      ANDS    R2, R2, #3	        (获得剩余的数据的次数)	
      BEQ     Stop			
Copy_Word
      LDR     R3, [r0], #4				
      STR     R3, [r1], #4				
      SUBS    R2, R2, #1					
      BNE	  Copy_Word	
Stop
      B	Stop
      LTORG
Src
      DCD    1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12
Dst
      DCD    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      END                  (文件结束)
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
嵌入式期末考试编程题通常涉及到嵌入式系统的设计和编程。以下是一个示例的嵌入式期末考试编程题: 题目:设计一个嵌入式系统,实现一个简单的温度监测和控制系统。系统要求能够读取温度传感器的数据,并根据设定的温度范围控制一个风扇的开关。 设计思路: 1. 首先,需要连接一个温度传感器到嵌入式系统的GPIO引脚上,以便读取温度数据。 2. 使用适当的编程语言(如C或C++)编写程序,通过GPIO接口读取温度传感器的数据。 3. 将读取到的温度数据与设定的温度范围进行比较,判断是否需要开启或关闭风扇。 4. 根据比较结果,控制GPIO引脚上的风扇开关信号,以实现风扇的开启或关闭。 示例代码(使用C语言): ```c #include <stdio.h> #include <wiringPi.h> #define TEMPERATURE_PIN 0 // 温度传感器连接的GPIO引脚 int main(void) { wiringPiSetup(); // 初始化wiringPi库 pinMode(TEMPERATURE_PIN, INPUT); // 设置GPIO引脚为输入模式 while (1) { int temperature = digitalRead(TEMPERATURE_PIN); // 读取温度传感器的数据 if (temperature > 25) { printf("Temperature is too high. Turning on the fan.\n"); // 控制风扇开启的代码 } else { printf("Temperature is within the acceptable range. Turning off the fan.\n"); // 控制风扇关闭的代码 } delay(1000); // 延时1秒 } return 0; } ``` 请注意,以上代码仅为示例,实际的嵌入式系统设计和编程需要根据具体的硬件平台和需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王跃坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值