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

StudioEgo's Thoughts, seasonⅡ


SPARC Assembly programming 하다가
어셈블리 언어 시간에 숙제가 나갔다 -_-;;
(숙제는 만인의 적 -_-+)

숙제를 받아가선 "와 이거 쉽겠네!!!" 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

이글루스 가든 - 무적의 공대생이 되자!
by Ego君 | 2006/09/26 21:20 | 컴퓨터 | 트랙백(1) | 덧글(6)
트랙백 주소 : http://sungdh86.egloos.com/tb/2720860
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Ego君의 인터넷 놀이.. at 2006/10/03 17:10

제목 : 과제 끝 그러나.OTL...
via Ego君의 인터넷놀이터 SPARC Assembly programming 하다가 이번에 Asssembly과제를 2시간 만에 다하였다. 예전에 썼던 글 처럼 단순히 0!부터 10!까지 보여주는 C언어 코드 #include &lt;stdio.h&gt; m......more

Commented by 정태영 at 2006/09/26 22:26
8051 이 cisc 라고 해도 8bit 에다가 용도도 조금 다르다보니 sparc 에 비해 편하진 않을겁니다 -_-;;;

8051 에선 10! 정도는 아래 정도면 되겠네요. (r0,1,2,3 는 레지스터)
mov r0 10
mov r1 1

loop:
mov a r1
mov b r0
mul ab
mov r1 a
dec r0
jnz r0 loop

결과는 r1 에 =3=33
Commented by 설화가람 at 2006/09/27 19:51
....이해가 안가는 것뿐....!!
이 참에 배우자[중얼]
Commented by 피쉬 at 2006/09/27 20:25
무슨 코드길래 저래요?-_-;;
Commented by Ego君 at 2006/09/28 04:52
정태영 // 내년에 마이크로컴퓨터를 들어볼랍니다.(컴파일러랩실에서 연구중인 학부 장학생 선배의 영향으로 -_-;;)
설화가람 // 대학교에서 어셈블리 언어가 커리큘럼에 잇는 학교로 오세요(저희학교 컴공과는 특이하게도 SUN SPARC Machine를 쓴고 전자전기공학부는 IBM 8051Chip를 씁니다.
피쉬 // 기계어에서 조금 업그레이드 된 어셈블리란 언어입니다. Low Level Language라 하죠. 기계어에서 010101011111 인간이 조금 알아볼수 있게 add, mov같은 명령어 쓰죠. 그래도 인간에겐 어려운 언어 ㄱ-
Commented by 클랴 at 2006/09/29 13:10
역어셈블하면 printf 라이브러리는 어떻게하려구?
Commented by daybreaker at 2006/10/06 23:20
...nop이 많은 이유는 32bit로 최적화하기 위해서 명령어 크기를 맞춘다든가 하는 게 아닐까 짐작은 해봅니다만 역시나 짐작일 뿐..;

:         :

:

비공개 덧글

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