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

برنامج يحتاج الى حل

مغلق
بدأه جودانه في 25 يناير 2007 · 11 رد · 1,471 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

انا عندي مشكله في برنامج اتمنى احد يساعدني فيها

البرنامج المطلوب هو اني اعمل code binary search ونستخدم فيه ال boble sort

انا عندي هذا البرنامج فيه اخطاء اتمنى احد يساعدني في اكتشافه وحلها

main:
			 la $a0,v
			  lw $a1,n1
			  lw $a2,n2
			  jal bsearch
			ori $2,$0,10
bsearch:
		   addi $sp,$sp,-28
		   sw $ra,2u($sp)
		   sw $s0,20($sp)
		   sw $s1,16($sp)
		  sw $s2,12,($sp)
		 sw $s3,8($sp)
		sw $s4,4($sp)
	   sw $s5,0($sp)
move $s3,$a0
move $s4,$a1
move $s5,$a2

addi $s0,$zero,1
move $a0,$s3
addi $a1,$zero,10
 jal  sort

move $s,1,$s4
slt $t0,$s1,$s0
bne $t0,$zero,exit
move $a0,$s0
move $a1,$s1
jal  mid

sll $t0,$n0,2
add $t0,$t0,$s3
lw $t1,0($t0)
slt $t0,$s5,$t1
beq $t0,$zero,else
addi $s1,$v0,-1
j L

else addi $s0,$v0,1
L: add $v1,$s3,$v0
exit:

mid:
  add $t0,$a0,$a1
srl $v0,$t0,1
jr $ra

add $v1,$zero,0xffffffff

lw $s5,0($sp)
lw $s4,4($sp)
lw $s3,8($sp)
lw $s2,12($sp)
lw $s1,16($sp)
lw $s0,20($sp)
lw $ra,24($sp)

addi $sp,$sp,28
		jr $ra

واذاكان احد يقدر يساعدني بحل افضل

ياليت مايبخل عليا

#2

هذا الكود مكتوب ب C++

int mid(int x,int y)
{
return(x+y)/2;
}

int*bsearch(int*v,int n,int key)
{
int left=1,right;
intx;
sort(v,10);
right=n;
while(right>=left)
{
x=mid(left,right);
if(key<v[x])
right=x-1;
else
left=x+1;
if(key==v[x])
return v+x;

return (int*)-1;
}
int main(void)
{
int v[10]={-2,0,5,7,9,12,17,25,40,128);
bsearch(v,10,12);
}
#3

هل من مجيب :unsure:

#4

انا توصلت لحل ما اعرف صح اولا

main:
			 lw $a0,v
			  lw $a1,n1
			  lw $a2,n2
			  jal bsearch
			ori $2,$0,10

bsearch:
		   addi $sp,$sp,-28
		   sw $ra,24($sp)
		   sw $s0,20($sp)
		   sw $s1,16($sp)
		  sw $s2,12,($sp)
		 sw $s3,8($sp)
		sw $s4,4($sp)
	   sw $s5,0($sp)
move $s3,$a0
move $s4,$a1
move $s5,$a2

addi $s0,$zero,1
move $a0,$s3
addi $a1,$zero,10
 jal  sort

move $s,$s4
slt $t0,$s1,$s0
bne $t0,$zero,exit
move $a0,$s0
move $a1,$s1
jal  mid

sll $t0,$n0,2
add $t0,$t0,$s3
lw $t1,0($t0)
slt $t0,$s5,$t1
beq $t0,$zero,else
addi $s1,$v0,-1
j L

else :
 addi $s0,$v0,1
L:
bne $s5,$t1,exit
 add $v1,$s3,$v0
exit:
add $v1,$zero,0xffffffff

lw $s5,0($sp)
lw $s4,4($sp)
lw $s3,8($sp)
lw $s2,12($sp)
lw $s1,16($sp)
lw $s0,20($sp)
lw $ra,24($sp)

addi $sp,$sp,28
		jr $ra


mid:
  add $t0,$a0,$a1
srl $v0,$t0,1
jr $ra

sort :
addi $sp,$sp,-20
sw $ra,16($sp)
sw $s3,12($sp)
sw $s2,8($sp)
sw $s1,4($sp)
sw $s0,0($sp)

swap:
sll $t1,$a1,2
add $t1,$a0,$t1
lw $t0,0($t1)
lw $t2,4($t1)

sw $t2,0($t1)
sw $t0,4($t1)
jr $ra

.data
n1: .word 10
n2: .word 12
v: .word -2,0,5,7,9,12,17,25,40,128

واذا كان في طرق ثانيه ساعدوني فيها

لاني لما اعمل له run في ال spim يقلي انه main undifined

ارجوكم هذي المره ردوااااا :unsure:

#5

السلام عليكم.

ربما سوف لن يستطيع احد في قسم الاسمبلي ان يساعدك في حل مشكلتك اختي لان معظم اعظاء هذا القسم متخصصين في assembler 8086 , اما الكود الذي طرحته فيعد من نوع MIPS assembler :) .

