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

كيفية طباعة الأعداد الثنائية؟

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

لدي مشكلة فبرنامجي يطلب من المستخدم أدخال رقم بي hexdicmal والمطلوب طباعة

العدد بي binary ولكن عندما أصل الي فكرة الطباعة يطبع لي ascii

وهذا كود البرنامج :

XOR BX,BX
MOV CL,4
MOV AH,1
INT 21H
WHILE:
CMP AL,0DH
JE END_WHILE
CMP AL,39H
JG LETTER
AND AL,0FH
JMP SHIFT
LETTER:
SUB AL,37H
SHIFT:
SHL BX,CL
OR BL,AL
INT 21H
JMP WHILE
END_WHILE:

فأرجو من لدية فكرة مساعدتي .........

#2

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

الأخت المشاكسة : يبدو في أول نظرة أن البرنامج لا يلزمه الكثير ليقوم بعمله. سأرى بالتدقيق هدا المساء ويجب أن نجرب البرنامج لأنه قد تفلت عنا بعض الأشياء في الكتابة ولا نراها إلا عند التشغيل ولأنه ليست لدي هنا أدوات البرمجة وأتمنى أن أرد عليك ابتداءا من الغد إن شاء الله

إلى اللقاء.

#3

السلام عليكم

هنالك بعض الاستفسارات التي بحاجة الى توضيح

-الاول: كيف يتعامل البرنامج اذا ادخل المستعمل قيمة غير قانونية مثل ادخال K فهذا الرمز ليس من ضمن الرموز المسموح بها

-الثاني: هل المقصود برقم هنا ان القيم المدخلة تتكون فقط من منزلة واحدة

-الثالث: ما هي الاوامر المسموح باستعمالها

-الرابع : ما المقصود بطباعة الرقم بشكل ثنائي. هل المقصود مثلا يدخل المستعمل الرمز 9 ويطبع البرنامج 00001001 ام يطبع فقط 1001 او ماذا

-الخامس:هل تريد طباعة الرمز المدخل ايضا

-السادس:هل تريد فقط اجراء تعديلات على برنامجك للوصول للحل ام يمكن تغيير البرنامج

ارجو توضيح الاستفسارات عندها يمكن تقديم المساعدة وشكرا

#4

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

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

أكبر من F سوف يخبرة أن القيمة غير مسموح بها .......

ثانيا:القمية المدخلة ممكن أن تكون من قيمة واحدة إلي أربعةقيم بي hexdicmal

ثالثا:المقصود مثلا يدخل المستخدم الرمز 9 و يطبع البرنامج 1001

رابعا :لا أريد طباعة الرمز المدخل

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

#5

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

الأخت المشاكسة :

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

يقوم برنامجك بالأمر AND AL,0FH ولكن إدا أدخلنا حرفا لا يقوم بهدا الأمر وهدا قد يعطينا خطء في قيمة العدد فمثلا لو أدخلنا القيمة A سيكون عندنا في BX في النهاية 2A أو غير لأننا لم نقم ب AND AL,0FH حتى نمسح ما يكون على يسار A أو أي حرف آخر.ولهدا فيما يخص الشطر الأول من البرنامج , أي ادخال الرقم , فقد أخدت الكود الدي كتبتيه مع بعض التحويلات البسيطة لإزالة بعض التكرار في الكتابة ولإصلاح الخطئ الأول. وأنا أيضا لم أرد أن أتأكد إن كان الرقم الدي يدخله المستعمل رقم حقا أي أن الحروف يجب أن تكون بين A و F وكدلك لم أتأكد من عدد الأرقام المدخولة أن تكون أربعة Digits فهدا يمكن زيادته بسهولة وقد تركته هكدا حتى نركز على ما هو أهم وحتى لا نتخبط داخل كود كبير.

فيما يخص الشطر الثاني, أي تحويل الرقم من هيكس إلى بايناري فقد قمت بالطريقة التالية:

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

