컴공 일기205
게시글 주소: https://dev.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)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.

누나 멋져요
이분남자임ㅋㅋ
아?

어머 감사해요 (덜렁)ㅎㅎ 농담이에요! 칭찬해주셔서 감사드립니다 (__)

굉장히 수준높은 내용이네요예... 수준이 높다기 보다는 '고전적'이라서 지금은 공부해야 할 필요가 전연 없는 그런 컨셉이기도 하지요. 누가 요새 SPARC을 쓴다고... ㅋㅋ
기계어로 코딩을 하는 것도 굉장히 좋은 경험이라고 생각합니다. 다만... 지금 쓰고 있는 언어는 너무 낡은 감각도 없지 않아서, 다른 언어로 교수님들도 빨리 바꾸고 싶다고 하는 상황입니다.
실전을 위한 이론은 사실 굉장히 중요하겠지만, 이론을 위한 이론은 말 그대로, '이론(異論)'일 뿐입니다.