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

في حاجة إلى امثلة!

مغلقرائج
بدأه منسيه في 30 مايو 2004 · 51 رد · 5,045 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اولا بما انها مشاركاتي الاولى اسمحولي اهنيكم على المنتدى الرائع وخاصة قسم الاسمبلي العجيب

ثانيا.. كنت ابحث عن شوية امثلة تخص موضوع stack parameters وهو نقل المعلومات من الـ main proc إلى proc آخر أو استخدام الستاك بدل الريجستر في حل التمارين

يا ترى اقدر احصل شوية امثلة عندكم؟؟

اختكم ..

منسيه

#2

السلام عليكم,

نرحب بالأخ منسيه وأتمنى أن يكون عضوا فعالا في هذا المنتدى وأن يفيد ويستفيد.

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

إذا كان عندك مثالا ما ولو فيه مشكل يمكن أن تطرحه هنا ومن جانبي امهلني يومين أو ثلاثة بعدما أنتهي من بعض الأشغال وسأحاول إعطاء أمثلة في هذا.

إلى اللقاء.

#3

وعليكم السلام والرحمة اخي chik

اولا انا اخت ولست اخ :)

اما ثانيا ...فشكرا جزيلا لسرعت استجابتك للموضوع وشكرا للاقتراح الجميل، لكنني لم اطلب هذا الطلب إلا لأنيي افتقد لهذا النوع من الامثلة وانني لست متمكنه من الموضوع جيدا،فإذا تمكنت من هذا النوع من الاسألة، سأطرح سؤال للأعضاء كنوع من التدريب وكل عضو يعرض اجابته ويكون موضوع نقاش وبعد ذلك ننتقل إلى سؤال آخر وهكذا...

وسيكون لي الشرف في ان اكون عضوة فعالة معاكم ا نشاء الله

اختكم..

منسيه

#4
TITLE	A07CASE (COM)  Change uppercase to lowercase
  .MODEL SMALL
  .CODE
  ORG   100H
BEGIN:	JMP   A10MAIN
; --------------------------------------------------
CONAME	DB   'LASER-12 SYSTEMS', '$'
; --------------------------------------------------
A10MAIN	PROC   NEAR
                LEA       BX,CONAME+1          ;1st char to change
  MOV   CX,15  ;No. of chars to change
A20:
  MOV   AH,[BX]  ;Character from CONAME
                CMP       AH,61H                       ;Is it
  JB   A30  ;  upper
                CMP       AH,7AH                       ;  case
                JA        A30                  ;  letter?
  XOR   AH,00100000B	;Yes, convert
  MOV   [BX],AH  ;Restore in CONAME
A30:
  INC   BX 	 ;Set for next char
  LOOP   A20  ;Loop 15 times
      ;Done,
  MOV   AH,09H  ;  display
  LEA   DX,CONAME	;  CONAME
  INT   21H
  MOV   AX,4C00H	;End processing
  INT   21H
A10MAIN	ENDP
  END   BEGIN

هذا برنامج عن البروسجير مين

ويتحدث عن تحويل الاحرف من كبيتال إلى سمول

وشكرا

#5

السلام عليكم,

أولا أعتذر للأخت منسيه - حيث خاطبتها كأخ - وهذا ليس من قلة Galanterie مني ولكن لكثرة المشاغل هذه الأيام حيث أحاول أن أضع الردود بسرعة وغالبا لا أنظر إلى أسم العضو الذي طرح السؤال. أتمنى أن لا يتكرر مني هذا الخطء مرة ثانية وتقبلي مني أختي كل اعتذاري مرة أخرى.

كما أريد |أن أشكر الأخ محمد جابر على المثال الذي أعطانا إياه وقد نعتبر هذا منطلقا لأمثلتنا ونحاول أن نغيره حسب ما نريد.

فهذا المثال ليس بالمفهوم الذي طلبته الأخت إذ هو لا يستعمل الستاك لتمرير البارامترات وهذا في الأصل لا يقبل أي بارامتر لأن الأشياء التي يستعملها هي داخل الدالة نفسها مثل CONAME وطول الجملة كلتاهما داخل الدالة.

