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

2022-11-30 16:30:38
조회수 1,122

컴공 일기204

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

개발 공부를 하다보면, 가끔 이런 생각을 하게 될 때가 있습니다. '아, 평소에 내가 말이라는 것을 너무 쉽게 한 것 아닌가?' 라는 것 말입니다. 컴퓨터에게 내가 생각하는 논리를 명령하기 위해서는, 굉장히 치밀하게 한 줄 한 줄의 의미를 밝혀써주어야 합니다. 그렇지 않고서는, 절대로 내가 하고 싶은 말을 컴퓨터에게 들려줄 수가 없으니까요. 바로 에러를 띄워버리고 맙니다. '네가 하는 얘기가 도대체 뭔 소리냐?'라고 하면서요.


다음 예제는 컴퓨터에 직접적인 명령을 내리는 Assembly Language로, 발생된 난수 중 최솟값 구하는 프로그램을 짜본 것입니다. 파이썬이나, JAVA같이 상위레벨의 언어로 짰다면 50Line 내외로 컷 가능한, 그리고 전공자/비전공자에게 모두 익숙한 예제지요. 하지만, 이것을 Low-Level 그러니까 하드웨어와 직결된 어셈블리어로 짠다면 얘기가 달라집니다. 이제까지, 컴파일러가 하던 것을, 내가 직접 다 작성해주어야 하니까요. 반환은 어떻게 할 것이며, 스택은 어디까지 늘릴 것인지, 메모리는 어디까지 관리할 것인지, 어떤 레지스터에 어떤 변수를 집어넣을 것인지... 그런 전체적인 구조를 모르면 접근하기가 굉장히 까다로워 집니다. 더군다나, 시간도 더 많이 걸리구요. 50Line이면 될 것을, 얘는 150Line 정도를 잡아먹고 있습니다. 


그래서인지 개발자들이 기계어로 코딩을 하는 경우는 거의 없습니다. 몇몇 분야를 제외하고는요. 다만, 이런 어셈블리는 사실 실무 능력보다는, 여러가지 고급 이론의 기초와 기반을 다지는 데 도움이 됩니다. 어셈블리로 레지스터 하나하나 찝어가면서 코딩을 해보면, C언어의 포인터 문법이 왜 그렇게 밖에 나올 수 없는지 자연스레 깨닫게 됩니다. 함수 호출 스택, 함수 프롤로그/에필로그 코드, 스택 프레임과 프레임 포인터에 대한 자연스러운 이해는 말할 것도 없구요. 일종의 컴퓨터 구조적인 이론을 굉장히 디테일하게 요구하는 언어이기 때문에, 구조를 익히는 과정에선 상당히 많은 도움이 된다는 것이지요. 




 



         num_s = -48


        .text

        .global main



main:   save %sp, -152, %sp

          ba outer_test

          mov 0, %l0



inner: 

          call rand

          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 min

            nop

            mov %o0, %o1

            set str, %o0

            call printf

            nop

            ret

            restore


 min :

            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

            bge 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"

 .align 4













0 XDK (+0)

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