لدي الكود التالي واريد ان اعرف كم عملية تنفذت في كل block. طبعا قسمت الكود الي blocks بحيث نهاية كل block هيا دالة jmp.
كل مانفذت البرنامج يعطيني الرسالة التالية
too many memory references for `add'
.file "prog.c"
.text
.comm insn_count,4,4
.count_string:
.string "%d instructions executed\n"
.globl bubble_sort
.type bubble_sort, @function
# basic block #1
bubble_sort:
addl $8,insn_count
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $16, %esp
movl $0, -8(%ebp)
.L2:
movl -8(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L1
# basic block #2
addl $5,insn_count
movl $0, -20(%ebp)
movl $1, -12(%ebp)
.L5:
movl -12(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L6
# basic block #3
addl $16,insn_count
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
addl %edx, %eax
addl 8(%ebp), %eax
leal -4(%eax), %ebx
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
leal (%eax,%edx), %ecx
movl 8(%ebp), %edx
movl (%ebx), %eax
cmpl (%ecx,%edx), %eax
jle .L7
# basic block #4
addl $36,insn_count
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
leal (%eax,%edx), %edx
movl 8(%ebp), %eax
movl (%edx,%eax), %eax
movl %eax, -16(%ebp)
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
leal (%eax,%edx), %ecx
movl 8(%ebp), %ebx
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
addl %edx, %eax
addl 8(%ebp), %eax
subl $4, %eax
movl (%eax), %eax
movl %eax, (%ecx,%ebx)
movl -12(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
addl %edx, %eax
addl 8(%ebp), %eax
leal -4(%eax), %edx
movl -16(%ebp), %eax
movl %eax, (%edx)
movl $1, -20(%ebp)
.L7:
leal -12(%ebp), %eax
addl $1, (%eax)
jmp .L5
.L6:
# basic block #5
addl $2,insn_count
cmpl $0, -20(%ebp)
jne .L4
# basic block #6
addl $1,insn_count
jmp .L1
.L4:
# basic block #7
addl $3,insn_count
leal -8(%ebp), %eax
addl $1, (%eax)
jmp .L2
.L1:
# basic block #8
addl $4,insn_count
addl $16, %esp
popl %ebx
popl %ebp
ret
.size bubble_sort, .-bubble_sort
.globl check_sorted
.type check_sorted, @function
check_sorted:
# basic block #9
addl $8,insn_count
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $8, %esp
movl $1, -8(%ebp)
.L11:
movl -8(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L12
# basic block #10
addl $16,insn_count
movl -8(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
addl %edx, %eax
addl 8(%ebp), %eax
leal -4(%eax), %ebx
movl -8(%ebp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
leal (%eax,%edx), %ecx
movl 8(%ebp), %edx
movl (%ebx), %eax
cmpl (%ecx,%edx), %eax
jle .L13
# basic block #11
addl $2,insn_count
movl $0, -12(%ebp)
jmp .L10
.L13:
# basic block #12
addl $3,insn_count
leal -8(%ebp), %eax
addl $1, (%eax)
jmp .L11
.L12:
# basic block #13
addl $6,insn_count
movl $1, -12(%ebp)
.L10:
movl -12(%ebp), %eax
addl $8, %esp
popl %ebx
popl %ebp
ret
.size check_sorted, .-check_sorted
.section .rodata
.LC0:
.string "numbers are sorted\n"
.LC1:
.string "numbers are not sorted\n"
.text
.globl main
.type main, @function
main:
# basic block #14
addl $14,insn_count
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $0, -8(%ebp)
.L16:
cmpl $9999, -8(%ebp)
jg .L17
# basic block #15
addl $6,insn_count
movl -8(%ebp), %ebx
call rand
movl %eax, numbers(,%ebx,4)
leal -8(%ebp), %eax
addl $1, (%eax)
jmp .L16
.L17:
# basic block #16
addl $8,insn_count
movl $10000, 4(%esp)
movl $numbers, (%esp)
call bubble_sort
movl $10000, 4(%esp)
movl $numbers, (%esp)
call check_sorted
testl %eax, %eax
je .L19
# basic block #17
addl $3,insn_count
movl $.LC0, (%esp)
call printf
jmp .L20
.L19:
# basic block #18
addl $3,insn_count
movl $.LC1, (%esp)
call printf
.L20:
movl $0, (%esp)
# code to print out the instruction count
pushl %eax
pushl $.count_string
movl x,%eax
movl x+4,%edx
addl 5,insn_count
adcl $0,insn_count+4
movl insn_count,%eax
call printf
call exit
.size main, .-main
.comm numbers,40000,32
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6 (Ubuntu 3.4.6-1ubuntu2)"للتوضيح : يوجد في الكود ١٨ blocks في بداية كل block يوجد التعليمة التالية :
addl $3,insn_count
الرقم ثلاثة يعني في هذا البلوك ثلاثة تعليمات وفي كل بلوك يختلف الرقم كما هوه موضح في الكود.
اعتقد المشكلة انني لم استخدم الدالة adcl بشكل صحيح. او ربما المشكلة في دالة الطباعة فهل من موجه يشردني الي الطريق الصحيح؟