وكما قلت سنأخذ هذا المثال كمنطلق وسنحاول تغييره حتى نتمكن من تمرير المعطيات له في الأول عن طريق الرجستر ومن بعد عن طريق الستاك حتى نمر عبر هذه المراحل وحتى يتسنى لنا معرفة وإدراك الفرق بين كل هذه الأشياء.

أتمنى أن يقوم أحد الإخوان بوضع محاولته - وحتى لو كانت خاطئة , فمن الأخطاء نتعلم - ومن جهتي بعد وقت وجيز سأحاول إعطاء هذا إذا لم تكن هناك أي مبادرة.

إلى اللقاء.

#6

السلام عليكم والرحمة

الشكر الجزيل للأخ مؤيد أبوجابر على تفاعله مع الموضوع، ومثل ما قال الاخ شيك انه في حاجة للستاك وليس الريجستر لكن ولا يهمك، مثالك بيكون الانطلاقة إن شاء الله ، وانشاءء الله اطرح لكم طريقة ثانية لحل نفس المثال بعد باستخدام الريجستر

اقتباس
أولا أعتذر للأخت منسيه - حيث خاطبتها كأخ - وهذا ليس من قلة Galanterie مني ولكن لكثرة المشاغل هذه الأيام حيث أحاول أن أضع الردود بسرعة وغالبا لا أنظر إلى أسم العضو الذي طرح السؤال. أتمنى أن لا يتكرر مني هذا الخطء مرة ثانية وتقبلي مني أختي كل اعتذاري مرة أخرى.

ولا يهمك يا خوي وماله داعي للأعتذار، عاااااااادي بس ضحكتني والله ;)

والسؤال اللي اريد احله بالستاك عندي عبارة عن ادخال رقم من اليوزر وباستخدام الستاك نسوي بروسيجر يرجع لنا الرقم بالمعكوس لل main بروسيجر في eax

إن شاء الله احط لكم الحل قريبا ونبدأ نحل تمارين ثانية مثل ما اقترحتوا اخواني

شكراااااااااااااااااا لكم

تحياتي

اختكم..منسيه

#7

السلام عليكم,

كما وعدت من قبل سأقوم بإعطاء أمثلة حول موضوع استدعاء البروسديور وسأعطي مثالا بالإستدعاء باستعمال الرجستر ومرة أخرى باستدعاء الستاك وأتمنى أن تكون الأمور واضحة.

لقد اتخذت المثال الذي أتى به الأخ مسبقا وبعد تغيير طفيف والبرنامج يقوم بتحويل كتابة ندخلها من الكايبورد إلى كتابة ب UpperCase .

وقد أعطيت الملفات كلها في الملف المرافق وهو يحتوي على ما يلي :

- LtoUp.asm كود المثال السابق ولكن بدون استدعاء أي بروك

- LtoUp.exe الملف مبني للتجربة

-Pr_Reg.asm كود نفس المثال السابق وهنا باستدعء بروك عن طريق الرجستر

- Pr_Stack نفس الكود وهنا باستعمال بروك عن طريق الستاك

أتمنى أن تنفعكم هذه الأمثلة وإذا كان فيه أي تساؤل سنكون إن شاء الله جاهزين.

إلى اللقاء.

Sample.zip

#8

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

اولا اشكركم كل الشكر على تفاعلكم مع الموضوع ومتابعتكم له

ثانيا لاحظت(مع اني مو خبيرة ) انكم تبرمجون باستخدام الـ 16 بيت على ما اعتقد، فيما ان دراستنا في الجامعة تعتمد على الـ 32 بيت، لذلك لم استوعب بعض الامثلة اللي تم طرحها

ما ادري إذا لكم علم واهتمام باـ 32 بيت او لا ، بس مثل ما وفيتو بوعودكم معي راحي اوفي بوعدي وهاذي طريقة ثانية لمثال الأخ مؤيد باستخدام الريجستر:

