이번에 어셈블리 언어시간에서 배우는 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"
오늘의 교훈숙제 할땐 꼼수 써서 하기 보다 직접 손으로 하자!