ولمشاهدة البتات في BX يمكن أن نستعمل عدة طرق لدلك إما أن نشاهد البت الأيسر بالقيام بأمر and BX,8000h ونقوم بعد دلك بدورة BX يسارا ونعاود الأمر حتى نمر على البتات 16 كلها أو ما يشبه هده التقنيات. وفي هدا المثال اخترت الطريقة التي تبدو لي سهلة حسب رأيي وهي استعمال الأمر BT او ما تعرف ب Bit Test واستعملتها كما يلي

BT BX,DX وهده سترى البت في BX والدي رقمه موجود في DX وهكدا إدا غيرنا DX من 15 إلى 0 سنكون قد مررنا عبر كل أبيات BX .ويجب أن نعلم أن هدا الأمر BT فهو موجود ابتداء من البروسسورات 386 وما فوق وبما أن اليوم جل الناس يستعملون بروسسورات أكبر من هدا فالبرنامج سيشتغل غند الجميع.

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

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

في الملف المرفق تجدون الكود الكامل مع البرنامج للتجربة. البرنامج كتب للكمبايلر Masm5 وما فوق.

أتمنى التوفيق للجميع وإلى اللقاء.

HexToBin.zip

#6

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

في الحقيقة لم أفهم من البرنامج الكثير لأنه هناك أوامر لم أدرسها بعد ......

ولقد فكرة سابقا بفكرة ROL ولكن الفكرة لم تنجح معي .......

فأرجو أيضاح فكرة ROL أكثر لكي أستطيع التحويل بها ....

ولكم الشكر الجزيل........

#7

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

على ما أضن أن الأوامر التي يمكن أن تكوني لم تعرفينها بعد هي : stosb أو BT . فالأولى قد نستغنى عنها في برنامجنا أو نغيرها بمثيلها mov [di],al والثانية كما قلت من قبل هي تقرأ كل بت على حدة .

وإدا أردت يمكن أن نغير البرنامج شيئا بسيطا لنستعمل ROL والطريقة قد تكون كما يلي :

- نعلم أن ROL تدفع البتات إلى اليسار فمثلا لو نقوم بما ROL BX,count فهدا سيدفه البتات يسارا عددا من المرات يساوي عدد count وهنا أيضا نعلم أن CarryFlag يحتوي على آخر قيمة بت دفعت يسارا . والبرمجة تكون على النحو التالي :

mov al,31h

ROL BX,1

JC Continue

mov al,30h

ونفسر هدا كما يلي :

- نضع في al كود أسكي للعدد 1

- ندفح قيمة العدد يسارا مرة واحدة وهدا سيجعلنا نتعرف على البت 15

- إدا كان Carry وهو قيمة هدا البت هي 1 لا نفعل شيئا لأنه عندنا مسبقا قيمة al فيها النتيجة وفي الحالة الأخرى نغير هده القيمة إلى 0 .

نستعمل هدا 16 مرة حتى نمر على جميع أبيات قيمتنا.

ونلاحظ هنا أن التقنية هي كالسابقة بل نغير فقط استعمال الأوامر.

أتمنى أن يفيد هدا وإلى اللقاء.

#8

السلام عليكم

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

اقترح عليك الحل التالي بالنسبة للطباعة

فكرة الحل هي ان تعمل ازاحة واحدة يسارا حتى نحصل على البت المطلوبة في راية CF وبعدها نسأل اذا كانت القيمة في هذه الراية 1 نطبع القيمة 1 والا نطبع القيمة صفر هذا المقطع يدور 16 دورة بقدر عدد البتات في المسجل المطلوب. ملاحظة يمكن تغيير الامر shl بالامر rol اذا اردنا المحافظة على قيمة المسجل وعدم تغييرها او انقل الفحوى الى مسجل اخر واستعمل shl . ملاحظة القيمة في المسجل CL هي 16 في الميزان العشري

نفرض ان العدد الذي تريد طباعته موجودا في المسجل AX عليك عمل ما يلي

