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

طرح رقمين عن طريق الاسمبلي

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

بسم الله الرحمن الرحيم

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

بما اني مبتدئة في لغة الأسمبلي طُلب منّي :

اقتباس
Write a program which reads two digits such that second digit is

less than the first digit, computes and display their difference ( using Variables ).

لا اريد ان اطيل عليكم المطلوب هو معرفة الغلط الغريب في برنامجي هذا :

وهو عند إدخالي للأرقام وطرحها تظهر لي علامة $ هناك مشكلة في طرح الأرقام او اسماء الرجستر التي قمت بتخزين الارقام بها !!!

.MODEL SMALL
.STACK 100H
.DATA

MSG1 DB 'ENTER FIRST DIGIT:$'
MSG2 DB 'ENTER SECOND DIGIT:$'
MSG3 DB 'DIFFERENCE OF TWO DIGITS IS:$'

.CODE

MAIN PROC

;INTILAIZE DS
MOV AX,@DATA
MOV DS,AX

;DISPLAY MSG1

LEA DX,MSG1;GET MSG1
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG1

;READ  DIGIT

MOV AH,1;READ DIGIT1
mov BH,AL	
INT 21h	

;new line
MOV AH,2
MOV DL,0DH
INT 21H

MOV DL,0AH
INT 21H


;DISPLAY MSG2

LEA DX,MSG2;GET MSG2
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG2

;READ  DIGIT2

MOV AH,1;READ DIGIT2
mov BL,AL	
INT 21h	


;new line
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H




LEA DX,MSG3;GET MSG3
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG3

sub BH,BL
mov AH,2
mov DL,AL
INT 21h	



MOV AH,4CH
INT 21H


MAIN ENDP

	END MAIN

0004d0b59e19461ff126e3a08a814c33.jpg

عملت كود آخر , لكن الغلط فيه انه لا يُظهر لي نتيجة الطرح !

.MODEL SMALL
.STACK 100H
.DATA

MSG1 DB 'ENTER FIRST DIGIT:$'
MSG2 DB 'ENTER SECOND DIGIT:$'
MSG3 DB 'DIFFERENCE OF TWO DIGITS IS:$'
.CODE

MAIN PROC

;INTILAIZE DS
MOV AX,@DATA
MOV DS,AX

;DISPLAY MSG1

LEA DX,MSG1;GET MSG1
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG1

;READ  DIGIT

MOV AH,1;READ DIGIT1
INT 21h	
MOV BH,AL

MOV AH,2
MOV DL,0DH
INT 21H

MOV DL,0AH
INT 21H

;DISPLAY MSG2

LEA DX,MSG2;GET MSG2
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG2

;READ  DIGIT2

MOV AH,1;READ DIGIT2
INT 21h	
MOV BL,al


MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H


MOV AH,2
SUB BH,BL
MOV CX,Ax


LEA DX,MSG3;GET MSG3
MOV AH,9;DISPLAY STRING
INT 21H;DISPLAY MSG3

MOV AH,2
MOV DX,CX	
INT 21h	

MOV AH,4CH
INT 21H



MAIN ENDP

	END MAIN

تم تعديل هذه المشاركة بواسطة Computeryah في 30 نوفمبر 2006 في 18:07

#2

لأنك قاعد تطرح char مو ارقام :)

'1'-'0'=1

'2'-'0'=2

#3

حطيت هالاحتمال !

بس كيف بحول القيم للأسكي كود ؟

لازم احاول واشوف النتيجة ...

شكرا ...

:)

#4

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

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

حيث انه الـ interupt 21h مع الـ service 2 تاخذ القيمة من المستخدم وتخزنها في الـ AL Register

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

لازم بعد ما تاخذي الرقم من المستخدم تحوليه من ascii character to decimal حسب الجدول

إن شاء الله تكون وضحت الفكرة

غير متأكد

إطرحي من القيمة 30h وجربي

الكود الأول ارسليه لسلة المحذوفات

ENG-GAZA.GIF
#5

Eng_Gaza

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

:)

