0% found this document useful (0 votes)
282 views

ARM Assembly Language Program Examples

Uploaded by

sagar salanke
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
282 views

ARM Assembly Language Program Examples

Uploaded by

sagar salanke
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 18

ARM Assembly Language Program Examples

1. ; Register Operation
AREA EX1, CODE, READONLY
ENTRY
START
MOV R1, #0x0004 ; R1=0x0004
MVN R2, #0x0004 ; R2=NOT (0x0004)
MVN R3, R1 ; R3=NOT (R1)
STOP B STOP
END

2. ; Arithmetic Operations
AREA EX2, CODE, READONLY
ENTRY
START
MOV R1, #5 ; R1 = 5
MOV R2, #6 ; R2 = 6
ADD R0, R1, R2 ; @ R0 = R1+R2
ADC R0, R1, R2 ; @ R0 = R1+R2+C
SUB R0, R1, R2 ; @ R0 = R1-R2
SBC R0, R1, R2 ; @ R0 = R1-R2+C-1
RSB R0, R1, R2 ; @ R0 = R2-R1
RSC R0, R1, R2 ; @ R0 = R2-R1+C-1
STOP B STOP
END
3. ; Logical Operations
AREA EX3, CODE, READONLY
ENTRY
START
LDR R1, =0x11111111 ; R1 = 0x11111111
LDR R2, =0x01100101 ; R2 = 0x01100101
AND R0, R1, R2 ; @ R0 = R1 and R2 = 0x01100101
ORR R0, R1, R2 ; @ R0 = R1 or R2 = 0x11111111
EOR R0, R1, R2 ; @ R0 = R1 xor R2 = 0x10011010
BIC R0, R1, R2 ; @ R0 = R1 and (NOT (R2)) = 0x10011010
STOP B STOP
END

5. ; Arithmetic and Logical Operations


AREA EX5, CODE, READONLY
ENTRY
START
LDR R3, =0x11111111 ; R1 = 0x11111111
LDR R7, =0x01100101 ; R2 = 0x01100101
ADD R3, R3, #1 ; @ R3:=R3+1 = 0x11111112
AND R8, R7, #0xff ; @ R8=R7 [7:0] = 0x00000001
STOP B STOP
END
6. ; Logical Shift Operations
AREA EX6, CODE, READONLY
ENTRY
START
LDR R2, =0x00000030 ; R2:=0x00000030, Example: 0…0 0011 0000
MOV R0, R2, LSL #2 ; @ R0:=R2<<2, and R2 unchanged
; After Execution R0=0x000000C0
; and R2=0x00000030
MOV R1, R2, LSR #2 ; @ R1:=R2>>2 and R2 unchanged
; Before R2=0x00000030, After Execution
; R1=0x0000000C and R2=0x00000030
LDR R3, =0xA0000030 ; R3:=0xA0000030
MOV R4, R3, ASR #2 ; @ R4:=R3>>2, R3 unchanged
; Example: 1010 0…0 0011 0000
; Before R3=0xA0000030, After Execution
; R4=0xE800000C and R3=0xA0000030
LDR R5, =0x00000031 ; R5:=0x00000031
MOV R6, R5, ROR #2 ; @ R6:=R5 rotate, R5 unchanged
; Example: 0…0 0011 0001
; Before R5=0x00000031, After Execution
; R6=0x4000000C and R5=0x00000031
LDR R0, =0x80000031
LDR R1, =0x80000000
ADDS R7, R0, R1 ; R7:=0x00000031 with C = 1
MOV R8, R7, RRX ; @ R8:=R7 rotated through carry and R7 unchanged
; Example: 0…0 0011 0001
; Before R7=0x00000031, C=1, After Execution
; R8=0x80000018, C=1, R7=0x00000031
STOP B STOP
END
7. ; Logical Shift Operations
AREA EX7, CODE, READONLY
ENTRY
START
MOV R1, #5
MOV R2, #6
MOV R3, #2
ADD R4, R1, R2, LSL R3 ; @ R0:=R1+R2*2^R3 = 0x1D
ADD R5, R1, R2, LSR R3 ; @ R0:=R1+R2/(2^R3) = 0x6
STOP B STOP
END

