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

ارجو التصحيح

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


           .MODEL SMALL
.STACK
.DATA
X DB 1,2,3,4,5,6,7,8
SUM DB 0
.CODE
.STARTUP
MOV SI,0
MOV CX,8
AA:
MOV A,[X]

ADD SUM,AX
ADD SI,2
LOOP AA
MOV AH,2
MOV DL,SUM
INT 21H
.EXIT
END

هو برنامج يربد جمع 8 ارقام و الوسط الحسابي و ارجو شرح كيف اظهر الناتج بوسطة int 21h و لكن اكثر من رقم مثال 8+10=18 كيف اظهر الرقن 18 بوسطة int 21 h

وشكرا

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#2

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

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#3

السلام عليكم

البرنامج فيه خطئين وهما:

1. add SI,2
2. mov A,[x]

الحل

TITLE	IntArray 
	.MODEL  Large 
	.STACK  200h 
	.DATA
	mess	db	'The total is ','$'
	result  dw  ?
	IntArry	dw	10, 34, 76, 25, 14, 9, 3, 22
	IntAlen	dw	($ - IntArry) / 2
	buff  db  6
	dup( 20h )  db '$' 

	.CODE

	binasc  proc	far 	 ; convert result to ascii string 
  mov  ax, 0 
  mov  ax, [result]	; get number to convert 
  push  ax 	 ; save it 
  mov  si, offset buff[5]; point to string area 
  mov  cx, 10 	 ; divide base factor 
  shl  ax, 1 	 ; clear sign bit 
  shr  ax, 1
	do1:  cmp  ax, 10 	 ; compare with base fact 
  jb  exit1 
  mov  dx, 0 	 ; clear upper numerator 
  div  cx 	 ; divide by base factor 
  add  dl, 30h  ; convert to ASCII 
  mov  [si], dl  ; and store it 
  dec  si 	 ; next character 
  jmp  do1
	exit1:	add  al, 30h  ; convert last character 
  mov  [si], al  ; and store it 
  pop  ax 	 ; recover 
  or  ax, ax 	 ; and test for sign bit 
  jns	exit2
  dec  si 	 ; store '-' sign
  mov  bl, 2dh 
  mov  [si], bl
	exit2:	ret
	binasc	endp

	start:	mov	ax, @data
  mov	ds, ax 
  mov  [result], 0000h	; clear result 
  mov  cx, IntAlen	; count of elements 
  mov  bx, offset IntArry ; point to IntArry
  mov  si, 0000h  ; first element 
  xor  ax, ax 	 ; clear total
	lp1:	add	ax, [bx + si]  ; add value to total 
  inc  si 	 ; next element 
  inc  si
  dec  cx 
  jne  lp1 
  mov  [result], ax  ; store total 
  mov  dx, offset mess	; print message 
  mov  ah, 9h 
  int  21h 
  call  binasc 	 ; convert result to ASCII 
  mov  dx, offset buff 
  mov  ah, 9h 
  int  21h 
  mov  ax, 4c00h	; exit to DOS 
  int  21h 
  END  start

للامانه منقول

إذا إستعصى عليك فهمه سنحاول انا و الاخوه بعون الله ان نعينك, البرنامج ليس صعب ولكن يحتاج الى قليل من التركيز.

والسلام

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

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

#4

ارجو شرح كيف اظهر الناتج بوسطة int 21h

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#5

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

نعرف أن المقاطعة 21 مع الدالة ah=9 تظهر الجملة أو الكتابة الموجودة في الذاكرة DS:DX ولهذا إذا كان عندنا عددا ما فالطريقة لإظهاره يمكن أن تكون كالتالي:

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

- نجعل الرجسترات DS و DX تشير إلى مكان هذه الذاكرة ونستدعي الدالة 9 مع المقاطعة 21 .

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

كمثال نفترض أنه عندنا الرقم 26548 =x عشاري ونريد أن نحوله إلى مقابله في الأسكي حتى يتم إظهاره. فسنقوم بما يلي :

نقسم الرقم x على 10 قسمة وستعطينا النتيجة y=2654 نظرب مرة أخرى y*10 وستكون النتيجة 26540 وإذا قمنا ب x-y ستكون سنكون قد استفردنا بالرقم الأول يعني هنا 8 وهنا تسهل الأمور علينا لتحويله إلى الأسكي المناسب له وذلك بزيادة الرقم 30 هكس له ونقوم بحفظ النتيجة 38 هكس في مكان في الذاكرة نسميه مثلا Mem .

ولمعرفة الرقم الثاني يعني في مثالنا 4 نقوم بالضبط كما سبق ولكن سنحول الرقم x الذي كان في الأول يساوي 26548 إلى قيمة y التي تساوي 2654 وحين نقسم على 10 سيصبح عندنا y الجديد يساوي 265 وإذا ضربناه في 10 وأنقصناه من الرقم السابق سنحصل على القيمة 4 نزيد لها الرقم 30 هكس لنحولها إلى أسكي وستصبح قيمتها 34 هكس ونحتفض بها في المكان Mem-1 ونعاود الكر من جديد حتى نمر على جميع مكونات العدد.

هذه من بين الطرق والتي أضن أنها السهلة للفهم لأنها تقوم فقط على حسابات رياضية بسيطة.

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

أتمنى أن تكون قد اتضحت بعض الأمور وإلى اللقاء.

#6

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

اشكر الأخ chik و احمد غريب

ولكن اريد فكره معينه و اريد برنامج يجمع مثال 35+10=45 عندي خطأ في الفهم و اكرر شكري لللأخ chik و احمد غريب , و الله يعطيكم الصحه و العافيه

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#7

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

لو توضح بالتفصيل ما هو الخطأ في الفهم اللي عندك.

فلجمع كما ذكرت 35 + 10 يمكن أن نقوم كالتالي :

mov ax,35

mov bx,10

add ax,bx

هذا كمثال وهنا سيكون عندنا الجمع 45 في الرجستر ax ومن بعد يجب تحويل هذا الرقم إلى جملة حتى يتم طبعها على الشاشة وكما قلت سابقا نقسم 45 على 10 والنتيجة هي 4 نضرب 4 في 10 تساوي 40 وننقصها من العدد الأول أي ستعطينا 5 وهذا هو الرق الأول المكون لنتيجتنا والذي يكون على اليمين.

تبقى لنا من بعد 4 نقسمها مرة أخرى على 10 ستساوي 0 . نضربها في 10 تساوي 0 أيضا وننقسها من العدد السابق أي 4 وستعطينا 4 وهذا هو الرقم الثاني ابتداءا من اليمين. وهذه الطريقة ستقسم لنا العدد الذي نريده إلى الأرقام المكونة له في النظام العشاري ومن تم تسهل تحويل العدد إلى مثيله بجملة وذلك أننا نعرف أن أي رقم من 0 إلى 9 يكون مثيله في الأسكي هو أن نزيد له العدد 30 هكس وهنا أضن أن الأمر واضح.

إلى اللقاء.

#8

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

اول حاجه اريد اتعلم كيف اتعامل مع ال array بكل احتيجاته مثال كيف اخزن و كيف استرجع مثال برنامج يحجز 8 array نجيب الجمع و الوسط الحسابي كيف اخزن و تاعمليات كلها و ال si كيف يعمل و انا حولت و لكن فشلت لهذا اود ان اعرف كل شي عن ال array و شكرا لللأخ chik علي المساعده

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#9

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

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

أتمنى أن لا أنسى هذه المهمة علما أنه تدور برأسي أشياءا أخرى.

إلى اللقاء.

#10

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

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

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

ليس لدي الآن الوقت الكافي لأعطي كل التفاصيل عنهم. سأعطي الملفات هكذا وإذا كان فيه أي استفسار سأكون إن شاء الله جاهزا لإعطاء أي تفاصيل.

الملف المرفق يحتوي على الملفات التالية :

-TheMac.inc ملف يحتوي على الماكرويات

-Test.asm ملف يشغل الماكرويات

Test.exe ملف مثال لما سبق

Files.zip

#11
     




.model tiny
.stack
.data
x dw 1,2,3
sum dw 0
avg dw 0
.code
.startup
mov si,0
mov cx,3
tanna:

mov ax,[x+si]
add sum,ax
add si,2

loop tanna

mov ax,sum
mov cl,3
div cl
mov ah,2
mov dl,al
add dl,30h
int 21h

i want to know whats wrong in this program eng: chik and really thanks to u

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#12

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

المشكل الأول الذي يبدو على أول وهلة وهو السطر

mov ax,[x+si]

هذا ليس له معنى هنا ف x من المفترض أن تشير إلى عنوان الذاكرة التي تضع فيه الأرقام 1 , 2, 3 . هذا من جهة ومن جهة أخرى يجب أن نعلم أنه وحسب نوع الكمبايلر اللي عندك أننا لا يمكننا كتابة mov ax,[x+si] ففي أغلب الأحيان si تتمشى مع bx حين نريد indexation وحسب ما عندك لا تحتاج إلى Indexation .

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

X dw 1,2,3

فإن هذه المعطيات ستكتب في مكان ما في الذاكرة أي تحت سكمنت وأفست قد يخولها له نظام التشغيل. وحين نشغل برنامجنا فإن السكمنت DS لا يشير بالضرورة إلى نفس السكمنت الذي توجد به معطياتنا وحين نكتب مجرد mov ax,[si] وحتى إذا ما كنا قد أعطينا ل si الأوفسيت الصحيح فسوف لن نعثر على معطياتنا لأننا لا نتواجد في نفس السكمنت.

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

إلى اللقاء .

#13

السلام عليكم

ان المشكلة في البرنامج هي طريقة التعريف والكتابة

انك تعرف البرنامج من نوع tiny اي ان البرنامج يتكون من مقطع واحد ويضم جميع المقاطع ومن جهة اخرى تعرف له مقطع البيانات data ومقطع code ومقطع stack

المشكلة الثانية هي startup. الصحيح هو :startup

الحل النهائي هو

model tiny.

code.

org 100h

:startup

mov si,0

mov cx,3

:tanna

mov ax,[x+si] 

add sum,ax

add si,2

loop tanna

mov ax,sum

mov cl,3

div cl

mov ah,2

mov dl,al

add dl,30h

int 21h

mov ah,4ch

int 21h

x dw 10,2,8

sum dw 0

avg dw 0

end startup

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

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