어셈블리 언어 시간에 숙제가 나갔다 -_-;;
(숙제는 만인의 적 -_-+)
숙제를 받아가선 "와 이거 쉽겠네!!!" C언어라면 for문 돌리면 끝인데 ㅎㅎ
어떤 숙제나면
10!까지의 값을 출력하는 프로그램을 작성하라는 것이었다.
그러나 C언어라면 10줄만에 끝날 것을..... SUN사의 SPARC Machine에서 Assenbly Language로 짜란다.
보통 어셈블리 언어 배운다면 대부분 CISC방식의 IBM 8051 chip으로 공부할 것인데 쩝. (실제로 이 것을 많이 쓴다고 들었다.)
울 학과만 RISC방식의 SUN SPARC Machine를 배운다고 한다나 뭐나.
(이번학기때 어셈블리 학점 잘나오면 다음 학기때 전자전기공학부의 마이크로컴퓨터를 배우겠다 -_-;;)
C언어에서는 10!까지 출력하는 프로그램을 이렇게 짠다.
#include
main() {
int i = 0, temp = 1;
while (i <= 10) {
printf("%d! = %d
",i++, temp);
temp *= i;
}
}
대충 짰으므로, 요즘의 C언어의 표준에 안맞다던가 아님 코드 보는게 불편하다고 투덜거리지 마시길......
10!까지 출력하는 프로그램, C언어에서는 얼마나 간단하게 짜는가! 8줄씩이나 썼다. 여기서 6줄까지 줄일수 있다 (해보실분 해보시길 ^_^
C언어에서 코딩을 한후 Assembly Language code로 바꿔야지 하면서
gcc -S loop.c
쳤더니 loop.s라는 파일이 생성되었다.
자자자 실행이 되나 확인을 하기 위해서
gcc loop.s -o hw1
를 쳤다.
확인을 위해서
cat loop.s
를 쳤더니
아니 이런
괴상망측한 코드가 ㅠ_ㅠ
.file "loop.c"
.global .umul
.section ".rodata"
.align 8
.LLC0:
.asciz "%d! = %d
"
.section ".text"
.align 4
.global main
.type main, #function
.proc 04
main:
!#PROLOGUE# 0
save %sp, -120, %sp
!#PROLOGUE# 1
st %g0, [%fp-20]
mov 1, %g1
st %g1, [%fp-24]
.LL2:
ld [%fp-20], %g1
cmp %g1, 10
ble .LL4
nop
b .LL3
nop
.LL4:
add %fp, -20, %o5
ld [%o5], %g1
mov %g1, %o4
add %g1, 1, %g1
st %g1, [%o5]
sethi %hi(.LLC0), %g1
or %g1, %lo(.LLC0), %o0
mov %o4, %o1
ld [%fp-24], %o2
call printf, 0
nop
ld [%fp-24], %o0
ld [%fp-20], %o1
call .umul, 0
nop
mov %o0, %g1
st %g1, [%fp-24]
b .LL2
nop
.LL3:
mov %g1, %i0
ret
restore
.size main, .-main
.ident "GCC: (GNU) 3.3.2"
엄청난 nop의 압ㅤㅂㅞㄺ에다 이해할수 없는 명령어가 -_-;;
그래서 전 이 시간 이후로 어셈블리 코드를 직접 짜볼렵니다.
gcc로 Assembly Language코드로 변환해서 조금만 고쳐서 내야지 하는 제 생각은 산산히 무너졌습니다 OTL
이글루스 가든 - 무적의 공대생이 되자!