#6
اقتباس
إطرحي من القيمة 30h وجربي

اي قيمة بالضبط ؟!

#7
.MODEL SMALL
.STACK 100H
.DATA

MSG1 DB 'ENTER FIRST DIGIT:$'
MSG2 DB 'ENTER SECOND DIGIT:$'
MSG3 DB 'DIFFERENCE OF TWO DIGITS IS:$'
.CODE

MAIN PROC


MOV AX,@DATA;INTILAIZE DS
MOV DS,AX

;DISPLAY MSG1

LEA DX,MSG1 ;GET MSG1
MOV AH,9	;DISPLAY STRING
INT 21H	;DISPLAY MSG1


;READ  DIGIT

MOV AH,1	;READ DIGIT1
INT 21h
SUB AL, 30H   ;convert the ascii code to decimal
MOV BL,AL			   		




MOV AH,2		; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH; line feed
INT 21H


;DISPLAY MSG2

LEA DX,MSG2 ;GET MSG2
MOV AH,9	;DISPLAY STRING
INT 21H	;DISPLAY MSG2

;READ  DIGIT2

MOV AH,1	;READ DIGIT2
INT 21h
SUB AL, 30H			 ;convert the ascii code to decimal	



MOV AH,2	; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH	; line feed
INT 21H


SUB AL,BL
SUB AL, 30H



LEA DX,MSG3 ;GET MSG3
MOV AH,9	;DISPLAY STRING
INT 21H	;DISPLAY MSG3



MOV AH,2
MOV DH,AL	
INT 21h	



MOV AH,4CH; return control to DOS
INT 21H



MAIN ENDP

	END MAIN

لكن ما تظهر لي نتيجة الطرح لما ادخل مثلا 5 و 3 يطلع الناتج 5 او ادخل 3 و 5 يطلع الناتج 5 !

اقتباس
إطرحي من القيمة 30h وجربي

ليه طرحنا من 30h بالذات ؟! ما نقدر نختار غيرها ؟!

#8

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

لاحظي التعليق

;READ  DIGIT

MOV AH,1	
INT 21h ; al = Digit + 30h   >>> This is ascii code
SUB AL, 30H  ;Now  al = digit
MOV BL,AL  ;  store  digit in  bl

MOV AH,1	
INT 21h
SUB AL, 30H	 
mov bh,al

يجب تخزين الرقم الثاني أيضا في ريجيستر لأنه الـ interupt 21h مع الـ service 2h بتغير قيمة الريجيستر AL

بياخد القيمة من الريجيستر dl ويطبعها وينقلها الى al

وكذلك الـ interupt 21h مع الـ service 9h , ,هذه نقطة مهمة جدا فعليكي الانتباه لها وانتي بتكتبي الكود . . .

____________________________

الأن على فرض المستخدم دخل القيمة الأولى 5 دخلت على الريجيستر 35 , طرحنا منها 30

القيمة الثانية فرضا 1 دخلت على الريجيستر 31 , طرحنا منها 30 ايضا

نطرح القيمتين من بعض يعني 5 - 1 = 4 وهي القيمة الفعلية للريجيستر bh

نضيف عليها الـ 30 وبالتالي رجعت لقيمتها بالآسكي >>> 34

sub bh,BL
add bh, 30H

MOV AH,2
MOV Dl,bh	
INT 21h

وانتهينا الحمد لله (h)

Final Solution:

.MODEL SMALL
.STACK 100H
.DATA

MSG1 DB 'ENTER FIRST DIGIT:$'
MSG2 DB 'ENTER SECOND DIGIT:$'
MSG3 DB 'DIFFERENCE OF TWO DIGITS IS:$'
.CODE




MOV AX,@DATA;INTILAIZE DS
MOV DS,AX

;DISPLAY MSG1

LEA DX,MSG1;GET MSG1
MOV AH,9   ;DISPLAY STRING
INT 21H   ;DISPLAY MSG1


;READ  DIGIT

MOV AH,1   ;READ DIGIT1
INT 21h
SUB AL, 30H  ;convert the ascii code to decimal
MOV BL,AL					   




