여기는 저의 2004~2007년까지의 기록입니다. 이 블로그는 이제 Tistory로 옮겼습니다.
2008년부터의 기록은 http://blog.studioego.info 로 가시기 바랍니다.

StudioEgo's Thoughts, seasonⅡ


SPARC Assembly HW#2 Use Stack Memory
이번에 어셈블리 언어시간에서 배우는 SPARC Assembly Language 과제가 나왔습니다 OTL

학과장님께서 숙제를 내주시면서 쉽긴 해도 하는데에 너무나 짜증이 날 것이라고 합니다. -_-;;
시험기간중에 숙제를 내주는 학과장님의 극강의 센스(그래보았자 변모 교수님보다 심하진 않습니다 캬캬캬 - 나 완전 돌았군-_-;;)

과제는 이것입니다.
과제2 : 스택 메모리 사용 hw2.pdf

입력
  • 최대 10개까지만 입력된다고 가정한다. 11번째 데이터가 입력되면 무시하고 앞의 10개의 데이터를 사용하여 계산에 들어간다.
  • 한 줄에 숫자 하나씩 입력한다.
  • 10개가 입력되기 전에 입력과정을 마치려면, control-d를 누른다.

출력
  • 입력된 수가 없으면, 전부 0을 출력하면 된다.
  • 다음은 입력을 3, 1, 5, -1 순서로 받았을 때 출력이다. "%"는 시스템의 프롬프트이다.

% 3
% 1
% 5
% -1
% ^d
N = 4
sum = 8
mean = 2
레지스터 매핑
  • Number of inputs : %l0
  • Sum : %i0
  • mean : %o3

과제는 보듯이 C언어로 짜라면 아주 쉽습니다. 다만 Contril-D처리가 좀 그렇지만 -_-;;

C언어로 짜라면 대충 이렇게 짭니다.
#include <stdio.h>
main()
{
int stack[10];
int i = 0, sum = 0, mean = 0, var = 0;
while(i < 10)
{
i++;
scanf("%d", &stack[i]);
var = stack[i];
sum = sum + var;
mean = sum / i;
}
printf("N = %d \nsum = %d \nmean = %d\n", i, sum, mean);
}


그리고나서 꼼수를 쓸려고 했습니다. 앞의 포스팅이 있던 것 처럼 역어셈블 과정을 거쳐서 프로그램 소스를 약간 고칠려고 했습니다.
C언어 코드를 SPARC Assembly Language 로 역 어셈블
gcc -S stack.c

그리고 나서 ls 명령어로 stack.s 이 있는지 확인해 봅니다. :D
확인이 되면 stack.s파일을 확인해 봅시다~~~

OTL



이럴수가... 역시 Assembly Language는 직접 짜야합니까? ㅠ_ㅠ

이런 괴상망측한 코드가 나왔습니다. 이렇게 숙제 내다간 학과장님에게 F 맞기 쉽상에 찍히기 까지 합니다. ㅠ_ㅠ
.file "stack.c"
.global .div
.section ".rodata"
.align 8
.LLC0:
.asciz "%d"
.align 8
.LLC1:
.asciz "N = %d \nsum = %d \nmean = %d\n"
.section ".text"
.align 4
.global main
.type main, #function
.proc 04
main:
!#PROLOGUE# 0
save %sp, -168, %sp
!#PROLOGUE# 1
st %g0, [%fp-60]
st %g0, [%fp-64]
st %g0, [%fp-68]
st %g0, [%fp-72]
.LL2:
ld [%fp-60], %g1
cmp %g1, 9
ble .LL4
nop
b .LL3
nop
.LL4:
ld [%fp-60], %g1
add %g1, 1, %g1
st %g1, [%fp-60]
add %fp, -56, %o5
ld [%fp-60], %g1
sll %g1, 2, %g1
add %o5, %g1, %o5
sethi %hi(.LLC0), %g1
or %g1, %lo(.LLC0), %o0
mov %o5, %o1
call scanf, 0
nop
ld [%fp-60], %g1
sll %g1, 2, %o5
add %fp, -16, %g1
add %o5, %g1, %g1
ld [%g1-40], %g1
st %g1, [%fp-72]
ld [%fp-64], %o5
ld [%fp-72], %g1
add %o5, %g1, %g1
st %g1, [%fp-64]
ld [%fp-64], %o0
ld [%fp-60], %o1
call .div, 0
nop
mov %o0, %g1
st %g1, [%fp-68]
b .LL2
nop
.LL3:
sethi %hi(.LLC1), %g1
or %g1, %lo(.LLC1), %o0
ld [%fp-60], %o1
ld [%fp-64], %o2
ld [%fp-68], %o3
call printf, 0
nop
mov %g1, %i0
ret
restore
.size main, .-main
.ident "GCC: (GNU) 3.3.2"



오늘의 교훈
숙제 할땐 꼼수 써서 하기 보다 직접 손으로 하자!
by Ego君 | 2006/10/16 18:08 | 컴퓨터 | 트랙백(1) | 덧글(5)
트랙백 주소 : http://sungdh86.egloos.com/tb/2759641
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Ego君의 인터넷 놀이터 at 2006/10/29 05:36

제목 : Assembly 과제 완료
SPARC Assembly HW#2 Use Stack Memory 이 글은 예전에 썼던 Assembly Language 과제의 연속입니다. 중간고사를 꽤 잘보고 나서 숙제 마감일을 살피니.. 얼마 안남았군요 orz 얼른 숙제를 하겠다고 10월 28일 토요일날 전자회로 수업을 마치고 나서 도서관으로 직행했습니다. 예상치도 못한 과제들의 홍수들 ㅠ_ㅠ 중간고사 끝나니까 홍수처럼 쏟아지더군요 자 우선 순위 큐를 따져 보니.........more

Commented by 시라카와 at 2006/10/16 18:12
손으로 합시다 (웃음) 저희집에는 리눅스가 안깔려있습니다.
라기보단 리눅스를 모릅니다 OTL
Commented by daybreaker at 2006/10/16 18:48
....
그나마 오늘 교수님께 사정사정해서 시험 기간 중에 듀가 걸리는 걸 막았습니다.
시험 끝나자마자 프로젝트 뺑뺑이 돌게 생겼네요. ㅠ_ㅠ
Commented by 정태영 at 2006/10/16 23:19
ctrl-d 는 scanf 의 리턴값이 -1 인지 아닌지를 체크하면 간단하게 해결 가능합니다.
Commented by Tir티르 at 2006/10/19 21:23
ㅎㅎㅎ 학기가 넘어갈 수록 카피앤 페이스트 기술이 늘어나지요 (응?)
Commented by 오태진 at 2006/10/31 02:51
헛 성대현 이런것도 하는구나-_-

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >