The GATE Grind

GATE 2023 CS – Question 41

Computer Organization and Architecture · Instruction Set and Addressing Modes · 2 marks · Multiple choice

Consider the given C-code and its corresponding assembly code, with a few operands U1–U4 being unknown. The memory is byte-addressable.

int a[10], b[10], i;
// int is 32-bit
for (i=0; i<10;i++)
  a[i] = b[i] * 8;
;r1-r5 are 32-bit integer registers
;initialize r1=0, r2=10
;initialize r3, r4 with base address of a, b
L01: jeq r1, r2, end ;if(r1==r2) goto end
L02: lw r5, 0(r4)    ;r5 <- Memory[r4+0]
L03: shl r5, r5, U1  ;r5 <- r5 << U1
L04: sw r5, 0(r3)    ;Memory[r3+0] <- r5
L05: add r3, r3, U2  ;r3 <- r3+U2
L06: add r4, r4, U3
L07: add r1, r1, 1
L08: jmp U4          ;goto U4
L09: end

Which one of the following options is a CORRECT replacement for operands in the position (U1, U2, U3, U4) in the above assembly code?

  1. (8, 4, 1, L02)
  2. (3, 4, 4, L01)
  3. (8, 1, 1, L02)
  4. (3, 1, 1, L01)

Practise this question in The GATE Grind →

Show answer and explanation

Correct answer: (B) (3, 4, 4, L01)

Explanation

Multiplying by 8 is a left shift by 3 (U1=3). int is 4 bytes, so both pointers advance by 4 (U2=U3=4). The jump must return to the loop test at L01 (U4=L01).