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

مساعدة في طباعة القيمة العددية وليس الرمز ascii

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

السلام عليكم 

هناك مشكلة وهي اني عندما اريد طباعة قيمة ولتكن مثلاً 80H في أي ريجستر يقوم البرنامج بطباعة الرمز الذي يمثله من ASCII CODE 

 

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

 

يعني هناك قيمة في Register مثلاً Bl=70H  عندما اقوم بعمل 

Mov Dl,Blmov ah,2int 21h

يقوم بطباعة الرمز وليس القيمة العددية 

 

اريد الطريقة لطباعة الرقم سواء ب Decimal او نفسها 70h كيف

 

 

أستخدم أسمبلي 8086  

#2

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

/index.php/topic/221875-%D8%A3%D9%83%D9%88%D8%A7%D8%AF-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1/#entry1365285

#3

الأن لدي واجب في الجامعة تسليمه غداً وهو ان نقوم بإيجاد القيمة العظمى والصغرى لمصفوفة Signed سيقوم الدكتور لحقاً بإدخالها في متغير في داخل الكود "ملف asm"

 

الان قيم Max و Min  صحيحة ولكن ناتج التحويل خاطىء ؟ والبرنامج اصبح يعمل بشكل خاطىء كلياً 

; multi-segment executable file template.

data segment
    ; add your data here!
     Array db 000h,012h,012h,020h,015h,055h,0FEh,0D7h,040H,0f3h,02Dh,088h,0ffh
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
            
       LEA SI,ARRAY
      MOV CL,[si+1]
      MOV Ch,[si]
      MOV bL,00   
      
           MOV bH,BYTE PTR[SI]
 L1:CMP bL,BYTE PTR[SI]
      JL L2
      
      MOV bL,BYTE PTR[SI]
      
   L2:CMP bH,BYTE PTR[SI]
      JG L3
      MOV bH,BYTE PTR[SI]
   L3:
            
           
   INC si
       
                   loop L1
                     
   xor ax,0
   xor dx,0
   xor cx,0       



      call conv


proc  Conv
    
mov al,bH
mov cl,0ah
;;;;;;;;;;;;;;;
div cl
push ax
mov ah,00h

div cl
push ax
mov ah,00h

div cl
push ax
;;;;;;;;;;;;;;;;;;;
mov ax,0200h
;;;;;;;;;;;;;;;;;;;
pop dx
mov dl,dh
add dx,30h
int 21h

pop dx
mov dl,dh
add dx,30h
int 21h

pop dx
mov dl,dh
add dx,30h
int 21h

mov dl,10
int 21h

ret
ends
 

end start ; set entry point and stop the assembler.

تم تعديل هذه المشاركة بواسطة kakarot2055 في 14 ديسمبر 2013 في 20:50

#4 أفضل إجابة

عندما تواجهك مشكله قم بتقسيمها إلى أجزاء صغيره و قم بحلهم كلٍ على حدى و بعدها قم بدمجهم معا.

 

1- قم بكتابة الكود الخاص بإيجاد القيمه العظمي و ضع الناتج داخل اى مكان تريد و قم بالتأكد من صحته بإستخدام الـ debugger.

2- قم بكتابة الكود الخاص بإسجاد القيمه الصغرى و ضع الناتج داخل اى مكان تريد و قم بالتأكد من صحته بإستخدام الـ debugger.

3- قم بكتابة الكود الذى يقوم بتحويل رقم إلى نص تمهيدا لطباعته.

4- قم بكتابة الكود الخاص بالحصول على موقع مصفوفة الحروف لطباعتها.

 

يمكنك البدء بأى من الخطوات الأربعه المذكورين بالترتيب الذى تريد و بعد الغنتهاء إليك ما ستفعل:

1- تأكد ان ناتج دالة القيمه العظمي و الصغرى يضع النتيجه داخل نفس المسجل و سنفترض انه AX.

2- تأكد ان دالة إعداد النص (المذكوره فى الخطوه 3) تقوم بالقراءة من المسجل AX و تقوم بحفظ موقع النص داخل المسجل AL.

3- تأكد ان دالة الطباعة تقوم بقراءة موقع النص من AL.

4- دالة طباعة النص تقوم أولا بإستدعاء دالة إعداد النص و بعدها تقوم بالطباعه و بعدها تقوم بتحرير مساحة الذاكرة التى تم حجزها للنص.

 

كود الإستدعاء قد يبدو كالتالي:

FUNCTION GetMinValue
.
.
END GetMinValue

FUNCTION GetMaxValue
.
.
END GetMaxValue

FUNCTION PreString
.
.
END PreString

FUNCTION PrintString
.
.
END PrintString


main:
    CALL GetMinValue(Array)
    CALL PrintString()

    CALL GetMaxValue(Array)
    CALL PrintString()

و الله و لي التوفيق

1

مدونتي: C++ Tips and Tricks

#5

جزاك الله خيراً تم حل المشكلة عن طريق ترتيب العمل وعمل Trace للبرنامج 

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

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

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

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

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

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