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

[ تمت الإجابة ]تحويل الخوارزمية الى كود اسمبلي

بدأه aderfiad في 17 أكتوبر 2009 · 11 رد · 2,456 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

من فضلكم شباب لدي تمرين بالمدرسة حول كتابة هده الخوارزمية بالاسمبلي 16 بت


var a,b,x : entier
debut
ecrire (" entrer le premiere chiffre : ")
lire (a)
ecrire ("entrer le deusieme chiffre")
lire (B)

x<--a
a<---b
b<---x
ecrire( "la valeur de premiere chiffre est :" a)
ecrire( "la valeur de deusieme chiffre est :" B)
Fin
Algo Calc

الخوارزمية مفهومة فقط لمن لا يفهم الفرنسية فكل ما في الامر انه لدينا متغيران عدديان يدخل المستخدم عدد في المتغير الاول تم التاني فيقوم البرنامج بعكس القيم :

يضع قيمة المتغير الاول في المتغير التاني تم يضع قيمة المتغير التاني في المتغير الاول ويطبع المتغيران

لقد كتبت الكود بسي بلس بلس


#include <conio.h>

using namespace std;

int main()
{
int a,b,x;

cout << "Entrer le primere chiffre" << endl;
cin >> a;
try {
if(cin.fail())
throw "faute1";
}
catch(...){cout<<"entrer un numero valide"<<endl;
cout <<"click entrer pour quitter....";
getch();
return 0;
}
cout << "Entrer le deusieme chiffre" << endl;
cin >> b;
try {
if(cin.fail())
throw "faute1";
}
catch(...){cout<<"vous avez entré un char"<<endl;
cout <<"click entrer pour quitter....";
getch();
return 0;
}
cout << endl;
x=a;
a=b;
b=x;
cout << "La valeur du primere chiffre est :\t" << a << endl;
cout << "La valeur du deusieme chiffre est :\t" << b << endl;
getch();
return 0;
}
#include <iostream>

لكن بالاسمبلي لم انجح وهده محاولتي



.stack 100

.data
o1 db 0ah,0dh,'chiffre 1:$'
o2 db 0ah,0dh,'chiffre 2:$'

.data ?

num1 db ?
num2 db ?
x db ?

.code
start:

mov ax,@data
mov ds,ax
mov es,ax

lea dx,o1
mov ah,9
int 21h

mov ah,1
int 21h

mov num1,al

lea dx,o2
mov ah,9
int 21h

mov ah,1
int 21h

mov num2,al


mov dx,num1
mov x,dx

mov dx,num2
mov num1,dx

mov dx,x
mov num2,dx


lea dx, num1
mov ah, 9
int 21h

lea dx, num2
mov ah, 9
int 21h

mov ax, 4c00h
int 21h
end start
.model small

يوجد اخطاء عند الترجمة


پأS±سë¸ Hح!rD‹èژہ¹D3ے¾‌َ¤‹×ں3ہ¾‌I|$‹ظè„ü‹—‌+ض&‰‹— - 1256,
Microsoft ® Macro Assembler Version 5.10
Copyright © Microsoft Corp 1981, 1988. All rights reserved.

calc.ASM(10): error A2063: Operand combination illegal
calc.ASM(30): error A2068: Cannot address with segment register
calc.ASM(39): error A2068: Cannot address with segment register
calc.ASM(42): error A2068: Cannot address with segment register
calc.ASM(43): error A2068: Cannot address with segment register
calc.ASM(45): error A2068: Cannot address with segment register
calc.ASM(46): error A2068: Cannot address with segment register
calc.ASM(48): error A2068: Cannot address with segment register
calc.ASM(49): error A2068: Cannot address with segment register

48776 + 446035 Bytes symbol space free

0 Warning Errors
9 Severe Errors

C:\masm>
C:\masm>masm calc;

ارجو مساعدتي شكرا لكم

تم تعديل هذه المشاركة بواسطة aderfiad في 17 أكتوبر 2009 في 08:48

#2

ارجو مساعدتكم شباب

#3

هناك عدة اخطاء بين كتابية يكتشفها المترجم ، واخطاء منطقية بعد ترجمة البرنامج وتشغيله .

الاخطاء الكتابية:

اقتباس
.data ?
اقتباس
الصواب : .data?
اقتباس
mov dx,num1

mov x,dx

mov dx,num2

mov num1,dx

mov dx,x

mov num2,dx

حجم المتغيرات num1 و num2 و x يختلف عن حجم مسجل dx

الاخطاء المنطقية:

في حال نجاح ترجمة الكود السابق سيفشل البرنامج لانك لم تُنهي المتغيرين num1 و num2 باشارة $ عند عرضهم.

هذا الكود لا يتم فيه استخدام وسيط مثل المتغير x ، بل يستخدم التعليمة xchg

عدله بما يناسبك :

.model small

.stack 100

.data
in1 db 0ah,0dh,'input chiffre 1:$'
in2  db 0ah,0dh,'input chiffre 2:$'
out1 db 0ah,0dh,'chiffre 1 is:'
num1 db 00h,24h
out2  db 0ah,0dh,'chiffre 2 is:'
num2 db 00h,24h

.code
start:

mov ax,@data
mov ds,ax
mov es,ax

lea dx,in1
mov ah,9
int 21h

mov ah,1
int 21h

mov num1,al

lea dx,in2
mov ah,9
int 21h

mov ah,1
int 21h

mov num2,al  

mov bl,num1
mov cl,num2
xchg bl,cl
mov num1,bl
mov num2,cl

lea dx, out1
mov ah, 9
int 21h

lea dx, out2
mov ah, 9
int 21h

mov ax, 4c00h
int 21h
end start
#4

بارك الله فيك اخي ساعدتني العديد من المرات جازاك الله خيرا

الكود مفهوم وايضا استفدت من بعض الاخطاء .

فقط امر بسيط ان امكن

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

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

كيف ستكون المقارنة هنا ؟

ايضا السماح بادخال عدد كبير وليس في حدود رقم واحد

تم تعديل هذه المشاركة بواسطة aderfiad في 17 أكتوبر 2009 في 19:22

#5
aderfiad كتب:
كما عملت في سي بلس بلس بخصوص التحقق من ان المستخدم ادخل عدد وليس حرف

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

كيف ستكون المقارنة هنا ؟

الأرقام مجالها بالهكس بين 30h و 39h فأي قيمة خارج هذا المجال يمكنك أن تظهر بناء على إدخالها رسالة.. بما أنك تستخدم المقاطعات فهناك مقاطعة (ولا تسألني عن الأرقام لأني نسيتها :P) تسمح بإدخال محرف واحد في كل دورة تنفيذ وتعيده في AL، يمكنك حينها فحص قيمته.. وهناك مقاطعات تسمح لك بكتابة ما تريد ومن ثم تقرأ من stdin إلى buffer قمت بتحديدها مسبقاً.. هنا سيتم أخذ كل ما كتبته ويتم تخزينه في المخزن يمكنك أن تكتب حلقة تمر على محتوياته وتتأكد من خلوه من محارف سوى الأرقام.

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

اقتباس
ايضا السماح بادخال عدد كبير وليس في حدود رقم واحد

راجع الأمثلة المرفقة مع برنامج Emu8086 فيها ما تريد.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

شكرا لكم شباب حليت المشكل

وضعت هدا الكود للتحقق من الرمز المدخل كما دكر الاخ Xacker

mov ah,al
sub ah,48
cmp ah,9
jg erreur
#7

هناك printable chars على الكيبورد من الممكن إدخالها وقيمتها أقل من 30h

عليك أيضاً أن تتحقق من أن القيمة المدخلة ليست أقل من 30h حتى لا تقع في مشاكل.

بالتوفيق.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

سافعل دالك

شكرا لك اخي .

#9

السلام عليكم

عودا حميدا اخي Xacker

تفاجأت بنشاط المنتدى بشكل غريب :D

اخي aderfiad بالنسبة للمقارنة فهي كما قال Xacker الاعداد بالتمثيل الهكسي لها في ترميز الاسكي محصور بين 30h =< num =< 39h

وخارج هذا المجال لا يعنينا اذا نريد تعليمة تتاكد من ان المُدخل اذا كان اقل من 30 نرفضه:

cmp al,30h
jb  _ErrorNotNumber

لاحظ اني اخترت jump if below لانها Unsigned

وهذا فيما يختص بالاقل من 30h وحتى 00h

اما بما يزيد عن 39h نفس الفكرة السابقة:

cmp al,39h
ja  _ErrorNotNumber

ليصبح كود التحقق من وجود ارقام فقط:

cmp al,30h
jb  _ErrorNotNumber
cmp al,39h
ja  _ErrorNotNumber
Good its number:
.
.
.
.
ErrorNotNumber:
.
.
.

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

هي المقاطعة int 21h , Ah

وانتبه الى بارامترات الدالة

فهي تطلب تحديد Buffer وادخاله في DS:DX

وهذا البفر له تركيبة خاصة :

اي يجب عليك تحديد أقصى عدد يمكن استخدامه في البفر ، وهو اول بارامتر .

كمثال :

.data

MaxKeyBuf db 0feh ; [in] maximum characters could be written 
CharsWritten db 00h ; [out] return the number of characters written by user
KeyBuffer db 255 dup (?) ; [out] hold characters 


.code
lea dx,MaxKeyBuf
mov ah,0ah
int 21h

تم تعديل هذه المشاركة بواسطة AND في 25 أكتوبر 2009 في 22:02

#10

شرحك جميل اخي

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

شكرا لك ^^

#11

اي طريقة تقصد لا يوجد سوى كود واحد وهو الذي تم جمع الجزء الاول باستبعاد ما يقل عن 30h مضافا اليه الجزء الثاني ما فوق 39h ؟!

#12

اقصد طريقة التي دكرتها ( المقارنة )

تم تعديل هذه المشاركة بواسطة aderfiad في 26 أكتوبر 2009 في 02:45

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