8. ; Register Operations
AREA EX8, CODE, READONLY
ENTRY
START
LDR R0, =0xB0000004 ; R0:=0xB0000004
LDR R1, =0xC0000005 ; R1:=0xC0000005
LDR R2, =0xD0000006 ; R2:=0xD0000006
LDR R3, =0xE0000007 ; R3:=0xE0000007
ADDS R4, R2, R0 ; R4:=0x8000000A with C:=1
ADC R5, R3, R1 ; R5:=0xA000000D, Add with Carry, Carry is not
; affected
LDR R1, =0x00000004 ; R1:=0x00000004
LDR R2, =0x00000005 ; R2:=0x00000005
MUL R0, R1, R2 ; R0:=(R1*R2)=0x14
STOP B STOP
END
9. ; Multiplication
AREA EX9, CODE, READONLY
ENTRY
START
LDR R0, =0x00000004 ; R0:=0x00000004
LDR R1, =0x00000005 ; R1:=0x00000005
LDR R2, =0x00000006 ; R2:=0x00000006
LDR R3, =0x00000007 ; R3:=0x00000007
MUL R0, R1, R2 ; R0:=(R1*R2)=30 (Decimal)=0x0000001E
MOV R0, #4 ; R0:=4
MLA R4, R3, R2, R1 ; R4:=R3xR2+R1 = 47 (Decimal) = 0x0000002F
MOV R1, #35 ; R1:=35 (Decimal) = 0x00000023
MUL R2, R0, R1 ; R2:=R0xR1 = 140 (Decimal) = 0x0000008C
ADD R0, R0, R0, LSL #2 ; R0=5xR0 = 20 (Decimal) = 0x00000014
RSB R2, R0, R0, LSL #3 ; Reverse Subtraction: R2=(2^3)xRo-R0 = 7xR0 = 7x20
; = 140 = 0x0000008C
STOP B STOP
END
10. ; Memory Operations
AREA EX10, CODE, READONLY
ENTRY
START
ADR R1, table ; Address of 0x11 = 0x0000002C
LDR R0, [R1] ; @ mem[R1] = 0x11
LDR R0, [R1, #4] ; @ Constant Offset - Pre-Indexed Addressing:
; R0=mem[R1+4]=0x22, R1 unchanged = 0x2C
LDR R0, [R1, #4]! ; @ Auto-Indexed Addressing: R0=mem[R1+4]=22
; @ R1=R1+4 = 0x2C+4=0x30, No extra time, Fast
LDR R0, [R1], #4 ; @ Post Indexed Addressing: R0=mem[R1]=22
; R1=R1+4=0x34
MOV R2, #4 ; @ R2 = 4
LDR R0, [R1, R2] ; @ Register Offset - Pre-Indexed Addressing:
; R0=mem[R1+R2]=mem[34+4]=44, @ R1 unchanged = 0x34
LDR R0, [R1, R2]! ; @ Auto-Indexed Addressing: R0=mem[R1+R2] =
; mem[34+4] = 44, @ R1=R1+R2=38
LDR R0, [R1], R2 ; @ Post-Indexed Addressing: R0=mem[R1]=mem[0x38]=44,
; @ R1=R1+R2=38+4=3C
LDR R0, [R1, R2, LSL #2] ; @ Scaled Offset - mem[R1+2^R2] =
; mem[3C+16]=mem[4C]=99
STOP B STOP
table DCD 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99
END
11. ; Finding Smallest Number in an array
; Smallest Number in Register R2
AREA EX11, CODE, READWRITE
ENTRY
START
MOV r5, #0x0000000D
LDR r0, =Array ; load start address
LDR r6, =ArrayEnd ; load end address
LDR r2, [r0]
LOOP CMP r5, #0
BEQ STOP
LDR r3, [r0, #4]!
ADD r5, r5, #-1
CMP r2, r3
BMI LOOP
MOV r4, r2
MOV r2, r3
B LOOP
STOP B STOP
Array
DCD &5, &20, &32, &28, &13, &66, &3, &17, &23, &64, &112, &66, &2
ArrayEnd
END
13. ; Register and Memory Operations
AREA EX13, CODE, READONLY
ENTRY
START
MOV R0, #0x40000000 ; R0=0x40000000
MOV R5, &20 ; R5=20
STR R5, [R0] ; 0x40000000=20
LDR R1, [R0] ; R1=20
ADD R0, R0, #4 ; R0=R0+4=0x40000004
MOV R5, &30 ; R5=30
STR R5, [R0] ; 0x40000004=30
LDR R2, [R0] ; R2=Content of 0x40000004=30
ADD R3, R1, R2 ; R3=20+30=50
MOV R4, #0x4000001C ; R4=0x4000001C
STR R3, [R4] ; 0x4000001C=50
STOP B STOP
END

14. ; Addition of two numbers stored in Memory


AREA EX14, CODE, READONLY
ENTRY
START
LDR R1, =Value1 ; address loaded
LDR R2, =Value2
LDR R3, [R1] ; value accessed
LDR R4, [R2]
ADD R5, R3, R4
MOV R4, #0x4000001C
STR R5, [R4]
STOP B STOP
Value1 DCD &4
Value2 DCD &10
END
15. ; Finding Largest Number in an array
; Largest Number will be stored in the Register R2
AREA EX15, CODE, READWRITE
ENTRY
START
MOV r5, #0x0000000D
LDR r0, =Array ;load start address
LDR r6, =ArrayEnd ; load end address
LDR r2, [r0]
LOOP CMP r5, #0
BEQ STOP
LDR r3, [r0,#4]!
ADD r5, r5, #-1
CMP r2, r3
BPL LOOP
MOV r4, r2
MOV r2, r3
B LOOP
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
Array
DCD &5,&20,&32,&28,&13,&66,&3,&17,&23,&64,&112,&66,&2
ArrayEnd
END
16. ; Sorting Number in an array in Descending Order
; Sorted Numbers will be in the same array
AREA EX16, CODE, READWRITE
ENTRY
START
MOV r5, #0x0000000D
LOOP ADD r6, r5, #-1
CMP r5, #0
BEQ STOP
ADD r5, r5, #-1
LDR r0, =SortArray ; load start address
LOOP1 CMP r6, #0
BEQ LOOP
LDR r2, [r0]
LDR r3, [r0, #4]!
ADD r6, r6, #-1
CMP r2, r3
BPL LOOP1
MOV r4, r2
MOV r2, r3
MOV r3, r4
STR r2, [r0, #-4]
STR r3, [r0]
B LOOP1
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
SortArray
DCD &5,&20,&32,&28,&13,&68,&3,&17,&23,&64,&112,&66,&2
SortArrayEnd
END
17. ; Sorting Number in an array in Ascending Order
; Sorted Numbers will be in the same arry
AREA EX17, CODE, READWRITE
ENTRY
START
MOV r5, #0x0000000D
LOOP ADD r6, r5, #-1
CMP r5, #0
BEQ STOP
ADD r5, r5, #-1
LDR r0, =SortArray ; load start address
LOOP1 CMP r6, #0
BEQ LOOP
LDR r2, [r0]
LDR r3, [r0, #4]!
ADD r6, r6, #-1
CMP r2, r3
BMI LOOP1
MOV r4, r2
MOV r2, r3
MOV r3, r4
STR r2, [r0, #-4]
STR r3, [r0]
B LOOP1
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
SortArray
DCD &5,&20,&32,&28,&13,&68,&3,&17,&23,&64,&112,&66,&2
SortArrayEnd
END
18. ; Sum of Number in an array
; Sum is stored in a memory location next to last number in the array
AREA EX18, CODE, READWRITE
ENTRY
START
MOV r5, #0x00000009
LDR r0, =Array ; load start address
LDR r1, =ArrayEnd
LDR r2, [r0]
LOOP LDR r3, [r0, #4]!
ADD r2, r2, r3
STR r2, [r1]
ADD r5, r5, #-1
CMP r5, #0
BNE LOOP
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
Array
DCD 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA
ArrayEnd
END
19. ; To find Factorial of a Number
AREA EX19, CODE, READWRITE
ENTRY
START
LDR r0, =Number ; load address of the number
LDR r1, [r0]
MOV r2, r1
LOOP ADD r2, r2, #-1
CMP r2, #0
BLE STOP
MUL r3, r1, r2
MOV r1, r3
STR r1, [r0, #4]
B LOOP
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN

Number DCD &6


END
20. ; To find Fibonacci Series upto a Number
AREA EX20, CODE, READWRITE
ENTRY
START
LDR r0, =Number ; load address of the number
LDR r5, =NumberEnd
LDR r6, [r0]
MOV r1, #1
MOV r2, #1
STR r1, [r5]
LOOP STR r2, [r5, #4]!
ADD r3, r1, r2
MOV r4, r2
MOV r2, r3
MOV r1, r4
ADD r6, r6, #-1
CMP r6, #0
BNE LOOP
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
Number DCD &9
NumberEnd
END
21. ; Find Number of Negative Numbers in an array
; Result is stored in Register R2
AREA EX21, CODE, READWRITE
ENTRY
START
MOV r5, #0xA
LDR r0, =Array ; load start address
LDR r1, =ArrayEnd
MOV r2, #0
LOOP LDR r3, [r0]
CMP r3, #0
BMI LOOP1
LOOP2 ADD r0, r0, #4
LDR r3, [r0]
ADD r5, r5, #-1
CMP r5, #0
BNE LOOP
B STOP
LOOP1 ADD r2, r2, #1
B LOOP2
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
Array
DCD 0x80000001, 0x2, 0x80000003, 0x4, 0x80000005, 0x6, 0x80000007,
0x8, 0x80000009, 0x8000000A
ArrayEnd
END
22. ; Find Number of Possitive Numbers in an array
; Result is stored in Register R2
AREA EX22, CODE, READWRITE
ENTRY
START
MOV r5, #0xA
LDR r0, =Array ; load start address
LDR r1, =ArrayEnd
MOV r2, #0
LOOP LDR r3, [r0]
CMP r3, #0
BPL LOOP1
LOOP2 ADD r0, r0,#4
LDR r3, [r0]
ADD r5, r5, #-1
CMP r5, #0
BNE LOOP
B STOP
LOOP1 ADD r2, r2, #1
B LOOP2
STOP B STOP
; LTORG
; AREA my_data, DATA, READWRITE
; ALIGN
Array
DCD 0x80000001, 0x2, 0x3, 0x4, 0x80000005, 0x6, 0x80000007, 0x8, 0x9,
0x8000000A
ArrayEnd
END
23. ; Trace following instructions, assume list start at memory location 0x0000018
; and using ARM Big Endian
AREA EX23, CODE, READWRITE
ENTRY
START
ADR R0, LIST ; Load R0 with address of memory location List
; R0 = 0x00000024
MOV R10, #0x2
LDR R1, [R0] ; R0= 0x24 R1=0x34F532E5
LDR R2, [R0, #4]! ; R0= 0x28 R2 =0x010208FE
LDRB R3, [R0], #1 ; R0= 0x29 R3=0x01
LDRB R4, [R0, R10]! ; R0= 0x2B R4=0X8E
LDRSB R5, [R0], #1 ; R0= 0x2C R5=0xFFFFFF8E - Sign Extended
; Byte
LDRSH R6, [R0] ; R0= 0x2C R6=0x5658 - Sign Extended
; Half-word
STOP B STOP
LIST DCB 0x34, 0xF5, 0x32, 0xE5, 0x01, 0x02,0x8,0x8E,0x56,0x58,0x67
END
24. ; Trace following instructions, assume list start at memory location 0x0000018
; and using ARM Little Endian
AREA EX24, CODE, READWRITE
ENTRY
START
ADR R0, LIST ; Load R0 with address of memory location List
; R0 = 0x00000024
MOV R10, #0x2
LDR R1, [R0] ; R0= 0x24 R1=0xE532F534
LDR R2, [R0, #4]! ; R0= 0x28 R2 =0x8E080201
LDRB R3, [R0], #1 ; R0= 0x29 R3=0x01
LDRB R4, [R0, R10]! ; R0= 0x2B R4=0X8E
LDRSB R5, [R0], #1 ; R0= 0x2C R5=0xFFFFFF8E - Sign Extended
; Byte
LDRSH R6, [R0] ; R0= 0x2C R6=0x5856 - Sign Extended
; Half-word
STOP B STOP
LIST DCB 0x34, 0xF5, 0x32, 0xE5, 0x01, 0x02, 0x8, 0x8E, 0x56, 0x58, 0x67
END

You might also like