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

ترتيب عشرة ارقام تصاعديا

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

السلام عليكم احبتي ..

انا مبتدئ لهذه اللغة وهناك سؤال .. كيف يمكن بناء برنامج يأخذ من المستخدم عشرة ارقام بالنظام العشري ويرتبها تصاعديا

مشكور لكم

:rolleyes:

7asbi.gif
#2

برأيك ماذا يجب ان يكون الكود؟ ما اساسياته؟ ما المشاكل او التصورات للمشاكل التي ستظهر؟

Do as I say, not as I do

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

#3

يجب ان يكون هناك مصفوفة نخزن بها الارقام num DB 10 DUP , بعد ذلك نقوم بمقارنة بين كل رقم والذي يليه فإما نبدلهم او نتركهم.

هذه الفكرة برأيي , لكني لا اعرف تطبيقها على الاسيمبلي

7asbi.gif
#4

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

المصفوفة تتكون من عشر خانات, جميعها ارقام مدخلة عشوائيا, لنفرض انها: 0, 44, 202, 6, 7, 83, 24, 222, ...

لاحظي ان المطلوب سيكتب في بيئة 16بت بالتالي اقصى قيمة نستطيع التعامل معها هنا بدون ان نزيد من تعقيد كتابة الكود هي 65535

الان ناخذ اول رقم, نفرض انه اكبر رقم ونقارن الرقم التالي له معه, ان كان الرقم التالي اكبر قمنا بالتبديل بينهما. الان ناخذ اول رقم ايضا (لاننا في حلقة وما زلنا نقارن حتى النهاية), وناخذ الرقم الثالث.. دقيقة, ليه هيك؟

لانه ليتم هذا الامر نحن بحاجة الى حلقتين, الاولى تاخذ الرقم الاول من متغير i هو ترتيب الرقم الاول, وفيها حلقة ثانية بمتغير j تقوم باخذ الرقم i+1=j, يتم مقارنة اول رقم مع جميع الارقام التي تليه ومن ثم يتم الانتقال للرقم الثاني ويتم المقارنة مع جميع الارقام التي تليه وهكذا الى النهاية..

الان, لم لا تبدأي بكتابة اسطرك الاولى وفقا لما ذكرناه

Do as I say, not as I do

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

#5

اخي , انا شاب من فلسطين , وايضا اخوك B) , مش مشكلة...

اعود اليك اخي Xacher بعد محاولات فاشلة للاسف .. لكن ليس يهم

المشكلة التي واجهتها هي كيف اتناول الارقام من نوع string في int 21h/ ah=6 واحولها الى ارقام من 2 bytes هذه هي المشكلة

ساعدني رجاء

.model small
.data
  msg db "please enter the array :$"
      
     array Db 20 dup(?)
     ten_num DW 10

.code
.startup
  
      mov dx,offset msg
      mov ah, 9h
      int 21h


mov di , offset array
mov cx , 10
Numbers:
 xor bx,bx
    ; get the digit
      k: mov dx,0FFH
         mov ah,6
         int 21h
         je k
         
        ;print the digit
         mov dl ,al
         mov ah,6
         int 21h
         
        ;check for enter key
         cmp al,0DH
         je stop
         
         
        ; multiply cx by 10
         push ax; save ax
         mov ax,bx
         mul ten_num; (DX AX) = AX * 10
         mov bx,ax   
         pop ax; reload ax
         
         sub al,30h; convert to integer
         
         mov ah,0
        ;mov dx,bx
        ;add bx ,ax
         add bx,ax
         
        jmp K 
      
                
      stop:
        mov [di] , bh
        inc di
        mov [di] , bl
        inc di
      
      loop Numbers
      
      
      mov cx , 10
     print:
      mov di ,offset array
      mov dx,[di]
      mov ah , 6h
      int 21h
      inc di
           
      loop print
      end
7asbi.gif
#6

بسيطة باذن الله, مضطر ان انهي اتصالي الان وساعود للموضوع بعد قليل ان شاء الله.

Do as I say, not as I do

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

#7