include irvine32.inc
;change to upper case

.data
string	byte	100 dup(?)
P1	byte	"Enter a string: ",0

.code
main	proc	
	mov	edx,offset P1
	call	writestring
	call	crlf
	mov	edx,offset string
	mov	ecx,100
	call	readstring
	mov	ecx,eax;number of char

	mov	esi,0
L:	mov	al,string[esi]
	cmp	AL,'a'
	jl	no
	cmp	al,'z'
	ja	no
	sub	al,20h
	mov	string[esi],al
no:	inc	esi
	loop	L

	mov	edx,offset string
	call	writestring
	exit
main	endp
end	main
end

اما بالنسبة لاستخدام الستاك فمثل ما ذكرت سابقا اني لحد الان لم اتمكن جيدا من هذا النوع ولكن بعرض حل اجابة السؤال اللي ذكرته (وهو عكس الارقام) بس بعد فترة كمن يوم إن شاء الله (حتى ينتهي موعد تسليمه في جامعتنا (; )

وإن شاء الله نتعلم معاكم استخدام الـ 16 بت، وشكرا مرة ثانية

#9

السلام عليكم

بعد القيام بتعديلات بسيطه على البرنامج اليكم الحل بستخدام الستاك

Title Stack Demo 
.486
.model  flat, stdcall
option  casemap: none

include c:\masm32\include\masm32.inc
includelib c:\masm32\lib\masm32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib

.data
userStrg DB 100 DUP (?)
Msg1 DB " Please Enter String to convert to Upper Case  :",0
Msg2 DB " Your new String after conversion is as follow :",0

.code
start:
invoke StdOut,addr Msg1
invoke StdIn,addr userStrg, sizeof userStrg
lea edx, userStrg
push edx   	 ;push secound parameter
mov ecx, sizeof userStrg	;get size of string
push ecx   	 ;push it as first parameter
call UpperCase    ;call our subroutine
invoke StdOut,addr Msg2
invoke StdOut,addr userStrg
xor eax,eax
invoke ExitProcess,eax  ;exit Program
ret

;###########Here is the Procedure that will use the stack to convert Chars##########
UpperCase:
push    ebp                    ;create stack frame
mov     ebp,esp                ;save base pointer 
pushad                         ;push all register to the stack
mov esi,[ebp+12] 	 ;ebp = ebp, return adress = ebp+4
mov ecx,[ebp+8]    ;first Parameter = ebp+8, secound Parameter = ebp+12
L: mov al,[esi]
cmp AL,'a'
jl no
cmp al,'z'
ja no
sub al,20h
mov [esi],al
no: inc esi
loop L
popad      ;pop all register
mov esp,ebp   	 ;get stack pointer in position
pop ebp      ;get base pointer back
ret 8      ;clean stack & go back (2 variables = 8 byte)
end start

الاخت منسيه بالفعل الاغلبيه هنا تتعامل مع 16بت, انا شخصياً نبذتها منذ اكثر من عامين, احاول احياناً ان اساعد بعض الاخوه هنا ولكن لا اعتبر نفسى خبير بها.

اما بالنسبة للستاك فهناك 4 اشياء لابد ان نضعها فى الحسبان

1. الحفاظ على ebp وذالك بعملية push ebp

2. وضع الستاك بوينتر فى ebp بواسطة mov ebp,esp

3. المحافظة على محتويات الرجستر. pushad

4. إستعادة ما وضع فى الستاك بعد الإنتهاء و تنظيفه من البراميترات.

والسلام

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

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

#10

كفيت وفيت يا خوي، وكلمة شكرا قليلة في حقك

تحياتي..

اختكم ..منسيه

#11

السلام عليكم

الشكر لله ثم لجميع المشاركين فى الموضوع , وإن شاء الله تعلى سنكمل الموشوار مع الاسمبلى 32بت إذا وجدت الرغبه لدى الاعضاء.

والسلام

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

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

#12

اتمنى ، واذا حابين ممكن نواصل في طرح الاسألة وتبادل الاجوبة...شرايكم؟؟

#13

salam wr wb

sorry I don't have arabic at work .

anyway if you have any Questions, sure why not, and later on I will insha Allah put some tips & trix that I find usefull.

salam wr wb

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

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

#14

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

انا بصراحه من زمان اقترحت على اخوي

chik

انوا نضع امثله ويتم مناقشه لان الممارسه في مواد البرمجه اهم شي

وبصراحه انا حبيت هذي اللغه وحاب اتعلمه من ألف للياء

وياريت نكمل طرح امثله وشكرا

#15

السلام عليكم,

أنا مشيت مع 16 بت لأن أغلب التساؤلات تكون حول هذا الميدان.

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

وأنا مستعد أن نناقش هذه المواضيع إذا أردتم وأن نبرمج بعض البرامج حتى نكتسب الخبرة والتمرن في هذا .

ويمكن مشاهدة الرابطين ويمكن أن يكونا من بين مواضيع النقاش أو إذا كانت لكم اقتراحات أخرى نسير معها.

/index.php?showtopic=40120

/index.php?showtopic=33253

إلى اللقاء.

#16

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

اشكركم جميعا على الاهتمام وإن شاء الله هذا الموضوع يكون الانطلاقة لتمارين الـ 32 بت.

اما بالنسبة لمواضيعك اخي chik ، اهيه مواضيع ممتازة ولكن..بصراحة، بالنسبة لمبتدأة نفسي ما اقدر اعطي في مثل هذه المواضيع( يعني اضيع فيها ) ولكن اقدر اتعلم منها ولك الاجر والثواب .لكن إن شاء الله اقدر اواصل معاكم في التمارين والبرمجة( على الرغم من عفسة الامتحانات :( ) وخلونه نبدأ ببرنامج فكرته بسيطة جدا وهو:

write a program that prints all the even numbers between 0 and 500

انه عندي الجواب ولكن ماراح احطه إلا إذا بدأ الاخوان بعرض اجوبتهم... بالتوفيق

ملاحظة:

المعذرة اذا تكلمت( كتبت) باللغة الخليجية العامية ;)

#17

السلام عليكم

حل لسؤال الاخت منسيه, و اتمنى ان ارى افكار مختلفه, هناك اساليب كثيره يمكن ان يحل بها هذا النوع من الاسئله, و إن شاء الله سوف اقدم مقترحات اخرى لاحقاً

والسلام

example.zip

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

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

#18

وعليكم السلام والرحمة

شكرا على المشاركة اخي احمد غريب ولكن عندي لك بعض التساؤلات!!

انت تستخدم اي برنامج، لين اعمل لبرنامجك رن على textbad ما يشغله لي؟؟

وما هي stdout اللي في البرنامج؟؟ ماذا تعمل؟؟

وبالنسبة للـ:

Title Stack Demo 
.486
.model  flat, stdcall
option  casemap: none

include c:\masm32\include\masm32.inc
includelib c:\masm32\lib\masm32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib

انه اعرف انها احدى طرق البرمجة بس كيف ممكن اعرف الكود المناسب لكل برنامج؟؟( يعني ابغي شوية شرح عن استخدام هاذي الطريقة إذا ممكن)

وفيه ملاحظة صغيرونه ...السؤال even بس الجواب odd ;)