MOV AH,2	   ; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH; line feed
INT 21H


;DISPLAY MSG2

LEA DX,MSG2;GET MSG2
MOV AH,9   ;DISPLAY STRING
INT 21H   ;DISPLAY MSG2

;READ  DIGIT2

MOV AH,1   ;READ DIGIT2
INT 21h
SUB AL, 30H			;convert the ascii code to decimal	
mov bh,al


MOV AH,2   ; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH   ; line feed
INT 21H


LEA DX,MSG3;GET MSG3
MOV AH,9   ;DISPLAY STRING
INT 21H   ;DISPLAY MSG3


sub bh,BL
add bh, 30H

MOV AH,2
MOV Dl,bh	
INT 21h	



MOV AH,4CH; return control to DOS
INT 21H
END

على فكرة أنا مبتدأ مثلك

ومطلوب مني السؤال

c)	Write an assembly language program to get two hexa digits and print its summation.

إن شاء الله برفق الكود لو انتهيت منه لأنه هذا البرنامج طالب جمع عددين من نوع hexa وليس decimal

asciitable.GIF

ENG-GAZA.GIF
#9

لم انتبه الى هذه :^)

اقتباس
such that second digit is

less than the first digit

البرنامج أعلاه بالعكس والتعديل سهل -_-

ENG-GAZA.GIF
#10

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

a0046ad4c1bafc4ef04e41e755f28368.jpg

ربي يسلمك يارب .. :)

سؤال : إذا كنت جربت تدخل قيمة على نفس الكود اللي كتبته انت يطلع الناتج معك "نقطة" ؟ ليه ؟!

و ما جاوبتني ليه اخترنا 30h ؟

Eng_Gaza

شكراً , وجزاك الله كل خير ..

واسال الله ان يسهل عليك حل المطلوب منك : )

شبية ببرنامجنا صح ؟ الفرق طريقة الجمع , وللتحويلات أي قيمة ستكون بدل 30h ؟

#11
سؤال : إذا كنت جربت تدخل قيمة على نفس الكود اللي كتبته انت يطلع الناتج معك "نقطة" ؟ ليه ؟!

مافهمت سؤالك

----------------------

و ما جاوبتني ليه اخترنا 30h ؟

النقطة الأولى : لما اليوزر يدخل أرقام ع البرنامج بتتمثل في الريجيسترات بالآسكي كود .

النقطة الثانية : عملية الطرح اللي يقوم فيها البرنامج تكون بطرح قيم الريجيسترات من بعضها .

لو إستعملت القيم اللي بالريجيسترات كما هي فأنا أقوم بطرح آسكي من بعض وليس hexa numbers .

في جدول الآسكي كود , كل آسكي كود يمثل عدد بالهيكسا

asciitable.GIF

الرقم >>>> قيمته بالآسكي

0>>>>>>>>30

1>>>>>>>>31

2>>>>>>>>32

3>>>>>>>>33

4>>>>>>>>34

5>>>>>>>>35

.....

...

وهكذا

وبالتالي بطرح من كل قيمة ( ريجيستر ) 30h وبعمل عليهم العمليات الحسابية

ومن ثم برجع القيمة للأسكي كود بإضافة 30h

واطبعها على الشاشة . . . .

هذا كل ما في البرنامج

تحياتي وبالتوفيق

ENG-GAZA.GIF
#12

جزاك الله خير , فهمت الآن ..

بالنسبة لـ :

اقتباس
سؤال : إذا كنت جربت تدخل قيمة على نفس الكود اللي كتبته انت يطلع الناتج معك "نقطة" ؟ ليه ؟!

اقصد هذا الكود :

.MODEL SMALL
.STACK 100H
.DATA

MSG1 DB 'ENTER FIRST DIGIT:$'
MSG2 DB 'ENTER SECOND DIGIT:$'
MSG3 DB 'DIFFERENCE OF TWO DIGITS IS:$'
.CODE




MOV AX,@DATA;INTILAIZE DS
MOV DS,AX

