Write a program to multiply two 16 bit binary numbers.
;/* PROGRAM TO MULTIPLY TWO 16BIT NUMBERS
*/
;/* VALUE1: 1900H (6400) (IN R1)
*/
;/* VALUE2: 0C80H (3200) (IN R2)
*/
;/* RESULT: 1388000H(20480000) (IN R3)
*/
AREA MULTIPLY , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV r1,#6400 ; STORE FIRST NUMBER IN R0
MOV r2,#3200 ; STORE SECOND NUMBER IN R1
MUL r3,r1,r2 ; MULTIPLICATION
NOP
NOP
NOP
END ;Mark end of file
Write a program to find the sum of first 10 integer numbers.
;sum 10 to 1 is 55 but reslut in the register is in hex decimal(0x37)
AREA SUM,CODE,READONLY
ENTRY
MOV R1,#10 ; load 10 to regester
MOV R2,#0 ; empty the register to store result
loop
ADD R2,R2,R1 ; add the content of R1 with result at R2
SUBS R1,#0x01 ; Decreament R1 by 1
BNE loop ; repeat till r1 goes 0
back B back ; jumps back to C code
END
Write a program to find factorial of a number
;/* PROGRAM TO FIND FACTORIAL OF A GIVEN NUMBER
*/
;/* In this example we have taken n=7
*/
;/* Check the result in R0/R3 register =13B0H (5040)
*/
AREA FACTORIAL , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV r0, #3 ; STORE FACTORIAL NUMBER IN R0
MOV r1,r0 ; MOVE THE SAME NUMBER IN R1
FACT SUBS r1, r1, #1 ; SUBTRACTION
CMP r1, #1 ; COMPARISON
BEQ STOP
MUL r3,r0,r1; ; MULTIPLICATION
MOV r0,r3 ; Result
BNE FACT ; BRANCH TO THE LOOP IF NOT EQUAL
STOP
NOP
NOP
NOP
END ;Mark end of file
Write a program to add an array of 16 bit numbers and store the 32
bit result in internal RAM
;/* ARRAY OF 6 NUMBERS 0X1111,0X2222,0X3333,0XAAAA,0XBBBB,0XCCCC
*/
;/* THE SUM IS 29997H THE RESULT CAN BE VIEWED IN LOCATION 0X40000000 &
ALSO IN R0 */
*/
AREA ADDITION , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV R5,#6 ; INTIALISE COUNTER TO 6(i.e. N=6)
MOV R0,#0 ; INTIALISE SUM TO ZERO
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LOOP
LDRH R3,[R1],#02 ; READ 16 BIT DATA
ADD R0,R0,R3 ; ADD R2=R2+R3
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0
BNE LOOP ; LOOK BACK TILL ARRAY ENDS
LDR R4,=RESULT ; LOADS THE ADDRESS OF RESULT
STR R0,[R4] ; STORES THE RESULT IN R1
JMP B JMP
VALUE1 DCW 0X1111,0X2222,0X3333,0XAAAA,0XBBBB,0XCCCC ; ARRAY OF
16 BIT NUMBERS(N=6)
AREA DATA2,DATA,READWRITE ; TO STORE RESULT IN GIVEN
ADDRESS
RESULT DCD 0X0
END ; Mark end of file
Write a program to find the square of a number (1 to 10) using look-
up table
;/* Assembly Program to find square of Number
*/
;/* GIVEN NUMBER IS 6 (R1) THEN RESULT IS IN R3=24H(36)
*/
AREA SQUARE , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
LDR R0, = TABLE1 ; Load start address of Lookup table
LDR R2, = 0X40000000
LDR R1,[R2] ; Load no whose square is to be find
MOV R1, R1, LSL#0x2 ; Generate address corresponding to square of given
no
ADD R0, R0, R1 ; Load address of element in Lookup table
LDR R3, [R0] ; Get square of given no in R3
NOP
NOP
NOP
;Lookup table contains Squares of nos from 0 to 10 (in hex)
TABLE1 DCD 0X00000000; SQUARE OF 0=0
DCD 0X00000001; SQUARE OF 1=1
DCD 0X00000004; SQUARE OF 2=4
DCD 0X00000009; SQUARE OF 3=9
DCD 0X00000010; SQUARE OF 4=16
DCD 0X00000019; SQUARE OF 5=25
DCD 0X00000024; SQUARE OF 6=36
DCD 0X00000031; SQUARE OF 7=49
DCD 0X00000040; SQUARE OF 8=64
DCD 0X00000051; SQUARE OF 9=81
DCD 0X00000064; SQUARE OF 10=100
END ; Mark end of file
Write a program to find the largest/smallest number in an array of
32 numbers .
;/* PROGRAM TO FIND SMALLEST NUMBER IN AN ARRAY & STORE IN INTERNAL
RAM */
;/* ARRAY OF 7 NUMBERS 0X44444444 ,
0X22222222,0X11111111,0X22222222,0XAAAAAAAA */
;/* 0X88888888 ,0X99999999
*/
;/* RESULT CAN BE VIEWED IN LOCATION 0X40000000 & ALSO IN R2
*/
AREA SMALLEST , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV R5,#6 ; INTIALISE COUNTER TO 6(i.e. N=7)
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LOOP
LDR R4,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
CMP R2,R4 ; COMPARE NUMBERS
BLS LOOP1 ; IF THE FIRST NUMBER IS < THEN GOTO
LOOP1
MOV R2,R4 ; IF THE FIRST NUMBER IS > THEN MOV
CONTENT R4 TO R2
LOOP1
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY ENDS
LDR R4,=RESULT ; LOADS THE ADDRESS OF RESULT
STR R2,[R4] ; STORES THE RESULT IN R1
NOP
NOP
NOP
; ARRAY OF 32 BIT NUMBERS(N=7)
VALUE1
DCD 0X44444444 ;
DCD 0X22222222 ;
DCD 0X11111111 ;
DCD 0X22222222 ;
DCD 0XAAAAAAAA ;
DCD 0X88888888 ;
DCD 0X99999999 ;
AREA DATA2,DATA,READWRITE ; TO STORE RESULT IN GIVEN
ADDRESS
RESULT DCD 0X0
END ; Mark end of file
Write a program to arrange a series of 32 bit numbers in
ascending/descending order.
;/* PROGRAM TO sort in ascending order
*/
;/* ARRAY OF 4 NUMBERS 0X44444444 ,0X11111111,0X33333333,0X22222222
*/
;/* SET A BREAKPOINT AT START1 LABLE & RUN THE PROGRAM
*/
;/* CHECK THE UNSORTED NUMBERS AT LOCATION 0X40000000 NEXT
*/
;/* RESULT CAN BE VIEWED AT LOCATION 0X40000000
*/
*/
AREA ASCENDING , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV R8,#4 ; INTIALISE COUNTER TO 4(i.e.
N=4)
LDR R2,=CVALUE ; ADDRESS OF CODE REGION
LDR R3,=DVALUE ; ADDRESS OF DATA REGION
LOOP0
LDR R1,[R2],#4 ; LOADING VALUES FROM
CODE REGION
STR R1,[R3],#4 ; STORING VALUES TO DATA
REGION
SUBS R8,R8,#1 ; DECREMENT COUNTER
CMP R8,#0 ; COMPARE COUNTER TO 0
BNE LOOP0 ; LOOP BACK TILL ARRAY
ENDS
START1 MOV R5,#3 ; INTIALISE COUNTER TO 3(i.e.
N=4)
MOV R7,#0 ; FLAG TO DENOTE EXCHANGE
HAS OCCURED
LDR R1,=DVALUE ; LOADS THE ADDRESS OF
FIRST VALUE
LOOP LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LDR R3,[R1] ; LOAD SECOND NUMBER
CMP R2,R3 ; COMPARE NUMBERS
BLT LOOP2 ; IF THE FIRST NUMBER IS <
THEN GOTO LOOP2
STR R2,[R1],#-4 ; INTERCHANGE NUMBER R2 &
R3
STR R3,[R1] ; INTERCHANGE NUMBER R2 &
R3
MOV R7,#1 ; FLAG DENOTING EXCHANGE
HAS TAKEN PLACE
ADD R1,#4 ; RESTORE THE PTR
LOOP2
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY
ENDS
CMP R7,#0 ; COMPARING FLAG
BNE START1 ; IF FLAG IS NOT ZERO
THEN GO TO START1 LOOP
NOP
NOP
NOP
; ARRAY OF 32 BIT NUMBERS(N=4) IN CODE REGION
CVALUE
DCD 0X44444444 ;
DCD 0X11111111 ;
DCD 0X33333333 ;
DCD 0X22222222 ;
AREA DATA1,DATA,READWRITE ;
; ARRAY OF 32 BIT NUMBERS IN DATA REGION
DVALUE
DCD 0X00000000 ;
END ; Mark end of file
Descending order
;/* PROGRAM TO sort in Descending order
*/
;/* ARRAY OF 4 NUMBERS 0X44444444 ,0X11111111,0X33333333,0X22222222
*/
;/* SET A BREAKPOINT AT START1 LABLE & RUN THE PROGRAM
*/
;/* CHECK THE UNSORTED NUMBERS AT LOCATION 0X40000000 NEXT
*/
;/* RESULT CAN BE VIEWED AT LOCATION 0X40000000
*/
*/
AREA DESCENDING , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV R8,#4 ; INTIALISE COUNTER TO 4(i.e.
N=4)
LDR R2,=CVALUE ; ADDRESS OF CODE REGION
LDR R3,=DVALUE ; ADDRESS OF DATA REGION
LOOP0
LDR R1,[R2],#4 ; LOADING VALUES FROM
CODE REGION
STR R1,[R3],#4 ; STORING VALUES TO DATA
REGION
SUBS R8,R8,#1 ; DECREMENT COUNTER
CMP R8,#0 ; COMPARE COUNTER TO 0
BNE LOOP0 ; LOOP BACK TILL ARRAY
ENDS
START1 MOV R5,#3 ; INTIALISE COUNTER TO 3(i.e.
N=4)
MOV R7,#0 ; FLAG TO DENOTE EXCHANGE
HAS OCCURED
LDR R1,=DVALUE ; LOADS THE ADDRESS OF
FIRST VALUE
LOOP LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LDR R3,[R1] ; LOAD SECOND NUMBER
CMP R2,R3 ; COMPARE NUMBERS
BGT LOOP2 ; IF THE FIRST NUMBER IS >
THEN GOTO LOOP2
STR R2,[R1],#-4 ; INTERCHANGE NUMBER R2 &
R3
STR R3,[R1] ; INTERCHANGE NUMBER R2 &
R3
MOV R7,#1 ; FLAG DENOTING EXCHANGE
HAS TAKEN PLACE
ADD R1,#4 ; RESTORE THE PTR
LOOP2
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY
ENDS
CMP R7,#0 ; COMPARING FLAG
BNE START1 ; IF FLAG IS NOT ZERO
THEN GO TO START1 LOOP
NOP
NOP
NOP
; ARRAY OF 32 BIT NUMBERS(N=4) IN CODE REGION
CVALUE
DCD 0X44444444 ;
DCD 0X11111111 ;
DCD 0X33333333 ;
DCD 0X22222222 ;
AREA DATA1,DATA,READWRITE ;
; ARRAY OF 32 BIT NUMBERS IN DATA REGION
DVALUE
DCD 0X00000000 ;
END ; Mark end of file
Write a program to count the number of ones and zeros in two
consecutive memory locations.
;/* PROGRAM TO COUNT THE NUMBER OF ONES & ZEROS IN TWO CONSECUTIVE
MEMORY LOCATIONS */
;/* WE TOOK TWO NUMBERS i.e. 0X11111111,0XAA55AA55 (R0)
*/
;/* CHECK THE RESULT IN R2 FOR ONES & R3 FOR ZEROS
*/
AREA ONEZERO , CODE, READONLY
ENTRY ;Mark first instruction to execute
START
MOV R2,#0 ; COUNTER FOR ONES
MOV R3,#0 ; COUNTER FOR ZEROS
MOV R7,#1 ; COUNTER TO GET TWO WORDS
LDR R6,=VALUE ; LOADS THE ADDRESS OF VALUE
LOOP MOV R1,#32 ; 32 BITS COUNTER
LDR R0,[R6],#4 ; GET THE 32 BIT VALUE
LOOP0 MOVS R0,R0,ROR #1 ; RIGHT SHIFT TO CHECK CARRY BIT
(1's/0's)
BHI ONES ; IF CARRY BIT IS 1 GOTO ONES
BRANCH OTHERWISE NEXT
ZEROS ADD R3,R3,#1 ; IF CARRY BIT IS 0 THEN INCREMENT
THE COUNTER BY 1(R3)
B LOOP1 ; BRANCH TO LOOP1
ONES ADD R2,R2,#1 ; IF CARRY BIT IS 1 THEN INCREMENT THE
COUNTER BY 1(R2)
LOOP1 SUBS R1,R1,#1 ; COUNTER VALUE DECREMENTED
BY 1
BNE LOOP0 ; IF NOT EQUAL GOTO TO LOOP0
CHECKS 32BIT
SUBS R7,R7,#1 ; COUNTER VALUE DECREMENTED
BY 1
CMP R7,#0 ; COMPARE COUNTER R7 TO 0
BNE LOOP ; IF NOT EQUAL GOTO TO LOOP
NOP
NOP
NOP
VALUE DCD 0X11111111,0XAA55AA55; TWO VALUES IN AN ARRAY
END ; Mark end of file