C코드를 어셈블리로 보았는데 어떻게 돌아가는지 주석 좀 달아주세요.
어떻게 돌아가는건지 도통 모르겠네요...
selection sort 인데요...
정렬이 어떻게 되어 가는건지, gcc로 돌리고 .S파일을 보니 이렇게 나오는데 자세한 설명 부탁드립니다.
혹시 페도라에서 정렬할 수 있는 소스 코드도 여기 있나요?
인터넷에서 찾아가며 코딩을 해 보았는데 오류가 너무 많이 나네요.
고수님들의 조언 부탁드립니다.
.file "select_sort.c"
.section .rodata
.align 32
.type C.0.1585, @object
.size C.0.1585, 128
C.0.1585:
.long 2
.long 0
.long -7
.long -1
.long 3
.long 8
.long -4
.long 10
.long -9
.long -16
.long 15
.long 13
.long 1
.long 4
.long -3
.long 14
.long -8
.long -10
.long -15
.long 6
.long -13
.long -5
.long 9
.long 12
.long -11
.long -14
.long -6
.long 11
.long 5
.long 7
.long -2
.long -12
.LC0:
.string "*** selection sort ***"
.LC1:
.string "input_data : "
.LC2:
.string "%d "
.LC3:
.string "\noutput_data : "
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ecx
subl $172, %esp
leal -152(%ebp), %eax
movl %eax, -164(%ebp)
movl $C.0.1585, -168(%ebp)
movl $32, -172(%ebp)
movl -164(%ebp), %edi
movl -168(%ebp), %esi
movl -172(%ebp), %ecx
rep movsl
movl $.LC0, (%esp)
call puts
movl $.LC1, (%esp)
call printf
movl $0, -24(%ebp)
jmp .L2
.L3:
movl -24(%ebp), %eax
movl -152(%ebp,%eax,4), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
addl $1, -24(%ebp)
.L2:
cmpl $31, -24(%ebp)
jle .L3
movl $0, -24(%ebp)
jmp .L4
.L8:
movl -24(%ebp), %eax
addl $1, %eax
movl %eax, -20(%ebp)
jmp .L5
.L7:
movl -24(%ebp), %eax
movl -152(%ebp,%eax,4), %edx
movl -20(%ebp), %eax
movl -152(%ebp,%eax,4), %eax
cmpl %eax, %edx
jle .L6
movl -24(%ebp), %eax
movl -152(%ebp,%eax,4), %eax
movl %eax, -16(%ebp)
movl -24(%ebp), %edx
movl -20(%ebp), %eax
movl -152(%ebp,%eax,4), %eax
movl %eax, -152(%ebp,%edx,4)
movl -20(%ebp), %edx
movl -16(%ebp), %eax
movl %eax, -152(%ebp,%edx,4)
.L6:
addl $1, -20(%ebp)
.L5:
cmpl $31, -20(%ebp)
jle .L7
addl $1, -24(%ebp)
.L4:
cmpl $30, -24(%ebp)
jle .L8
movl $.LC3, (%esp)
call printf
movl $0, -24(%ebp)
jmp .L9
.L10:
movl -24(%ebp), %eax
movl -152(%ebp,%eax,4), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
addl $1, -24(%ebp)
.L9:
cmpl $31, -24(%ebp)
jle .L10
movl $10, (%esp)
call putchar
addl $172, %esp
popl %ecx
popl %esi
popl %edi
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.3.0 20080428 (Red Hat 4.3.0-8)"
.section .note.GNU-stack,"",@progbits
objdump -S
"objdump -S"
코더에서 프로그래머까지
코더에서 프로그래머까지
추가로 gcc
추가로 gcc 컴파일할때 -g 옵션넣은다음 컴파일후 위명령을 치세요.
예제
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기