//----------------------------------------------------------------------
// rect.s
// Author: Bob Dondero and William Ughetta
//----------------------------------------------------------------------

        .section .rodata

lengthPromptStr:
        .string "Rectangle length:  "

widthPromptStr:
        .string "Rectangle width:  "

scanfFormatStr:
        .string "%d"

printfFormatStr:
        .string "The rectangle's perimeter is %d.\n"

//----------------------------------------------------------------------

        .section .data

//----------------------------------------------------------------------

        .section .bss

iLength:
        .skip   4

iWidth:
        .skip   4

iPerim:
        .skip   4

//----------------------------------------------------------------------

        .section .text

        //--------------------------------------------------------------
        // Read a rectangles length and width from stdin, and write
        // its perimeter to stdout.  Return 0.
        // int main(void)
        //--------------------------------------------------------------

        // Must be a multiple of 16
        .equ    MAIN_STACK_BYTECOUNT, 16

        .global main

main:
        
        // Prolog
        sub     sp, sp, MAIN_STACK_BYTECOUNT
        str     x30, [sp]
        
        // printf("Rectangle length:  ")
        adr     x0, lengthPromptStr
        bl      printf

        // scanf("%d", &iLength)
        adr     x0, scanfFormatStr
        adr     x1, iLength
        bl      scanf

        // printf("Rectangle width:  ")
        adr     x0, widthPromptStr
        bl      printf

        // scanf("%d", &iWidth)
        adr     x0, scanfFormatStr
        adr     x1, iWidth
        bl      scanf

        // iPerimeter = 2 * (iLength + iWidth)
        adr     x0, iLength
        ldr     w0, [x0]
        adr     x1, iWidth
        ldr     w1, [x1] 
        add     w0, w0, w1
        lsl     w0, w0, 1
           // Alternatives to lsl (either of these two):
           //    add w0, w0, w0
           //    mov w1, 2; mul w0, w0, w1
        adr     x1, iPerim
        str     w0, [x1]

        // printf("The rectangle's perimeter is %d.\n", iPerim)
        adr     x0, printfFormatStr
        adr     x1, iPerim
        ldr     w1, [x1]
        bl      printf
                
        // Epilog and return 0
        mov     w0, 0
        ldr     x30, [sp]
        add     sp, sp, MAIN_STACK_BYTECOUNT
        ret

        .size   main, (. - main)