mov bx,ax

mov CL,16

next_digit:cmp CL,0

jz finish

shl bx,1

jc set_1

mov dl,0

jmp print_digit

set_1:mov dl,1

print_digit:add dl,30h

mov ah,2

int 21h

dec CL

jmp next_digit

finish:mov ah,4ch

int 21h

ارجو ان اكون قد قدمت المساعدة لك

#9

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

شكرا لك chick فلقد أفدتني أفادة كبيرة وأوضحت لي بعض الأمور التي كنت أجهلها ....

وشكرا لكafeef فلقد ساعدتني وأنقذت برنامجي بي الcode .....

ولكن هل ممكن أفادتي بجواب لسؤالي ؟؟؟؟؟؟؟؟؟؟؟؟

فلدي برنامج آخر يطلب أدخال أرقام ثنائية ويحولها لي hex وممكن أن يدخل 16bit أو أقل

ولكن عند أدخالي لي 4 أرقام فقد يحولها لي hex ولكن عند أدخالي لي أكبر من ذلك فأنه

يخرج لي ascii ولا أعلم ماهي المشكلة في البرنامج.....

.MODEL SMALL
.STACK 100H
.DATA

TEXT1 DB 'TYPE A BINARY NUMBER , UP TO 16 DIGITS : $'
TEXT2 DB 0DH,0AH,'IN HEX IT IS $'


.CODE
MAIN  PROC
MOV AX,@DATA
MOV DS,AX
XOR BX,BX
MOV CL,4
MOV AH,9
LEA DX,TEXT1
INT 21H
MOV AH,1
INT 21H
WHILE:
CMP AL,0DH
JE END_WHILE
AND AL,0FH
SHL BX,1
OR BL,AL
INT 21H
JMP WHILE
END_WHILE:
MOV AH,9
LEA DX,TEXT2
INT 21H
CMP BL,10
JL NUM
JG LETER
NUM:
ADD BL,30H
JMP DIS:
LETER:
ADD BL,37H
JMP DIS
DIS:
MOV AH,2
MOV DL,BL
INT 21H

MOV AH,4CH
INT 21H
MAIN ENDP
     END MAIN

ولقد حاولت أن أستخدم الأمر ROR ولكنه لم ينجح

فهل يمكن مساعدتي؟؟؟؟

#10

السلام عليكم

الواضح ان هنالك العديد من الاخطاء في البرنامج نذكر منها مثلا

jmp dis:

النقاط هنازيادة

المهم ما يلي:

هل اتمكن من المساعدة ارجو توضيح ما يلي:

-ما هو رد البرنامج في حالة ادخال رمز غير مسموح به مثلا 6 في الميزان الثنائي هذا الرمز غير موجود

-اذا ادخل المستعمل اكثر من 16 رمزا حسب برنامجك يستقبل حتى الضغط على enter

فما هي الرموز التي تريدها . اليس من الافضل ان ينتقل البرنامج الى مرحلة الطباعة عند الضغط على enter او استقبال 16 رمزا. اي يكفي ان يتحقق شرطا واحدا على الاقل

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

الان يجب ان اذهب الى عملي. ولكن قبل الذهاب ارجو ان تقوم بالعمليات التالية:

-عليك كتابة مقطع مصفاة. بحيث يسمح باستقبال الرموز (1 ، 0) فقط. في حالة ادخال رموز غير صحيحة تظهر على الشاشة جملة مناسبة ويسمح له بادخال رمز اخر

-عليك اضافة الرمز الصحيح بعد تحويله الى الرقم العشري الى مسجل 16 بت بمساعد

sub al,30h

shl bx,1

add bx,al

-عليك تطوير المهمة السابقة بحيث يخرج البرنامج من مرحلة الاستقبال الى مرحلة الطباعة في حالة تم ادخال 16 رمزا او ضغط المستعمل على enter

-عرف في مقطع البيانات متغير من نوع مصفوفة او نص بالشكل التالي:

