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

اريد كود ضرب المصفوفات باستخدام 8086

مغلق
بدأه ahmed_eltalkhawy في 4 مايو 2005 · 10 رد · 2,316 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لقد طلب منى برنامج لضرب مصفوفتين بال assembly و ابعاد الأولى m×k و الثانية k×n و بهذا تكون ابعاد المصفوفة الناتجة m×n و لقد كتبت البرنامج كله تقريباً و لكن الregisters خلصت منى فهل يوجد احد لديه حل

بشرط الآ يقوم بعملية الجمع الموجودة فى vectormul فى الذاكرة

و ها هو البرنامج :

;==================================================
;
; PROGRAM : top.asm
;
; AUTHOR  : أحمد الطلخاوى
;
; PURPOSE : matrix matrix multiplication
;
;==================================================

.model small
;-----------------------------------------------
.data
   m   equ   2
   k   equ   2
   n   equ   2
   xmat   dw 1,1,1,1
   ymat   dw 1,1,1,1
   result   dw m*n*2   dup (0)
;-----------------------------------------------
.code
main:   mov   ax,@data
   mov   ds,ax
   call   matrixmul
   mov   ah,4ch
   int   21h
;--------------------------------------------------------------------------
matrixmul   proc   near
   mov   si,0
   mov   ax,0
   mov   cl,m
lp2:   mov   ch,n
   mov   bx,0
lp1:   call   vectormul
   add   bx,2
   dec   ch
   jnz   lp1
   add   si,k*2
   dec   cl
   jnz   lp2
   ret
matrixmul   endp
;--------------------------------------------------------------------------
vectormul   proc   near
   push   cx
   push   si
   push   bx
   mov   bp,0
   mov   di,0
   mov   cl,k
lp:   mov   ax,xmat[si]
   mul   ymat[bx]
   add   bp,ax
   adc   di,dx
   add   si,2
   add   bx,2*n
   dec   cl
   jnz   lp
   pop   bx
   pop   si
   pop   cx
   mov   result[si][bx],bp				;يجب أن يشير على الناتج - طريقة خاطئة
   mov   result[si][bx+2],di			 ;يجب أن يشير على الناتج - طريقة خاطئة
   ret												  ;و لا اريد عملية الجمع ان تتم فى الذاكرة
vectormul   endp
;--------------------------------------------------------------------------
scalmul   proc   near
   mov   ax,xmat[si]
   mul   ymat[bx]
   add   bp,ax
   adc   di,dx
   ret
scalmul   endp
;--------------------------------------------------------------------------
   end   main
sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#2
vectormul proc near
push cx
push si
push bx
mov bp,0
mov di,0
mov cl,k
lp: mov ax,xmat[si]
mul ymat[bx]
add bp,ax
adc di,dx
add si,2 ; wrong u r using dword type so it must increment by 4
add bx,2*n ; also u must multiply by 4
dec cl
jnz lp
pop bx
pop si
; u have declared xmat,ymat,result as dword tables
; Each dword takes 4bytes of memory size
#3
basssem كتب:
vectormul proc near
push cx
push si
push bx
mov bp,0
mov di,0
mov cl,k
lp: mov ax,xmat[si]
mul ymat[bx]
add bp,ax
adc di,dx
add si,2; wrong u r using dword type so it must increment by 4
add bx,2*n; also u must multiply by 4
dec cl
jnz lp
pop bx
pop si
; u have declared xmat,ymat,result as dword tables
; Each dword takes 4bytes of memory size

يا أخى dw هى أختصار(Define Word) و ليس Double Word

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#4

السلام عليكم

لم اقراء البرنامج بالكامل لضيق الوقت ولكن من النظره السريعه يتضح ان كلام الاخ basssem مظبوط حيث ان dw معناها كما ذكرت هى define word الورد فى نظام إنتل تتكون من 4 بايت لذالك عليك ضرب si فى 4 عندما تريد الانتقال للعنصر الذى يليه اما dd وهى ايضاً dword والتى تعنى double word فهى 8 بايت, إن شاء الله لو سمح الوقت ساقوم بالإلقاء نظره على الكود المرفق غداً إن شاء الله.

ربما خان اخونا basssem التعبير وكتب dword بدلاً من dw ولكن باقى كلامه صحيح .

والسلام

تم تعديل هذه المشاركة بواسطة احمد غريب في 14 مايو 2005 في 18:47

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5
احمد غريب كتب:
السلام عليكم

لم اقراء البرنامج بالكامل لضيق الوقت ولكن من النظره السريعه يتضح ان كلام الاخ basssem  مظبوط حيث ان dw  معناها كما ذكرت هى define word  الورد فى نظام إنتل تتكون من 4 بايت لذالك عليك ضرب si فى 4 عندما تريد الانتقال للعنصر الذى يليه اما  dd وهى ايضاً dword والتى تعنى double word  فهى 8 بايت, إن شاء الله لو سمح الوقت ساقوم بالإلقاء نظره على الكود المرفق غداً إن شاء الله.