ربما تجدين بعظ المساعدة لدى قسم الميكروكنترولر (المتحكم) و الدوائر الرقمية و المنطقية.

للمزيد من المعلومات اخواني :http://en.wikipedia.org/wiki/MIPS_architecture

#6

شكراا لك اخي على الرد وعلى المعلومه

وانا راح ابحث على الحل في مكان اخر

واااسفه على الازعاج

#7
jal  sort

move $s,$s4
slt $t0,$s1,$s0
bne $t0,$zero,exit
move $a0,$s0
move $a1,$s1
jal  mid

sll $t0,$n0,2
add $t0,$t0,$s3

عندك غلطين إملائيين في الكود السابق

move $s,$s4

sll $t0,$n0,2

لي رجعة إن شاء الله بعد ما أدرس برمجة الكود

تحياتي

تم تعديل هذه المشاركة بواسطة Eng_Gaza في 27 يناير 2007 في 22:48

ENG-GAZA.GIF
#8

بسم الله الرحمن الرحيم:

المطلوب هو binary search

وهنا يجب أن تكون الـ array مرتبة من الصغير للكبير .

وعندك الـ العناصر موجودين

v: .word -2,0,5,7,9,12,17,25,40,128

يعني معمول SORT وجاهز

فلماذا إستخدمتي في الكود Sort ???

أعتقد يجب مراجعة الكود من البداية

**************************

عندك محاولتك القادمة عليكي بالإنتباه للتالي :

أولا :

main:
			 lw $a0,v
			  lw $a1,n1
			  lw $a2,n2

في الـ MIPS Instrection يوجد li و la

يمكن إستعمالهم كالتالي:

main:
			 la $a0,v	   #	 Load Adress
			  li $a1,10	  # Load Imediate
			  li $a2,12		# Load Imediate

وبالتالي إستغني عن هذه الأسطر:

n1: .word 10
n2: .word 12

ثانيا:

sort :
addi $sp,$sp,-20
sw $ra,16($sp)
sw $s3,12($sp)
sw $s2,8($sp)
sw $s1,4($sp)
sw $s0,0($sp)

swap:
sll $t1,$a1,2
add $t1,$a0,$t1
lw $t0,0($t1)
lw $t2,4($t1)

sw $t2,0($t1)
sw $t0,4($t1)
jr $ra

خزنتي قيم الريجيسترات في الـ stack ولم تعيدي القيم لها قبل الجملة jr $ra

**************************

وضحيلي المطلوب من البرنامج وإن شاء الله راح أساعدك

تحياتي وبالتوفيق إن شاء الله

ENG-GAZA.GIF
#9

اشكرك جداا اخي على الرد .

وانا لم ارد لانه في قيل لي لن اجد اجابه في هذا القسم

يا اخي انا مبتدئه في هذه اللغه واخطائي كثيره وهذا اخر كود توصلت له

والمشكله يظهرلي في infinet loop

ولا اعلم ما لحل

اارجو المساعده خلال ايوم

