Write the LEGv8 assembly code to implement the following C c

Write the LEGv8 assembly code to implement the following C code:

lock(lk);

shvar=max(shvar,x);

unlock(lk);

Assume that the address of the lk variable is in X0, the address of the shvar variable is in X1, and the value of variable x is in X2. Your critical section should not contain any function calls use LDXR/STXR to perform an atomic update of the shvar variable directly, without using lock() and unlock(). Note that in this exercise there is no variable lk.

please explain it in detail

Solution

again:   addi   $a0, $0, 1       # lock(lk)
   ll   $t0, 0($s0)
   sc   $a0, 0($s0)
   beq   $a0, $0, again       # branch if store fails
   slt   $t1, $a1, $a2       # shvar = max(shvar,x)
   beq   $t1, $0, shvar       # if shvar > x, go to shvar
   add   $a1, $a2, $0
   j   ul
shvar:   add   $a1, $a1, $0
ul:   addi   $a0, $0, $0       # unlock(lk)
   sw   $a0, 0($s0)

Assume that the address of the lk variable is in a0, the address of the shvar variable is in a1, and the value of variable x is in a2. Your critical section should not contain any function calls. Use ll/sc instructions to implement the lock() operation, and the unlock() operation is simply an ordinary store instruction.

Write the LEGv8 assembly code to implement the following C code: lock(lk); shvar=max(shvar,x); unlock(lk); Assume that the address of the lk variable is in X0,

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site