حياك , بإنتظارك ايها القائد :) ان شاء الله

7asbi.gif
#8

عذرا على التاخير فكما تعلم كود 16بت ممل لدرجة كل بايت يجب ان تقوم بتنقيحه :P

.model	small
.code
	org	100h
startup:
	jmp	main

buffer	db	2 dup (0); save us a buffer we will use to store number nibbles
array	dw	10 dup (0)
msg  db	"Please insert array number [", "$"
preceed	db	"]: ", "$"
index	db	1
pos  db	0
howmany	db	0

main:; real code starts here
; display msg on screen
; first part
	mov	dx, offset msg
	mov	ah, 9
	int	21h
; now the number index
	mov	di, offset index
	mov	dx, [di]
	add	dx, 30h
	mov	ah, 2
	int	21h
; finally the last part
	mov	dx, offset preceed
	mov	ah, 9
	int	21h
; initialize array & buffer
	lea	si, buffer
	lea	di, array
; start getting the nibbles
get:
	mov	dx, 0FFh
	mov	ah, 6
	int	21h
	je	get
; enter?
	cmp	al, 0Dh
	je	next
; backspace?
	cmp	al, 08h
	je	clear_pre
; ESC, close?
	cmp	al, 1Bh
	je	exit
; numbers only
	cmp al, 30h
	jl	get
	cmp al, 39h
	ja	get
; two nibbles already?
	cmp	howmany, 2
	je	get
; print it
	mov	dl, al
	mov	ah, 6
	int	21h
; save those nibbles
	cmp	[buffer], 0
	jne	next_place
	mov	[si], al
	inc	howmany
	jmp	get
next_place:
	mov	[si+1], al
	inc	howmany
	jmp	get
next:
; now time to save it in the array
	mov	howmany, 0; sub or dec may cause troubles if user enters 1 nibble and not two.. so you will have to check on that
	mov	ah, [si]
	mov	al, [si+1]
	mov [di], ax; number saved
	inc	di; move to next
	inc	di
	mov	[buffer], 0; clear buffer
	mov	[buffer+1], 0
	cmp	[array+18], 0000h
	jne	sort
; clear writing position
	call	clear
	jmp	get
sort:
; do your sorting here
exit:
	mov	ax, 4C00h
	int	21h
clear_pre:
; get current position
	mov	ah, 03h
	mov	bh, 00h
	int	10h
	cmp	dl, 20h
	je	get
	sub	dl, 1
	mov	ah, 02h
	mov	bh, 00h
	xor	dh, dh; dl holds the vertical position
	mov	pos, dl
	int	10h
	mov	dl, 20h
	mov	ah, 2
	int	21h
	mov	ah, 02h
	mov	bh, 00h
	xor	dh, dh
	mov	dl, pos
	int	10h
	cmp	howmany, 0
	jle	get
	dec	howmany
	jmp	get

clear  proc	near
; reposition cursor
	mov	ah, 02h
	mov	bh, 00h
	mov	dx, 0020h
	int	10h
	mov	cx, 2
clear_it:
; write two spaces here
	mov	dx, 20h
	mov	ah, 2
	int	21h
	loop	clear_it
; reposition cursor again
	mov	ah, 02h
	mov	bh, 00h
	mov	dx, 0020h
	int	10h
	ret
clear  endp
end	startup

ادرس التالي وخبرني اذا فيه شي مش واضح او غلط.. بالتوفيق, اه بالمناسبة, ما كنت منتبه ان الاسم هو صالح.. كنت اقرأه اسم آخر, باي حال حصل خير :)

Array.rar

تم تعديل هذه المشاركة بواسطة Xacker في 20 أبريل 2006 في 21:23

Do as I say, not as I do

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

#9

شكرا شكرا اخي Xacher ولا يهمك , اسمي صلاح من فلسطين ..

مشكورلك على المتابعة معي , راح ادرسها ان شاء الله واردلك خبر بعد يومين لاني مشغول شوي

شكرا كمان مرة , والله يبارك فيك

7asbi.gif

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

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

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

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

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

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