احين جاه دوري ، حليت السؤال بالستاك والريجستر...ابغيكم تعلقون على الطريقة ، خاصة استخدام الستاك، وهلو تعتقدون ان طريقتي صحيحة؟؟

اولا الستاك:

;comment@(write a program that prints all the even numbers between 0 and 500)@
include	irvine32.inc

.data
arr	dword	500 dup(0)
divs	dword	2
P	byte	"The even numbers are: ",0
.code
evennum	proc	
	pushad

LL:	mov	eax,esi
	div	ebx
;call	dumpregs
	cmp	edx,0
	jne	next
	mov	eax,esi
	call	writedec
	mov	al,9
	call	writechar
next:	inc	esi
	cmp	esi,500
	je	outt
	jmp	LL
     
outt:	popad
	ret
evennum	endp


main	proc

	mov	edx,offset P
	call	writestring
	call	crlf

	mov	esi,0
	mov	ebx,2
	mov	edx,0
	call	evennum

	exit
main	endp
end	main
End

الريجستر:

.data
arr	dword	500 dup(0)
divs	dword	2
P	byte	"The even numbers are: ",0
.code
main	proc

	mov	edx,offset P
	call	writestring
	call	crlf

	mov	esi,0
	mov	ebx,2
	mov	edx,0
;call	dumpregs
	LL:mov	eax,esi
    div	ebx
   ;call	dumpregs
    cmp	edx,0
    jne	next
    mov	eax,esi
    call	writedec
    mov	al,9
    call	writechar
    next:inc	esi
   	 cmp	esi,500
   	 je	outt
   	 jmp	LL
    
