الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في تنفيذ الكود التالي

بدأه CNE في 3 فبراير 2010 · 0 رد · 814 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1

لدي الكود التالي واريد ان اعرف كم عملية تنفذت في كل 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 بشكل صحيح. او ربما المشكلة في دالة الطباعة فهل من موجه يشردني الي الطريق الصحيح؟

مواضيع مشابهة