ARM Embedded Systems Programming Final Exam

Arithmetic operations:

   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

logic operation

   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

branch statement

method one:

      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

Method Two:

      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 

Loop processing

      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

block copy operation

	  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 

practise:

Find the factorial of a number (64-bit result)

Use ARM assembly language to design a program to achieve seeking 20! , and put its 64-bit result in [R9:R8] (the upper 32 bits are stored in R9).

      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-bit accumulation operation on the data area

First fill in 0x10000001~0x10000064 word data for the 100 word memory units starting from memory address 0x3000, and then accumulate 64 bits of each word unit, and save the result in [R9:R8] (the upper 32 bits are stored in R9).

      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                       (文件结束)

Use ARM instruction to realize the copy operation of memory data block

The memory data area is defined as follows:

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

Please write a program in ARM assembly language to copy the data from the source data area Src to the target data area Dst. Block copy is required in units of 4 words. If there are less than 4 words, the copy is performed in units of words.

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                  (文件结束)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325908059&siteId=291194637