Write an ARM assembly language program that counts the number of 1’s for any value in R0. The program must assemble/compile in KEIL and must be able to run in the KEIL simulator. Generally, R0 may contain any value, but for purpose of this exercise, you may move 0x2345ABCD into R0. The number in R0 does not need be preserved. You may use any other registers as you need. The result, total count of 1’s in R0, should be in R1 when the program ends. “ UHCL: Unwala CENG 3371Microcontroller Programming Spring 2017
Copy the template below to your assembly file
AREA Lab_08_YourFirstName_YourLastName, CODE, READONLY
EXPORT __main
___main
LDR R0, =0x2345ABCD; This is how you assign large value to R0. MOV will NOT work!
stop B stop
END
Step 3: Change YourFirstName to your first name. Change YourLastName to your last name. Step 4: You are allowed to use ONLY the instructions below:
1. LDR[*]
2. MOV[*]
3. B[*].
4. ADC[*].
5. LSR[*]
Here is the solution. Please do upvote thank you.
I'm providing 2 codes.
Code 1:
LDR R0, =0x2345ABCD
LDR R2,=0x0
bit_count_loop:
MOVS r0,r0,LSR #1
ADC r1,r1,r2
BNE bit_count_loop
Explanation:-
we are just shifting the first bit of register R0 with 1
place.So,that the first bits goes to carry bit and it will added by
adc command in r1 and r2 is zero.
ADC r1=r1+r2+Carry => r1=r1+Carry .
BNE will check the flags set by MOVS.
Code 2:
;Define main
__main
;Assign value to r0
ldr r0, =0x2345ABCD
;Initialize r1
mov r1, #0
;Initialize r2
mov r2, #0
;Loop
loop
;Count zeros
clz r2, r0
;Shift left
lsl r0, r0, #1
;Compare value
cmp r2, #0
;Branch if equal
beq increment
;Compare
cmp r2, #32
;Compare
bne loop
;Compare
cmp r2, #32
;Branch
beq stop
;Define method
increment
;Increment
add r1, #1
;Repeat
b loop
;End
stop B stop
;End
END
Get Answers For Free
Most questions answered within 1 hours.