عاجل جدا من الأخوه كيف يمكنني ايجاد العدد الأكبر في مصفوفه من خمس خانات
ثم طباعة العدد حاولت بكل الطرق و لم افلح (لا استطيع القراءه من المصفوفه)
عاجل جدا من الأخوه كيف يمكنني ايجاد العدد الأكبر في مصفوفه من خمس خانات
ثم طباعة العدد حاولت بكل الطرق و لم افلح (لا استطيع القراءه من المصفوفه)
تم تعديل هذه المشاركة بواسطة Xacker في 23 يناير 2010 في 16:27
ضع محاولاتك لتصويبها
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
.286
.MODEL SMALL
.STACH 100H
.DATA
DB ARR 51,-6,40,8,20,-3
DB VMAX ?
.CODE
MOV AX,@DATA
MOV DS,AX
XOR AX,AX
PUSH CX
MOV CX,6
MOV BX,0
MOV AX,ARR[bX]
MOV VMAX,AX
NEXT: CMP AX,VMAX
JA GNV
RESUME: INC BX
MOV AX,ARR[bX]
LOOP NEXT
JMP EXIT
GNV: MOV VMAX,AX
JMP RESUME
EXIT:
MOV AX,4C00H
INT 21H
END
تم تعديل هذه المشاركة بواسطة tezok في 16 يناير 2010 في 14:21
.model small .stack .data arr db 51,-6,40,8,20,-3 vmax db 0 buff db 3 dup (0) .code main proc far mov ax,@data mov ds,ax lea si,arr ;load addr of ARR into SI register xor bx,bx ;BX = counter xor ax,ax mov al,byte ptr [si+bx] mov vmax,al inc bx @loop: cmp bx,6 je exit mov al,byte ptr [si+bx] cmp vmax,al jge next mov vmax,al next: inc bx jmp @loop exit: ;print vmax lea bx,buff mov al,vmax call dwtoa mov ah,9 lea dx,buff int 21h mov ax,4c00h int 21h main endp dwtoa proc near mov dx,ax mov di,bx test al,al jnz sign zero: mov word ptr [di],30h jmp dtaexit sign: jns pos mov [di],"-" neg al inc di pos: mov cx,10 mov si,di .while (ax > 0) xor dx,dx div cx add dl,30h mov [di],dl inc di .endw mov [di],"$" .while (si < di) sub di,1 mov al,[si] mov ah,[di] mov [di],al mov [si],ah add si,1 .endw dtaexit: ret dwtoa endp end main
نفس البرنامج يمكنك تعديل السطر
jge next
إلى
jle next
ليعطيك أصغر رقم في السلسلة.
تذكرة:
jg ومشتقاتها / jl ومشتقاتها، تعتمد على SF (أي أنها تتعامل مع signed values)
تنبيه:
قمت بالتعديل على إجرائية dwtoa بحيث تقوم بفحص AL لترى إن كان الرقم موجب أم سالب باستخدام JS (Jump if Signed) وليس AX شرط أن تكون الأرقام في السلسلة في حدود بايت واحد أي [-127,127].
استخدام الإجرائية
; ax = hex value to change into ascii ; bx = buffer for output call dwtoa
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جميل اخي Xacker
كنت اود مساعدة العضو كتب الكود لكن به مشاكل وقد استفدت من مشاركتك
فقط لم افهم لما هدا الكود ما هو دوره ؟
الا يمكن طباعة النتيجة مباشرة ؟
dwtoa proc near
mov dx,ax
mov di,bx
test al,al
jnz sign
zero:
mov word ptr [di],30h
jmp dtaexit
sign:
jns pos
mov [di],"-"
neg al
inc di
pos:
mov cx,10
mov si,di
.while (ax > 0)
xor dx,dx
div cx
add dl,30h
mov [di],dl
inc di
.endw
mov [di],"$"
.while (si < di)
sub di,1
mov al,[si]
mov ah,[di]
mov [di],al
mov [si],ah
add si,1
.endw
dtaexit:
ret
dwtoa endpsoufianosse كتب:فقط لم افهم لما هدا الكود ما هو دوره ؟
الكود يقوم بتحويل قيمة HEX إلى قيمة ASCII بحيث تصبح قابلة للطباعة كسلسلة نصّية. كما أنه يحدد فيما إذا كان العدد مؤشر أو غير مؤشر (signed / unsigned) لكي يضيف إشارة ناقص في بدايته ضمن الـ buffer.
soufianosse كتب:الا يمكن طباعة النتيجة مباشرة ؟
لنفرض أن العدد الأكبر هو العدد 9 (مثلاً)
بالتالي ستكون قيمته في الذاكرة 09h .. هل لو قمت بطباعته سيظهر "9" على الخرج؟ لا حتماً.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
Xacker كتب:الكود يقوم بتحويل قيمة HEX إلى قيمة ASCII
ممكن خوارزمية التحويل ؟
الكتلة كاملة هو الكود الخاص بإجرائية dwtoa
أما الجزء الرئيسي في التحويل
mov cx,10 mov si,di .while (ax > 0) xor dx,dx div cx add dl,30h mov [di],dl inc di .endw
تم تعديل هذه المشاركة بواسطة Xacker في 24 يناير 2010 في 17:01
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اوكي شكرا لك يا X :lol: