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

[ تمت الإجابة ]أخراج ناتج الضرب بشكل عدد عشري

بدأه Prelware D في 5 أغسطس 2009 · 3 رد · 1,440 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الحمدلله والصلاة والسلام على رسول الله وعلى آله وصحبه أجمعين

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

data segment
a db 1
b db 1 
c db 0
ends


stack segment
dw 128 dup(0)
ends


code segment
start:
mov ax, data
mov ds, ax
mov es, ax


mov ax,0
mov dx,0

mov al,a
mov dl,b

mov cx,ax

@1:
Add c,dl 
loop @1

mov ah,2
mov dl,c
int 21h


mov ah,1
int 21h
mov ax,4c00h
int 21h
ends 
end start

والمشكله هي أن عندما نقوم بأخراج الجواب يخرج بشكل رمز من ASCII

فالناتج هنا هو الرقم 2

لكنه يخرج لي الرمز ذو رقم 2 في ASCII

شكراً

بالنسبه للأعداد اللتي تكون ناتج ضربها من 0 إلى 9 نستطيع جمع 30H إلى الناتج

ولكن مذا عن بقية الأرقام

تم تعديل هذه المشاركة بواسطة Prelware D في 5 أغسطس 2009 في 09:45

Danial Tarraf

Prelware D&D Association

Lattakia/Syria

#2

قراءة الأرقام العشرية Decimal Input

لقراءة الأرقام العشرية نحتاج لتحويل الحروف ASCII لكل حرف الى القيمة الثنائية المناظر للخانة العشرية وتجميع هذه القيم في سجل. وسنقوم بتوضيح خوارزمية البرنامج.

Total  =  0
Read an ASCII Digit											  
Repeat																  
Convert character to a Binary value					 
Total  = total* l0 + value									   
Read a character												  
Until character  is a carriage return

فمثلاً إذا كانت المدخلات هي الرقم 157 سيكون تنفيذ الخوارزمية على النحو التالي:

Total  =  0
Read “1”		  
Convert “1” to 1							 
Total = 10 x 0 + 1 = 1					 
Read “5”									   
Convent “5” to “5”						 
Total  = 1 x 10 + 5  = 15				
Read  “7”									 
Convent “7” to 7							
Total  = 15 x 10 + 7  = 157

سنقوم ألان بتطوير الخوارزمية السابقة ووضعها في إجراء يسمى INDEC يقوم الإجراء بطباعة علامة الاستفهام ثم قراءة رقم عشري من لوحة المفاتيح. قد يبدأ الرقم بإشارة - أو +. إذا احتوى الرقم على خانة غير عشرية (حرف لا يقع بين 0 و 9 ) يقوم البرنامج بالقراءة من جديد. ينتهي الرقم بالضغط على مفتاح الإدخال.

Print  “?”
Total  =  0
Negative  =  False							
Read a character						   
Case character of							
“- “ 	: 	Negative  =  True					 
Read a character							
“+“	:	Read a character					 
End_Case													  
Repeat														 
if character is not between “0” and “9” then
GO TO Beginning								 
Else													
convert character to a Binary value			   
total  = 10 * total + value							   
End if															 
Read a character										   
Until character is a carriage return  
IF negative  =  True then								
Total  = -total												 
End_if

من كتاب الأسمبلي السابق الذي سبق وأن أشرت له (الفصل الثامن ) يرجى مراجعته لمعرفة كيفية طباعه العدد deicaml ..

وهذا برنامج لادخال وطباعه الأرقام العشريه (بMASAM) :

;************************************************************************ 
; An Assembly Language Program that will :
; read and print a decimal number using procedures INDEC and OUTDEC
; Place the procedures in separate files and use the INCLUDE instruction
;*************************************************************************

TITLE EX3.ASM : Read Decimal Number and print it in new Line

.MODEL	SMALL
.STACK	100H

.DATA
	PROMPT_1	DB		'Enter The Decimal Number  : $'
	MSG_1		DB		0DH,0AH,07H,'The Decimal is : $'

.CODE

	MAIN PROC

			MOV AX,@DATA
			MOV DS,AX

			MOV AH,9
			LEA	DX,PROMPT_1
			INT 21H


			CALL INPUT_DECIMAL

			PUSH AX

			MOV AH,9
			LEA	DX,MSG_1
			INT 21H

			POP AX

			CALL OUTPUT_DECIMAL

			MOV AH,4CH
			INT 21H

	MAIN ENDP



