✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2022-12-01 01:39:58
조회수 1,102

컴공 일기205

게시글 주소: https://orbi.kr/00059933475



어셈블리어 과제 해결. 약 9시간 걸리지 않았나 한다. 컴파일러가 알아서 처리하던 흐름과 분기를 직접적으로 따져가면서 코드를 짰기 때문에. 그 과정에서 말도 안 되는 실수도 범했고, 빙빙 돌아간 감각도 없지 않아 있지만, 무엇보다 재미있었다. 9시간 동안 공을 들여서, 성과와 성취를 만들어 낸다는 것. 내가 코딩과 컴공, 그리고 공학을 사랑하는 가장 원초적인 이유일 게다. 


1. 100이하의 자연수 내, 12개의 난수(RandomNumber) 생성.

2. 3 by 4 Matrix에 해당 난수값 저장.

3. 이중반복문을 토대로, 12개의 값들 중 최댓값 특정. 

4. 최댓값을 printf 함수로 출력.


걸핏보면, 상당히 간단한 과정이다. C언어로 짜봐도, 파이썬으로 짜봐도.. 길어봐야 50라인을 넘기지 못하겠지.

그런데, 이 4가지의 절차를 어셈블리어로 표기한다면 시간이 생각보다 많이 걸린다. 교수께서 subroutine을 요구하셨기 때문에 매개변수에 대한 부분, 함수 호출 부분, 그리고 분기 제어 부분이 문제가 된다는 것이다. 


이 모든 것은 원래 "컴파일러가 알아서 잘 처리"해주지만, 어셈블리는 그런 것 없다. 그냥 맨땅에, 내 손으로 하드웨어에 명령하는 수밖에 없는 것이다. 


           num_s = -48


           .text

           .global main



main:   save %sp, -152, %sp

          ba outer_test

          mov 0, %l0



inner:


        

          call rand

          nop

          mov %o0, %l2


          mov  %l2, %o0

          mov 100, %o1

          call .urem

          nop

          mov %o0, %l2


 

          sll %l0, 2, %o0

          add %o0, %l1, %o0

          sll %o0, 2, %o0

          add %fp, %o0, %o0



          st %l2, [%o0 + num_s]



          ld [%o0 + num_s], %l3

          set str, %o0

          mov %l3, %o1

          call printf

          nop



inner_inc : add %l1, 1, %l1



inner_test :

           

             cmp %l1, 4

             bl inner

             nop


outer_inc :

            

            add %l0, 1, %l0


outer_test :

           

            cmp %l0, 3

            bl,a inner_test

            mov 0, %l1

            nop


             

            add %fp, num_s, %o0

            call max

            nop

            mov %o0, %o1


            set str2, %o0

            call printf

            nop

 max :

            save %sp, -152, %sp

            mov 12, %l2

            ld [%i0], %l1 ! min : %l1 초기화

            ba fortest

            mov 1, %l0


for :

            sll %l0, 2, %o0

            add %i0, %o0, %o0

            ld [%o0], %o0

            cmp %o0, %l1

            ble keep

            nop

            mov %o0, %l1


keep:     add %l0, 1, %l0



fortest:

            

            cmp %l0, %l2


            bl for

            nop

            mov %l1, %i0

            ret

            restore




 .data

 str: .asciz "value = %d\n"

 str2: .asciz "maximum = %d\n"



 .align 8






           



0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.