digit db '123456789ABCDEF'

-عند الوصول الى مرحلة الطباعة: كل ما عليك ان تعمله هو ان تأخذ كل اربع بتات مع بعضها البعض من المسجل bx وان تضعها مثلا في المسجل si. ملاحظة ابدأ من جهة اليسار لان الطباعة سوف تكون ابتداء من المنزلة الكبيرة

-افعل ما يلي:

mov dl,digit[si ]

mov ah,2

int 21h

نفذ المقطع السابق 4 مرات لطباعة اربع منازل بالميزان السادس عشر. تذكر انه عليك الانتقال الى الاربع بتات التالية في bx

اذا لم تنجح العمليات سوف اقدم لك المساعدة في الحل بعد رجوعي من العلم الساعة السادسة مساء

وشكرا

#11

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

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

سأحاول النظر في برنامجك وسأحاول الرد عليك بعد الغد لأن غدا عندي بعض الأشغال.

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

0101101010011101

فلو نقسمه إلى مجموعات تتكون من 4 مثل

1101 1001 1010 0101

فالمجموعة الأولى 1101 هي تساوي D في نظام الهكس

المجموعة الثانية 1001 هي تساوي 9

المجموعة الثالثة 1010 هي تساوي A

والمجموعة الرابعة 0101 هي تساوي 5

فالعدد الهكس للمجموع سيكون بوضع هذه المحاصيل واحدا جنب الآخر والنتيجة تكون هي :

5A9D

فيمكن أن نعتمد إذن على هذه الطريقة للتحويل.

أتمنى لك التوفيق في برنامجك وإلى اللقاء.

#12

السلام عليك

اني ابعث لك الحل ملف وورد مرفق معه الحل في حالة استفساراة الرجاء تسجيل الاستفسار لم اشرح الحل لانه بسيط جدا ويظهر من حلولك انه لديك المعلومات الكافية

لفهم الحل:

test1.asm

تم تعديل هذه المشاركة بواسطة afeef في 8 مايو 2004 في 16:25

#13

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

أشكرك علي الحل ولكن هناك بعض الاستفسارات البسيطة هي بعض الأوامر الموجودة

في البرنامج والتي لم أعرف ماهو عملها ......

فالأمر (ja ) ماهو عملة وهل هناك أمر آخر له نفس العمل (يقابلة) ؟

والآمر (adc ) ماهو عملة وهل يمكن أستبداله بأمر آخر؟؟؟؟؟

و( si )هل يمكن أستبدالة؟؟؟؟

وأعتذر عن التعب الذي سببته لكم ....

#14

السلام عليكم

بالنسبة للامر ja تستعمل بعد امر المقارنة cmp

مثال:

cmp op1,op2

ja t1

يتم القفز هنا اذا كان op1>op2

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

[80h..ffh]

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

يمكن تبديلها في الشكل التالي

CMP AL ,1

jg t1

CMP AL,0

JL T1

بالنسبة للامر ADC يقوم باضافة المصدر للهدف ويضيف للهدف ايضا قيمة راية CF التي كانت قبل اجراء عملية ADC

يمكن استبداله بالاوامر التالية

مثال:

ADC AL,BL

يمكن استبدالها في

JC T2

T2:ADD AL,BL

ADD AL,1

JMP T4

T3:ADD AL,BL

T4:

بالنسبة للمسجل SI يمكن استبداله بالمسجل DI او المسجل BX

ملاحظة: لقد تطرقت في الدروس السابقة الى هذه الامور الرجاء قراءة الدروس

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

تم تعديل هذه المشاركة بواسطة afeef في 9 مايو 2004 في 20:30

#15

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

الأخت المشاكسة : كنت كتبت برنامجا وهنا أرى أن الأخ AFEEF قد قام باللازم ونشكره على مجهوداته.

على العموم سأعطي البرنامج في الملف المرفق .

أتمنى لك التوفيق وإلى اللقاء.

BinToHex.zip

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

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