outt:	exit
main	endp
end	main
End
#19

السلام عليكم

اقتباس
انت تستخدم اي برنامج، لين اعمل لبرنامجك رن على textbad ما يشغله لي؟؟

اتوقع ان textpad هى جزء من irvine packege, انا استخدم ال command line اعمل الكومبيل واللنك. والبرنامج هو مجرد تكست عادى. ايضاً لا استمخدم masm التى توجد فى CD الكتاب, بل استخدم masm32 v8 والتى يمكن الحصول عليها من هنا

اقتباس
وما هي stdout اللي في البرنامج؟؟ ماذا تعمل؟؟

StdOut و StdIn هما جزء من ال run time library المتاحه فى وندوز, وهى مثل writestring و readstring الموجوده فى irvine32.inc.

لمذا لا استخدم irvine.inc? لان إمكانياتها محدودة و تستخدم فقط من قبل الذين يدرسون كتابه.

شرح مبسط عن البرنامج :

Title Stack Demo 
.486
.model  flat, stdcall
option  casemap: none

include c:\masm32\include\masm32.inc
includelib c:\masm32\lib\masm32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib

Titel هو عباره عن إسم البرنامج , يمكنكم ان تعتبروه مجرد comment.

.486,.386 الخ هو تحديد لاصغر معالج يكن ان يعمل عليه البرنامج, فمثلاً هذا البرنامج لن يعمل على برسسر 386 .

model flat معناها بختصار ان البرنامج كتب لبيئة الوندوز 95 فما بعد.

model stdcall يطول شرحها, لمن عنده كتاب Irvine الشرح موجود فى صفحة 277.

include و includelib هذه مكتبات تحوي بعض الفنكشن التى نستخدمها فى البرنامج.

بالطبع كل هذه الاشياء موجوده بداخل irvine.inc , ويمكنكم مشاهدتها إذا قمتم بفتح الملف فى اى text editor.

اقتباس
وفيه ملاحظة صغيرونه ...السؤال even بس الجواب odd

بتغير mov ebx,-1 الى mov ebx,0 ستحصلين على even numbers.

اقتباس
اولا الستاك:

لا يستخدم الستاك و إنما الرجستر, البرنامج بعد التعديل يصبح:

;comment@(write a program that prints all the even numbers between 0 and 500)@
include irvine32.inc

.data
arr dword 500 dup(0)
divs dword 2
P byte "The even numbers are: ",0
.code
evennum proc 
push ebp
mov ebp,esp
pushad
mov esi,ebp+8
mov ebx,ebp+12
mov edx,ebp+16
LL: mov eax,esi
div ebx
;call dumpregs
cmp edx,0
jne next
mov eax,esi
call writedec
mov al,9
call writechar
next: inc esi
cmp esi,500
je outt
jmp LL
    
outt: popad
mov esp,ebp
pop ebp
ret 12
evennum endp


main proc

mov edx,offset P
call writestring
call crlf
xor eax
mov ebx,2

push eax
push ebx
push eax
call evennum