;*****************************************
;*****************************************
;************ INPUT_DECIMAL **************
;*****************************************
;*****************************************
; JOB	: input decimal number 
; INPUT  : none
; OUTPUT : AX

	INPUT_DECIMAL PROC
		@BEGIN:	
				XOR CX,CX
				XOR BX,BX

				MOV AH,1
				INT 21H

				CMP AL,0DH
				JE	@END_INPUT

				CMP AL,'-'
				JE	@MINUS

				CMP AL,'+'
				JE	@PLUS

				JMP @INPUT

		@MINUS:

				MOV CX,1

		@PLUS :
				INT 21H

		@INPUT:
				CMP AL,'0'
				JL	@ERROR

				CMP AL,'9'
				JG	@ERROR

				AND AX,000FH

				PUSH AX

				MOV AX,10
				MUL BX	
				POP BX
				ADD BX,AX

				MOV AH,1
				INT 21H
				CMP AL,0DH
				JE	@END_INPUT

				JMP @INPUT

		@END_INPUT:

				MOV AX,BX

				CMP CX,1
				JNE	@NEXT

				NEG	AX

			@NEXT:

				RET

		@ERROR:
			 MOV AH,2
			 MOV DL,0DH
			 INT 21H
			 MOV DL,0AH
			 INT 21H

			 JMP @BEGIN

	INPUT_DECIMAL ENDP



;*****************************************
;*****************************************
;************ OUTPUT_DECIMAL *************
;*****************************************
;*****************************************
; JOB	: output decimal number 
; INPUT  : AX
; OUTPUT : none

	OUTPUT_DECIMAL  PROC
					XOR CX,CX
					MOV BX,10D

					CMP AX,0
					JGE	@NEXT_

					PUSH AX

					MOV AH,2
					MOV DL,'-'
					INT 21H

					POP AX
					NEG AX
		@NEXT_:

		@OUTPUT:
					XOR DX,DX
					DIV BX
					PUSH DX
					INC CX
					CMP AX,0
					JNE	@OUTPUT

					MOV AH,2

		@TOP:
					POP DX
					OR	DL,30H
					INT 21H
					LOOP @TOP


					RET

	OUTPUT_DECIMAL ENDP

END MAIN

بالتوفيق :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3
اقتباس
بالنسبه للأعداد اللتي تكون ناتج ضربها من 0 إلى 9 نستطيع جمع 30H إلى الناتج

ولكن مذا عن بقية الأرقام

إن عملية طباعة الرقم 36 مثلا تختلف عن طباعة الأرقام التي أقل من عشرة( 0 إلى 9) ، وذلك كونه يحوي مرتبتين ، والطريقة المتبعة في ذلك هي طباعة كل مرتبة على حدة ابتداء من اليسار الى اليمين ، ونشرحها كما يلي :

أولا : نقوم بإنقاص 10 من الـ 36 .

ثانيا : نقوم بوضع رقم 1 على جانب بدل الـ 10 التي أنقصناها في الخطوة السابقة .

ثالثا : بقي لدينا 26 أيضا نقوم بإنقاص 10 أخرى منه .

رابعا : نقوم بإضافة 1 الى الـ 1 السابق بدل الـ 10 المنقوص الثانية وبذلك أصبح لدينا 2 على جانب .

خامسا : بقي لدينا 16 وأصبح لدينا 2 على جانب ، نقوم بإنقاص 10 أخرى منه .

سادسا : بقي لدينا 6 وأصبح لدينا 3 على جانب ، نقوم بطباعة 3 أولا ثم نطبع 6 وبذلك يكون ناتج الطباعة 36

هذا الشرح هو الشرح الأستاذ عبد الحسين جزاه الله خيرا في منتدى فنان سات

اقتباس
mov bh,36 ; bh = 36

mov bl,0 ; bl = 0

xx: sub bh,10 ; bh = bh - 10

inc bl ; bl = bl + 1

cmp bh,9 ; compare bh with 9

jg xx ; If bh > 9 then goto xx

mov dl,bl

add dl,30h

mov ah,02h

int 21h

mov dl,bh

add dl,30h

int 21h

mov ah,4ch

int 21h

أخي Wajdy Essam عندك معلومات جيدة في الأسمبلي ؟

لي سؤال إن أمكن

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

.model small
.stack 200h
.data

T	db	66h,3,65h,1,90h;45h

.code
MOV  AX,@DATA
MOV  DS,AX


mov	ah,1
int	21h

mov  byte ptr T,AL

mov   dx,byte ptr T
mov	ah,2
int	21h

mov	ah,4ch
int	21h
end

تم تعديل هذه المشاركة بواسطة hatem في 5 أغسطس 2009 في 11:47

#4

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

شكراُ أخواني على ردودكم المفيدة

لقد فهمت الطريقة التي قدمها الأخ Hatem

بالإضافة إلى الخوارزمية اللتي قدمها الأخ Wajdy essam

لعميلة جمع الأعداد اللتي ناتجها فوق 10

فشكراً,,

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

Danial Tarraf

Prelware D&D Association

Lattakia/Syria

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

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

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

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

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