ربما خان اخونا basssem  التعبير وكتب dword  بدلاً من dw ولكن باقى كلامه صحيح .

والسلام

ليس الورد فى نظام إنتل يتكون من 4 بايت و لكن من 2 بايت أخى يعنى 16 بت

و الdouble word يتكون من 4 بايت او 32 بت

و الquadrable word يتكون من 4 word أو 16 بايت أو 64 بت

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#6
احمد غريب كتب:
السلام عليكم

لم اقراء البرنامج بالكامل لضيق الوقت ولكن من النظره السريعه يتضح ان كلام الاخ basssem  مظبوط حيث ان dw  معناها كما ذكرت هى define word  الورد فى نظام إنتل تتكون من 4 بايت لذالك عليك ضرب si فى 4 عندما تريد الانتقال للعنصر الذى يليه اما  dd وهى ايضاً dword والتى تعنى double word  فهى 8 بايت, إن شاء الله لو سمح الوقت ساقوم بالإلقاء نظره على الكود المرفق غداً إن شاء الله.

ربما خان اخونا basssem  التعبير وكتب dword  بدلاً من dw ولكن باقى كلامه صحيح .

والسلام

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#7

الف شكر أخوتى الذين قاموا بالرد و لكنى وجدت الحل و استطعت كتابة البرنامج و ها هو ذا و لكن مع بعض التعديل حيث أنه يقوم بأخذذ المصفوفتين من ملف input.dat و يضربهما و يضع الناتج فى الملف output.dat و يطبعهما على الشاشة

و يجب أن يكون المصفوفتين على الشكل

1 40 5 7 13 8

5 45 12 4 15 7

أو أى ارقام أخرى

حيث أول سطر يمثل المصفوفة الأولى و هى 3 × 2

و السطر الثانى يمثل المصفوفة الثانية و هى 2×3

و يمكن تعديل ابعاد المصفوفتين يتعديل قيمm و n

و مرفق البرنامج التنفيذى مع ملف تجريبى للدخل لتجربته و يمكنكم التعديل فيه كما تريدون

MASM.zip

تم تعديل هذه المشاركة بواسطة ahmed_eltalkhawy في 17 مايو 2005 في 19:56

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#8

البرنامج مرة أخرى

;==================================================
;
; PROGRAM : matrixmul with files.asm
;
; AUTHOR  : أحمد الطلخاوى
;
; E-Mail       : ahmed_eltalkhawy@yahoo.com
;
; Web Site       :http://newfajr.cjb.net
;
; PURPOSE : matrix multiplication with files
;
;==================================================
.model small
.data
m	equ	3
k	equ	2
n	equ	3
xmat	dw  m*k	dup(0)
ymat	dw   k*n	dup(0)
buffer	db m*n*20 dup(0)
result	dw m*n*2	dup (0)
marker	db (0)
f_input	db "input.dat",0
f_output	db "output.dat",0
inhandle	dw ?
outhandle	dw ?
buffersize	dw ?
err_open	db "couldn't open file !","$"
err_creat	db "couldn't create the file","$"
err_write	db "couldn't write the file","$"
err_close	db "couldn't write the file","$"
msg	db "Press any key to continue...","$"
;----------------------------------------------------------------------------
.code
main:	mov	ax,@data
	mov	ds,ax
	call	open
	call	read
	mov	di,offset buffer
	mov	si,offset xmat
	mov	cl,m*k
	call	asciitobin
	mov	cl,k*n
	mov	si,offset ymat
	call	asciitobin
	call	matrixmul
	call	bintoascii 
	call	creatfile
	call	writefile
	mov	bx,inhandle
	call	closefile
	mov	bx,outhandle
	call	closefile
	mov	dx,offset	buffer
	call	err_msg
	mov	dx,offset msg
	call	err_msg
	mov	ah,07h
	int	21h
	mov	ah,4ch
	int	21h
;-----------------------------------------------------------------------------
open	proc	near
	mov	ah,3dh
	mov	al,0
	mov	dx,offset f_input
	int	21h
	jc	o_error
	mov	inhandle,ax
	jmp	o_exit
o_error:	mov	dx,offset err_open
	call	err_msg
o_exit:	ret
open	endp
;------------------------------------------------------------------------------
err_msg	proc	near
	mov	ah,9h
	int	21h
	ret
err_msg	endp
;------------------------------------------------------------------------------
read	proc	near
	mov	ah,3fh
	mov	bx,inhandle
	mov	cx,m*n*20
	mov	dx,offset buffer
	int	21h
	ret