exit
main endp
end main
End

لم اجرب البرنامج لكن اتمنى ان تكون الفكره واضحه, هناك شرح فى كتاب Irvine صفحة 278 Explicit Access to Stack Parameters.

بالنسبة لل label LL: لدى إعتراضات على الطريقه ولكن لضيق الوقت سوف ااجلها لما بعد إن شاء الله.

والسلام

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

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

#20

السلام عليكم,

أولا أرجو أن نستعمل المسائل العامة حتى تكون متوفرة عند جميع الأعضاء فكمثال لا أعرف محتوى الملف irvin.inc وإذا كان ممكن وضعه هنا حتى نرى ما فيه. وإذا كنا متفقين أن نستعمل Masm32 فنستعمل ملفاته حتى لا يبقى هذا المشكل مطروح مجددا وحتى لا يأتينا عضو جديد بملفاته الخاصة ونبقى نحن في جمع مختلف الملفات.

ثانيا أود أن أقول لما هذا الداعي للبرمجة بالستاك أو الرجستر علما أن في الماسم خاصية أن نعلن ذلك وعلما أننا في غالب الأحيان نستعمل Stdcall وهذا ضمنيا يستعمل الستاك وقد لا نحتاج أن نأخذ بأنفسنا البارامترات إذ يمكن أن نحصل عليها كما نفعل في البرمجة ب س أو غيرها.

أضن أن هذا التمرين قد نوقش من قبل وقد أعطيت له عدة حلول - ربما إذا تذكرت كانت في 16 بت - لكن الوضع لا يختلف تماما بل الطريقة تبقى نفسها.

وفيما يخص التعامل مع الأشياء الموجودة في الذاكرة كما في مثالك arr dword 500 dup(0) شخصيا أفضل التعامل هنا بالأوامر المتعلقة بالسترينغ مثل stos lods scans .

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

هذه بعض الآراء وإلى اللقاء.

#21

اخوي احمد..

كفيت ووفيت، وكت فعلا متوقعة انه طريقتي خاطئة في استخدام الستاك :)، في انتظار بقية تعليقاتك

اخوي chik

رايك على العين والراس واكيد الكل لازم يعرف البقية عن شنو يتكلمون، بس انه استخدم ذي الطريقة لأنها الوحيدة اللي اعرفها، لا تنسى اني مبتدأة وطالبة وملزمة ببعض الطرق مثل اللي ذكرتها، وليحين ما عندي اي خبرة في الاسمبلي وحتى اني ما اعرف Stdcall !!

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

#22

السلام عليكم

الاخ الحبيب chik كما يبدو لى ان الاخت منسيه جديده على لغة الاسمبلى وبما انها ملزمه بكتاب Irvine , احاول ان اساعدها من هذا النطلق.

إذا اردت الحصول على irvine.inc فستجده هنا .

اقتباس
ثانيا أود أن أقول لما هذا الداعي للبرمجة بالستاك أو الرجستر علما أن في الماسم خاصية أن نعلن ذلك وعلما أننا في غالب الأحيان نستعمل Stdcall وهذا ضمنيا يستعمل الستاك وقد لا نحتاج أن نأخذ بأنفسنا البارامترات إذ يمكن أن نحصل عليها كما نفعل في البرمجة ب س أو غيرها.

نعم صحيح ولكن إذا اردت القيام بعملية debug للبرنامج فلابد من معرفه تامه للستاك و كيفية عمله.

الاخت منسيه اليك بعض الاعتراضات على البرنامج (بس بدون زعل).

arr dword 500 dup(0)

ما فائدة arr ؟

LL: mov eax,esi
div ebx
;call dumpregs
cmp edx,0
jne next
mov eax,esi
call writedec
mov al,9
call writechar
next: inc esi
cmp esi,500
je outt
jmp LL

1. إستخدام esi فى هذه الحاله ليس جيد بل الافضل إستخدام ecx , لان ecx تعمل مع loop كما هو موضح فى البرنامج الذى ارفقته سابقاً.

