Using the emulator, write, debug 8051 program to replace each element in an arra
ID: 3727322 • Letter: U
Question
Using the emulator, write, debug 8051 program to replace each element in an array of N 8-bit signed numbers by the average of its value and the proceeding element. Assume that the array is stored in ROM. Simulate your program with the following arrays: Array elements 12,-9,17,0, 5,6 25, 77,105, 123, 117, 92, 19, 20, 13,77 8,-12,-17, 33, -55, 29, 85, 22,-143, -88, 70, 34,111 10 13 For example, after executing the program first array it will be: 12, 1, 9,4,4,5 Notes: Resulted array must be stored in RAMExplanation / Answer
.data
# const string for welcome
welc: .asciiz "Welcome to SPIM Calculator one.0! "
p_int: .asciiz " Please provide associate degree integer: "
p_op: .asciiz " Please provide associate degree operator: "
i_err: .asciiz " Input Incorrect, unhealthy operator! "
again_str: .asciiz "Another calculation? (y/n)"
rmndr: .asciiz " r: "
new_line: .asciiz " "
int1: .word one # area to carry int one
int2: .word one # area to carry int a pair of
raw_in: .space one # area to carry raw input
op: .space one # area to carry operator char
a_char: .space one # area to carry once more char
out: .word one # area to carry output
remain: .word one # area to carry remainder
#operator constants
c_plus: .ascii "+" # const for +
c_min: .asciiz "-" # const for -
c_mult: .asciiz "*" # const for *
c_divi: .asciiz "/" # const for /
c_eq: .asciiz "=" # const for =
c_no: .asciiz "n" # const for n
.text
.globl main
main: li $v0, four # syscall four, print string
la $a0, welc # provide argument: string
syscall # truly print string
calc: la $t6, stay # load remainder variable
move $t6, $zero # store zero in remainder (reset)
li $v0, four # syscall four, print string
la $a0, purpose # provide argument: string
syscall # truly print string
li $v0, five # tell syscall we wish to browse int one
syscall # truly browse in int one
la $s1, int1 # load int1 into $s1
move $s1, $v0 # copy the number from $v0 to int1
li $v0, four # syscall four, print string
la $a0, purpose # provide argument: string
syscall # truly print string
li $v0, five # tell syscall we wish to browse int a pair of
syscall # truly browse in int a pair of
la $s2, int2 # provide $s2 the address to carry int a pair of
move $s2, $v0 # copy the number from $v0 to $s2
li $v0, four # syscall four, print string
la $a0, p_op # provide argument: string
syscall # truly print string
li $v0, eight # tell syscall we wish to browse operator
la $a0, op # provide $a0 the address to carry the operator
syscall # truly browse in operator
lb $t0, op # load the primary computer memory unit of op
li $t1, '+' # load const for and
li $t2, '-' # load const for minus
li $t3, '*' # load const for multiplying
li $t4, '/' # load const for dividing
la $s0, out # load dead set $s0
beq $t0, $t1, and # we're adding
beq $t0, $t2, minus # we're subtracting
beq $t0, $t3, multi # we're multiplying
beq $t0, $t4, divi # we're dividing
# else
j error # incorrect input
plus: add $s0, $s1, $s2 # add our ints, store in $t0
j print
minus: sub $s0, $s1, $s2 # work out our ints, store in $t0
j print
multi: slt $t1, $t2, $s2 # if our counter is a smaller amount than int2, set $t1 to one
beq $t1, $zero, print # if we've reached int2, we're done
add $s0, $s1, $s1 # add int1 and int1, store in out
j multi # loop
divi: la $t0 stay # load remainder into $t0
move $t0, $s1 # set remainder to dividend
add $s0, $zero, $zero # kicked off to zero, simply just in case
loop: slt $t1, $t0, $s2 # if remainder is a smaller amount than divisor, set 1
beq $t1, $zero, print # if we're done branch to done
sub $t0, $t0, $s2 # sub divisor from remainder, store in remainder
addi $s0, $s0, one # increment quotient by one
j loop # loop
print: li $v0, one # tell syscall we wish to print int
la $a0, int1 # provide syscall int1 to print
syscall # truly print int
li $v0, four # tell syscall we wish to print string
lb $a0, op # tell syscall we wish to print operator
syscall # truly print string
li $v0, one # tell syscall we wish to print int
la $a0, int2 # provide syscall int2 to print
syscall # truly print int
li $v0, four # tell syscall we wish to print string
la $a0, c_eq # tell syscall we wish to print operator
syscall # truly print string
li $v0, one # tell syscall we wish to print number
la $a0, out # provide syscall our output
syscall # truly print int
la $t0, stay # load remainder
beq $t0, $zero, once more # if we've no remainder, end printing
li $v0, four # tell syscall we wish to print string
la $a0, rmndr # tell syscall we wish to print remainder string
syscall # print "r: "
li $v0, one # tell syscall we wish to print int
la $a0, stay # provide syscall our remainder to print
syscall # print remainder
again: li $v0, four # tell syscall we wish to print string
la $a0, printing operation # tell syscall to print printing operation
syscall
la $a0, once more_str # load prompt for again string for syscall
syscall
li $v0, eight # tell syscall we wish to browse string
la $a0, a_char # tell syscall to place it in $a0
syscall
lb $t0, a_char
li $t1, 'n' # get n char thus we are able to compare
beq $t0, $t1, exit # if we have a tendency to ar done, exit
#else loop
j calc # jump to starting
error: li $v0, four # tell syscall we wish to print string
la $a0, i_err # provide syscall what to print
syscall # truly print
j once more # visit prompt for try
exit: li $v0, ten # exit code
syscall #exit!
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.