;DISPLAY MSG1

LEA DX,MSG1;GET MSG1
MOV AH,9 ;DISPLAY STRING
INT 21H ;DISPLAY MSG1


;READ  DIGIT

MOV AH,1 ;READ DIGIT1
INT 21h
SUB AL, 30H;convert the ascii code to decimal
MOV BL,AL					   




MOV AH,2	 ; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH; line feed
INT 21H


;DISPLAY MSG2

LEA DX,MSG2;GET MSG2
MOV AH,9 ;DISPLAY STRING
INT 21H ;DISPLAY MSG2

;READ  DIGIT2

MOV AH,1 ;READ DIGIT2
INT 21h
SUB AL, 30H		  ;convert the ascii code to decimal	
mov bh,al


MOV AH,2 ; carriage return
MOV DL,0DH
INT 21H

MOV DL,0AH ; line feed
INT 21H


LEA DX,MSG3;GET MSG3
MOV AH,9 ;DISPLAY STRING
INT 21H ;DISPLAY MSG3


sub bh,BL
add bh, 30H

MOV AH,2
MOV Dl,bh	
INT 21h	



MOV AH,4CH; return control to DOS
INT 21H
END

>> هل جربته ؟! يطلع الناتج معنا " نقطة " لاننا ادخلنا القيمة الأولى اكبر من القيمة الثانية ..!!

لكن لما قلت انت :

اقتباس
لم انتبه الى هذه
اقتباس

such that second digit is

less than the first digit

البرنامج أعلاه بالعكس والتعديل سهل

قمت بتعديل البرنامج وضبط صح , لكن السؤال ودي اعرف ليه طلع معنا بالكود قبل التعديل " نقطة " ؟

:)

تم تعديل هذه المشاركة بواسطة Computeryah في 3 ديسمبر 2006 في 15:10

#13

في الكود اللي بيطرح االقيمة الكبيرة من القيمة الصغيرة لكل قيمتين سوف يكون ناتج مختلف

يعني 3 - 5 لا يساوي 3 - 6 لا يساوي 3- 9

و أكيد طبعا 5 - 3 لا يساوي 3 - 5

- - - - -

3 - 5 = -2

في الريجيستر إشارة السالب بتحول القيمة لـ second complement

2 = 00000010 بالباينري

-2 = 11111110 بالباينري

وبالتالي تحويل القيمتين اللي فوق لـ الآسكي كود (+30h) راح يطبع نتائج مختلفة عن بعض .

ENG-GAZA.GIF
#14

تمــام الحين ..

الله يوفقك ويسهل امورك ما قصرت ....

#15

عرفت طريقة أخرى لتحويل القيم من ASCII إلى decimal أردت إفادتكم بها :

بعد كتابه كود الـ READ :

-------------------------------

MOV AH,1

INT 21h

-------------------------------

نقوم بإضافة هذا السطر :

AND AL,0Fh

بالتوفيق للجميع ..

#16

مثل ما قلت لك المشكلة انك تطرحين كركترز :)

بس فيه حل افضل وهو انك تطرحين ثم تضيفين القيمة 30h اسهل لك :)

يعني مو لازم تكتبين

SUB AL, 30H

مرتين

لأن بالطرح اصلا قيم الاسكي بتروح مع بعض ويبقى القيمة الاصلية 30h - 30h = 0

يعني ان القيمتين تحتوي على 30h بيروحون مع بعض بالطرح

ان شاء الله اني اعرف اشرح لوول

تم تعديل هذه المشاركة بواسطة NullFlag في 11 ديسمبر 2006 في 19:21

#17

يعني تقصد اعمل عملية الطرح بالآخير ؟ >> آخر البرنامج تقريبا قبل output وبدون ما احتاج تحويل للقيم للديسميل ؟!

بعدين اضيف على القيمة 30h ؟

هذا المقصود ؟!

#18

sub bh,bl

بعدين سوي add bh,30h

بأختصار يعني :)

#19

بالضبط :)

جزاك الله كل خير ...

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…