read	endp
;------------------------------------------------------------------------------
asciitobin	proc	near
	mov	bh,0
	mov	bp,10d
next:	mov	ax,0
here:	mov	bl,[di]
	cmp	bl,20h
	je	there
	sub	bl,30h
	mul	bp
	add	ax,bx
	inc	di
	jmp	here
there:	mov	word ptr[si],ax
	inc	di
	add	si,2
	dec	cl
	jnz	next
	add	di,2
	ret
asciitobin	endp
;------------------------------------------------------------------------------
matrixmul	proc	near
	mov	si,0
	mov	di,0
	mov	cl,m
lp2:	mov	ch,n
	mov	bx,0
lp1:	call	vectormul
	mov	result[di],ax
	mov	result[di+2],dx
	add	di,4
	add	bx,2
	dec	ch
	jnz	lp1
	add	si,k*2
	dec	cl
	jnz	lp2
	ret
matrixmul	endp
;--------------------------------------------------
vectormul	proc	near
	push	si
	push	bx
	push	cx
	push	bp
	push	di
	mov	bp,0
	mov	di,0
	mov	cl,k
lp:	mov	ax,xmat[si]
	mul	ymat[bx]
	add	bp,ax
	adc	di,dx
	add	si,2
	add	bx,2*n
	dec	cl
	jnz	lp
	mov	ax,bp
	mov	dx,di
	pop	di
	pop	bp
	pop	cx
	pop	bx
	pop	si
	ret
vectormul	endp
;-------------------------------------------------
bintoascii	proc	near
	mov	si,offset marker
	sub	si,4
	mov	bx,10
	mov	cl,m*n
	mov	bp,sp
lp4:	mov	ax,word ptr[si]
	mov	dx,word ptr[si+2]
	mov	ch,0
lp3:	div	bx
	add	dx,30h
	push	dx
	inc	ch
	mov	dx,0
	or	ax,ax
	jnz	lp3
	push	cx
	sub	si,4
	dec	cl
	jnz	lp4
;------------------------------------------------------
; storeing in buffer section
;------------------------------------------------------
	mov	di,offset buffer
	mov	bl,m
	mov	dx,0
lp7:	mov	bh,n
lp6:	pop	cx
lp5:	pop	ax
	mov	[di],al
	inc	di
	inc	dx
	dec	ch
	jnz	lp5
	mov	byte ptr[di],20h
	inc	di
	inc	dx
	dec	bh
	jnz	lp6
	mov	byte ptr[di],0dh
	mov	byte ptr[di+1],0ah
	add	di,2
	add	dx,2
	dec	bl
	jnz	lp7
	mov	byte ptr[di],'$'
	mov	buffersize,dx
	mov	sp,bp
	ret
bintoascii	endp
;-------------------------------------------------
creatfile	proc	near
	mov	ah,3ch
	mov	cx,0
	mov	dx,offset f_output
	int	21h
	jc	c_error
	mov	outhandle,ax
	jmp	c_exit
c_error:	mov	dx,offset err_creat
	call	err_msg
c_exit:	ret
creatfile	endp
;-------------------------------------------------
writefile	proc	near
	mov	ah,40h
	mov	bx,outhandle
	mov	cx,buffersize
	mov	dx,offset buffer
	int	21h
	jnc	w_exit
	mov	dx,offset err_write
	call	err_msg
w_exit:	ret
writefile	endp
;------------------------------------------------------------------------------
closefile	proc	near
	mov	ah,3eh
	int	21h
	jnc	cl_exit
	mov	dx,offset err_close
	call	err_msg
cl_exit:	ret
closefile	endp
;------------------------------------------------------------------------------
	end	main

تم تعديل هذه المشاركة بواسطة ahmed_eltalkhawy في 17 مايو 2005 في 19:50

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#9

السلام عليكم

نعم معك حق اخى احمد الword هو 2 بايت الظاهر كنت نعسان وانا باكتب الرد eax هى من نوع double word و ax من نوع word وتنقسم إلى ah و al وكل منهما يحلم 1 byte المعذره, المفروض إن هذه هى غلطة الاداره إلى سمحت لنا نكتب ردود بعد الساعه السادسه صباحاً المفروض الاداره تغلق باب الرد على الاسئله وطرحها الساعه 2 صباحاً على اقصى تقدير.

الحمد لله المشكله اتحلت على كل حال.

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#10

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

اشكرك أخى على اهتمامك

sign2.gif

رحم الله امرىء أهدى لى عيوبى

سبحان الله و بحمده سبحان الله العظيم

#11
ahmed_eltalkhawy كتب:
يا أخى  dw هى أختصار(Define Word) و ليس Double Word

متاسف فلقد ذهبت عن بالى و أصبحت أرى سوى Double Word

أعتذر عن هذا الخطأ

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

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