SPARC 어셈블리 언어- 윤년과 평년
728x90
SMALL
fmt1:    .asciz    "년도를 입력하세요(종료:음수) "
fmts:    .asciz    "%d"
fmt2:    .asciz    "%d 윤년입니다.\n"
fmt3:    .asciz    "%d 평년입니다.\n"
        .align    4
        
        .global main
main:   save    %sp,    -96,    %sp
loop:   set     fmt1,   %o0
        call    printf
        nop
        set     fmts,   %o0
        call    scanf
        add     %fp, -4,   %o1
        nop
        ld      [%fp-4], %l0 ! %l0가 입력받은 해
        ba      test
        nop

test:   cmp     %l0,    0
        bl      Exit        ! 음수일 경우 종료
        mov     %l0,    %o0 ! 400으로 나누어지는 경우 윤년
        mov     400,    %o1
        call .rem
        nop
        mov     %o0,    %l1
        cmp     %l1,    0
        bne     test_py      ! 나머지 0이아니면 평년인지 검사
        nop
        set     fmt2,   %o0
        call    printf
        mov     %l0,    %o1
        ba      loop
        nop

yoon:   set     fmt2,   %o0
        call    printf
        mov     %l0,    %o1
        ba      loop
        nop

test_py:mov     %l0,    %o0 ! 4로 나누어지는 경우
        mov     4,    %o1
        call .rem
        nop
        mov     %o0,    %l2
        cmp     %l2,    0   ! 여기서 나머지 있으면 평년, 없어도 100으로 나눠지면 평년
        be      divide  ! 나머지 없으면 100으로 나눠 평년인지 검사
        nop
        set     fmt3,   %o0 ! 4로 안나눠지면 평년, 실행과 년도 프린트
        call    printf
        mov     %l0,    %o1
        ba      loop
        nop

divide: mov     %l0,    %o0 ! 4로 나누어지는 경우에서 그거 100으로 나눠지면 평년, 아니면 윤년
        mov     100,    %o1
        call .rem
        nop
        cmp     %o0,    0
        bne     yoon        ! 100으로 나눠지지지 않으면 윤년
        nop

        set     fmt3,   %o0 ! 100으로 나눠지면 밑의 평년입니다, 실행과 년도 프린트
        call    printf
        mov     %l0,    %o1
        ba      loop
        nop
Exit:   ret
        restore
728x90
LIST