2. حاولى التقليل من إستخدام div و mul قدر المستطاع, لانها تستغرق وقت طويل, انت لا تلاحظين ذالك الان لان البرنامج صغير, ولكن فى البرامج الضخمه قد يكلف ذالك الكثير من الوقت.

3. نحن نعلم ان الاعدد الزوجيه متسلسله, ونعلم ايضاً قاعدة التسلسل, بمعنى ان كل عدد زوجى إذا اضفنا إليه 2 حصلنا على العدد الذى يليه. لذالك لاداعى لعملية المقارنه .

4. loop counter لابد ان تكون 250 فقط بدلاً من 500, وبذالك نكون قد قللنا عدد ال loop الى ½ , من ما يجعل سرعة البرنامج الى الضعف (بكسر الضاد)

والسلام

تم تعديل هذه المشاركة بواسطة احمد غريب في 7 يونيو 2004 في 20:33

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

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

#23

السلام عليكم

اعتذر عن التأخير (كان يطلع لي ايرور!!) ...المهم

اقتباس
الاخت منسيه اليك بعض الاعتراضات على البرنامج (بس بدون زعل).

افا عليك... خذ راحتك يا خوي ;)

اقتباس
ما فائدة arr ؟

فعلا في ذي الحالة ما بيكون لها دور

<<كانت نايمة وهيه تحل !!

اقتباس
1. إستخدام esi فى هذه الحاله ليس جيد بل الافضل إستخدام ecx , لان ecx تعمل مع loop كما هو موضح فى البرنامج الذى ارفقته سابقاً

استخدمت esi لأنى استخدمت jmp inst. ، ففي هاي الحالة لازم كل مرة اشيك الرقم cmp علشان ما زيد عن الحد المطلوب

ذي النوع من الحل يمكن يكون مفيد اكثر لو كان اليوزر اهوه اللي يدخل الرقم والبرنامج يشيكه لو كان اود اور ايفن

اقتباس
3. نحن نعلم ان الاعدد الزوجيه متسلسله, ونعلم ايضاً قاعدة التسلسل, بمعنى ان كل عدد زوجى إذا اضفنا إليه 2 حصلنا على العدد الذى يليه. لذالك لاداعى لعملية المقارنه .

فعلا اريح واسرع واللوب باستخدام ecx بيكون انسب

اقتباس
4. loop counter لابد ان تكون 250 فقط بدلاً من 500, وبذالك نكون قد قللنا عدد ال loop الى ½ , من ما يجعل سرعة البرنامج الى الضعف (بكسر الضاد)

تعودنه (كطلاب) ما نحاسب لسرعة اشتغال البرنامج وهاي الشئ خطء اكيد

تسلم اخوي على الملاحظات الجميلة والفيدة

تحياتي.... منسيه

#24

السلام عليكم,

أشكرك الأخ أحمد ولكن وصلة الملف لا تشتغل عندي.

حين قصدت stdcall فكان غرضي للمبتدئين لأننا في هذه الحالة لا نهتم مباشرة بالستاك ونترك الكمبايلر يقوم بذلك عوضنا ونهتم نحن بالبرمجة. وطبعا هذه طريقة يمكن أن نستعملها في الأول وبما أنني شخصيا لا أحب الأشياء التي لا أفهمها فلا بد من الرجوع بعد استدراك بعض الأمور إلى هذا النوع من الإستدعاء حتى نتعرف كيف تجري الأمور.

على العموم نشكركم على إفادتنا بهذه المعلومات وإلى اللقاء.

#25

السلام عليكم

تم تعديل الرابط والان يعمل إن شاء الله.

نعم معك حقك, عملية الستاك ممكن ان تؤاجل لكن الظاهر بعض الاخوه مثل الاخت منسيه , مقرر عليهم إستخدام الستك مباشرة , وايضاً كتاب Irvine يركز كثيراً على شرح عمل الستلك, لذالك بادرت بإعطاء المثال.

والله ولى التوفيق

والسلام

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

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

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

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