SPARC Assembly HW#2 Use Stack Memory

이 글은 예전에 썼던 Assembly Language 과제의 연속입니다.
중간고사를 꽤 잘보고 나서 숙제 마감일을 살피니.. 얼마 안남았군요 orz
얼른 숙제를 하겠다고 10월 28일 토요일날 전자회로 수업을 마치고 나서 도서관으로 직행했습니다.

예상치도 못한 과제들의 홍수들 ㅠ_ㅠ 중간고사 끝나니까 홍수처럼 쏟아지더군요

자 우선 순위 큐를 따져 보니...... SPARC Machine에서 쓰는 Assembly 밤에 하게 되었습니다.

밤 11시 경 손을 대기 시작하였습니다. 예전에 쓴 소스코드를 가지고 그대로 접근하면 되기 때문에 어려움 없이 갈려고 했습니다.

손으로 코딩을 하고 나서 컴퓨터로 옮기는데 생각보다 시간이 많이 걸렸네요. m4 processor로 macro 치환을 하고 나서 코딩까진 괜찮았습니다.
코딩을 하니까 주석을 안달아서 자꾸 헷갈리덥니다. 역시 주석(Comment)은 만인의 행복을 위한 것이였습니다.
코딩을 다 하고 나서 주석 달려니 어마어마한 양에 하기가 싫어지더군요.
그래도 했습니다. 주석을 다 달고 나니 뿌듯했습니다.

그러나


제가 짠 Assembly Code가 최적화가 되어있지 않기때문에 최적화를 시켜줘야 하는 것이였습니다.
숙제를 내고 바로 잘려던 저에게 큰 타격을 주었습니다 ㅠ_ㅠ
nop을 없애고자 많은 노력을 기울였지만.. nop 명령어 지우는 것이 만만치 않더군요.
어떤 것은 annulled branch를 써서 아님 단순히 nop연산 전 명령어를 치환하여 없애거나 등등
그래도 끝까지 nop으로 남는 것은 딱 한개 -_-;;

nop을 완전히 없애면 점수 100점 받는것인디 (그래도 1개만 남겨도 100점 맞을듯)
주석도 만땅으로 채우고 했으니 과제를 냈습니다. 아 다행이군요.
숙제를 안봤다면 주말동안 놀다가 평일에 숙제 하다가 GG치는 사태는 막았군요 :D

어셈블리 언어는 재미있다만은, 하룻만에 숙제가 되지가 않군요.(1학년때에는 C언어 숙제를 마감 3시간 전에 시작하여 제출 1시간 전에 제출한 사례가 엄청 많았는데 -_-;;)

아래 있는 글을은 최적화 사례입니다. (숙제 한 것에서 빼왔습니다 - 어셈블리 숙제 베낄라 걱정되군요)
Anulled Branch 사용의 예
프로그램 최적화전
! loop lable (i < 10)까지 loop를 돌림
loop:
sll %i_r, 2, %l1 ! %i_r(%l0) * 4 = %l1 4의 배수로 i변수 곱해줌, Array 연산용
! Call scanf function, Array에 숫자 입력
set input, %o0
call scanf
sub %fp, %l1, %o1
! control-d누르면 scanf function의 return값이 -1이 됨
! return value가 -1이면 loop lable을 빠져 나가 cal lable로 빠져나가 연산을 하게 함
cmp %o0, -1
be cal
nop
add %i_r, 1, %i_r ! i++
! Compare %input_num & 10, 만약 10보다 작으면 loop문을 돌게 함
cmp %i_r, 10
bl loop
nop

Anulled Branch사용으로 프로그램 최적화
! loop lable (i < 10)까지 loop를 돌림
loop:
! Call scanf function, Array에 숫자 입력
set input, %o0
call scanf
sub %fp, %l1, %o1
! control-d누르면 scanf function의 return값이 -1이 됨
! return value가 -1이면 loop lable을 빠져 나가 cal lable로 빠져나가 연산을 하게 함
cmp %o0, -1
be cal
nop
add %i_r, 1, %i_r ! i++
! Compare %input_num & 10, 만약 10보다 작으면 loop문을 돌게 함
cmp %i_r, 10
bl,a loop ! annulled branch
sll %i_r, 2, %l1 ! %i_r(%l0) * 4 = %l1 4의 배수로 i변수 곱해줌, Array 연산용

단순히 nop을 제거하여 최적화
단순히 nop제거 전
! Sum Calculate lable (합계를 계산)
cal:
mov %j_r, %o0
mov 4, %o1
call .mul ! %l2 * 4 = %l1 4의 배수로 j변수 곱해줌, Array 연산용
nop
sub %fp, %o0, %l3 ! Array위치 계산후
ld [%l3], %var_r ! load Array [%fp + %l2*4], %var_r(%i0), temp변수
add %sum_r, %var_r, %sum_r ! %sum_r = %sum_r + temp
add %j_r, 1, %j_r ! j++
!compare %i_r & %j_r (%l0 vs %l2), 만약 %j_r이 %i_r보다 작으면 cal loop문을 돌게 함
cmp %j_r, %i_r
bl cal
nop

nop제거 후
! Sum Calculate lable (합계를 계산)
cal:
mov %j_r, %o0
call .mul ! %l2 * 4 = %l1 4의 배수로 j변수 곱해줌, Array 연산용
mov 4, %o1
sub %fp, %o0, %l3 ! Array위치 계산후
ld [%l3], %var_r ! load Array [%fp + %l2*4], %var_num(%i0), temp변수
add %j_r, 1, %j_r ! j++
!compare %i_r & %j_r (%l0 vs %l2), 만약 %j_r이 %i_r보다 작으면 cal loop문을 돌게 함
cmp %j_r, %i_r
bl cal
add %sum_r, %var_r, %sum_r ! %i1 = %i1 + temp


숙제를 베끼는 것을 방지 하기 위해 m4 processor로 돌리기 전 코드를 올렸습니다. 개념적으로 SPARC Assembly가 어떻게 돌아가는지 쓴 것입니다 :D

간단한 과제하는데 몇시간이나 걸린건가?-_-;;
Buy me a coffeeBuy me a coffee

+ Recent posts