main:
				la	 $a0,v 
				lw	$a1,n1
				lw	$a2,n2

				jal b_search

#---------------------------------------------------------------

			   ori	 $2,$0,10	  #system call:exit program

			   syscall

#---------------------------------------------------------------

b_search:

subi	$sp,$sp,28		 # make room on stack for 7 registers

sw  $s0,24($sp)		#save $s0 on stack
sw  $s1,20($sp)		#save $s1 on stack 
sw  $s2,16($sp)		#save $s2 on stack
sw  $s3,12($sp)		 #save $s3 on stack
sw  $s4,8($sp)		 #save $s4 on stack
sw  $s5,4($sp)		 #save $s5 on stack

sw	   $ra,0($sp)			  #save $ra on stack

add	$s3,$zero,$a0	   #$s3=v
add	 $s4,$zero,$a1	  #$s4= n
add	 $s5,$zero,$a2	  #$s5=k

addi	$s0,$zero,1			#i=1

add	$a0,$zero,$s3	   #a0=b

addi   $a1,$zero,10		 #$a1=10

jal	   b_sort						 #call sort

add	 $s1,$zero,$s4	   #$s1=($s4=n)

slt	   $t0,$s1,$s0			 #($s1=right)<($s0=left) 
bne	$t0,$zero,exit

add   $a0,$zero,$s0	 # $a0=($s0=left)
add   $a1,$zero,$s1	 #$a1=($s1=right)

jal	  mid						  #call mid

sll		$t0,$v0,2			 #reg $t0=x*4
add	$t0,$t0,$s3		#$t0=v[x]
lw	  $t1,0($t0)			#reg $t1=v[x]

slt	 $t0,$s5,$t1		#reg $t0=1 if((s5=key)<v[x])
beq   $t0,$zero,else	#go to else if($s5>v[x])

sub   $s1,$v0,-1		  #(right=x-1),right=$s1 & x=$v0

j	   L							   #go to call L

#-----------------------------------------------------------------------------

else:	 
			addi   $s0,$v0,1			# (left=x+1),left=$s0 & x=$v0

#-----------------------------------------------------------------------------

L:
		   bne	 $s5,$t1,exit		# [if(key == v[x])go to exit]   
		   add	$v1,$s3,$v0		 #$v1=v+x
#--------------------------------------------------------------------------------
exit: 
		   #end of loop

lui	  $v1,65535
ori	  $v1,$v1,65535

lw $ra,0($sp)	   #restore $ra from stack
lw  $s5,4($sp)	   #restore $s5 from stack
lw $s4,8($sp)	   #restore $s4 from stack
lw $s3,12($sp)	   #restore $s3 from stack
lw $s2,16($sp)	  #restore $s2 from stack
lw $s1,20($sp)	  #restore $s1 from stack
lw $s0,24($sp)	  #restore $s0 from stack
addi $sp,$sp,28	 #restore stack pointer from stack

jr $ra			  #return to the calling routine
#-------------------------------------------------------

b_sort:
		addi $sp,$sp,-12  # make room on stak for 4 register
		sw $s3,55($sp)	# save $s3 on stack
		sw $s2,50($sp)	# save $s2 on stack
		sw $s1,46($sp)	# save $s1 on stack
		sw $s0,42($sp)	# save $s0 on stack

swap:   
			sll $t1,$a1,2	 # reg $t1=x*4
			 add $t1,$a0,$t1   # reg $t1=v+(x*4)
					  # reg $t1 has the address of v[x]
	lw $t0,0($t1)	 # reg $t0 (temp)=v[x]
	lw $t2,4($t1)	 # reg $t2=v[x+]
					  # refers to next element of v
	sw $t2,0($t1)	 # v[x]=reg $t2
	sw $t0,4($t1)	 # v[x=1]=reg $t0 (temp)
	jr $ra			# return to calling routine

#---------------------------------------------------
mid:	add $t1,$a0,$a1  # $t1=x+y
				srl $v0,$t1,1	# shiftting to right 1 bit and put the result in $v0 (x)
	jr $ra		   # return to calling routine
#----------------------------------------------------

.data					  # Data declaration section
n1: .word 10					  # n1=10
n2: .word 10					  # n2=10
v: .word -2,0,5,7,9,12,17,25,40,128  # v is address
	.text

اما المطلوب هو ان يعمل binary search باستخدام bubble sort

#10
.data
v: .word -2,0,5,7,9,12,17,25,40,128
FOUNDS:  .asciiz "FOUND" # declares a null-terminated string, to "prettify" output
NOTFOUNDS: .asciiz "NOTFOUND" 

.text
main:
			 la $a0,v
  ########		   li $a1,10
			 li $a2,25


			  jal bsearch
			  li $v0, 10  
  syscall 

bsearch:



		   addi $sp,$sp,-28
		   sw $ra,24($sp)
		   sw $s0,20($sp)
		   sw $s1,16($sp)
		  sw $s2,12,($sp)
		 sw $s3,8($sp)
		sw $s4,4($sp)
	   sw $s5,0($sp)



li $s4,0 # Set Initial Left
li $s5,10 # Set Initial Right

#Read Number From User
li $v0, 5  
syscall  # Number Saved In $v0
add $a2,$v0,$zero


towhile:

slt $t0,$s4,$s5  # While(left < Right )
beq $t0,$zero,NotFound

jal  mid

add $t1 , $v1,$v1 # Index Of Array * 4
add $t1 , $t1,$t1

add $t1 , $a0,$t1 #Phisical Adress = Base Adress + Index Of Array *4
lw $t1 ,0($t1)  # $t1 = V[ PH.A ]
beq $t1,$a2, InArray 

slt $t2,$a2,$t1
bne $t2,$zero , SetRight

addi $s4,$v1,1
j towhile

SetRight:
add $s5,$v1,$zero

j towhile


InArray:

li  $v0, 4  # system call code for printing string = 4
la  $a0, FOUNDS # load address of string to be printed into $a0
syscall

j Exit


NotFound:

li $v0, 4  # system call code for printing string = 4
la $a0, NOTFOUNDS # load address of string to be printed into $a0
syscall






Exit:



lw $s5,0($sp)
lw $s4,4($sp)
lw $s3,8($sp)
lw $s2,12($sp)
lw $s1,16($sp)
lw $s0,20($sp)
lw $ra,24($sp)

addi $sp,$sp,28

jr $ra


mid:
   add $t0,$s4,$s5
srl $v1,$t0,1
jr $ra

هذا كود لبرنامج يعمل Binary Search

يدخل المستخدم الرقم المراد البحث عنه فإن وجده يطبع النتيجة Found

وإن لم يجده يطبع النتيجة NotFound

أضفته لك من قبل في مشاركتك بقسم > الميكروكنترولر (المتحكم) و الدوائر الرقمية و المنطقية

الآن بشوف المشكلة في الكود اللي وضعتيه بالأخير

لكن مشكلتنا مع الكهربا إن شاء الله ما بتقطع

تحياتي

ENG-GAZA.GIF
#11

السلام عليكم ورحمة الله وبركاته

الـ Binary Search يذهب الى القيمة اللي في نصف الـ Array

ويقارن هذه القيمة مع العدد المراد البحث عنه

وبناء على قيمة المقارنة إما أن يعيد الـ Binary Search نفسه في النصف الأيمن أو الأيسر من الـ Array

والـ Binary Search لا يعمل إلا على Array مرتبة تصاعديا

 v: .word -2,0,5,7,9,12,17,25,40,128

الشرط متحقق !

أدع لك الإجابة على السؤال التالي :

ماهو الـ Bubble Sort وما علاقته بالبرنامج ؟؟

تحياتي وبالتوفيق

ENG-GAZA.GIF
#12

اشكرك جداا يا اخي Eng_Gaza على المساعده فقد استفدت كثيراا منها

لاني ماكنت بعرف التعليمه التي تقرا من ال user ولا كيف اظهر له

string على الشاشه

فجزاك الله عنا خير الجزاء

هذا الموضوع مغلق.

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