لو سمحتم أريد كود برنامج لقلب مصفوفة بلغة التجميع .. أنا مستعجلة ممكن يكون الرد بسرعة !
[ تمت الإجابة ]سؤال يتعلق بقلب مصفوفة
- INCLUDE Irvine32.inc
- .data
- msg byte "Enter the string",0
- msg1 byte "the reversed string",0
- arr byte "assemply",0
- arr1 byte ?
- arrsize= ($-arr)-2
- .code
- main PROC
- mov edx,offset msg
- call writestring
- call crlf
- call readstring
- mov esi ,0
- mov ecx ,arrsize
- l:
- movzx eax,arr[esi]
- push eax
- inc esi
- loop l
- mov ecx ,arrsize
- mov esi ,0
- l1:
- pop eax
- mov arr1[esi],al
- inc esi
- loop l1
- mov edx,offset arr1
- call writestring
- call crlf
- main ENDP
- END main
توقعت أن تكون البيئة 16 بت
يمكن تحويله ليعمل مع 32بت بسهولة
[color= #ff007f;]jmp real_s
[color= #007f00; font-style: italic;]; data
arr [color= #7f00ff;]db [color= #ff0000;]1h[color= #0000ff;],[color= #ff0000;]2h[color= #0000ff;],[color= #ff0000;]3h[color= #0000ff;],[color= #ff0000;]4h[color= #0000ff;],[color= #ff0000;]5h[color= #0000ff;],[color= #7f7f7f;]0 [color= #007f00; font-style: italic;]; any length
real_s[color= #0000ff;]:
[color= #007f00; font-style: italic;]; now let the fun begin
[color= #ff007f;]lea [color= #7f7f40;]si[color= #0000ff;],arr
[color= #ff007f;]xor [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f40;]cx
@@[color= #0000ff;]:
[color= #ff007f;]mov [color= #7f7f40;]bl[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]cx[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]add [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]test [color= #7f7f40;]bl[color= #0000ff;],[color= #7f7f40;]bl
[color= #ff007f;]jne [color= #aa007f;]@B
[color= #ff007f;]lea [color= #7f7f40;]si[color= #0000ff;],arr
[color= #ff007f;]lea [color= #7f7f40;]di[color= #0000ff;],arr
[color= #ff007f;]sub [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]lea [color= #7f7f40;]di[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000ff;]+cx[color= #7f7f7f;]-1[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]shr [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]neg [color= #7f7f40;]cx
[color= #ff007f;]sub [color= #7f7f40;]si[color= #0000ff;],[color= #7f7f40;]cx
@@[color= #0000ff;]:
[color= #ff007f;]mov [color= #7f7f40;]al[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]cx[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]mov [color= #7f7f40;]bl[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]mov [color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]cx[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]bl
[color= #ff007f;]mov [color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]al
[color= #ff007f;]sub [color= #7f7f40;]di[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]add [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]jne [color= #aa007f;]@B
[color= #007f00; font-style: italic;]; at this point, the array has been swapped.
[color= #ff007f;]mov [color= #7f7f40;]ax[color= #0000ff;], [color= #ff0000;]4c00h
[color= #ff007f;]int [color= #ff0000;]21hDo as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
مبدع كالعاده Xacker
بشكركم على الرد بسرعة .. بس طلع معاي أخطاء تقريباً سبعة أخطاء
للإيضاح أنا أعمل على برنامج turbo assembler 4.1
بالنسبة لبرنامج xacker كان قريب نوعاً ما
يمكن تقولوا أني غبية بهذه اللغة لأنه بصراحة ما في عندنا تدريس بشكل جيد لهذه اللغة ، بس طرحوا خطتهم وخلونا حقل تجارب
أتمنى تردوا بسرعة
معايا محاضرة غداً الأربعاء الساعة العاشرة
ربي هذا العهد لك ... عزم القلب الوفا
السلام عليكم ورحمة الله وبركاته
للعلم الشفرة التي وضعتها في الأعلى ليست برنامج كامل تقوم بنسخه ولصقه في assembler للحصول على برنامج تنفيذي وإنما هو الجزء الذي يقوم بالعملية المطلوبة.
قمت بتحويله ليتناسب مع TASM (استخدمت TASM 1.x في التجميع و debug في اختبار نجاح التنفيذ)
* يرجى الانتباه إلى تغير استخدام المسجلات داخل الشفرة الجديدة حيث تم استخدام BX كـ Base Register وتعديل المستخدمة في حمل البايتات.
[color= #007f00; font-style: italic;]; flip an array algorithm
_stack [color= #7f00ff;]segment [color= #aa007f;]para [color= #7f00ff;]stack [color= #0000a0;]'stack'
[color= #7f00ff;]dw [color= #7f7f7f;]32 [color= #7f00ff;]dup [color= #0000a0; font-weight: bold;](?[color= #0000a0; font-weight: bold;])
_stack [color= #7f00ff;]ends
_dataseg [color= #7f00ff;]segment [color= #aa007f;]para [color= #0000a0;]'data'
_dataseg [color= #7f00ff;]ends
[color= #7f00ff;]assume [color= #7f7f40;]ss[color= #0000ff;]:_stack[color= #0000ff;],[color= #7f7f40;]ds[color= #0000ff;]:_dataseg[color= #0000ff;],[color= #7f7f40;]cs[color= #0000ff;]:_codeseg
_codeseg [color= #7f00ff;]segment [color= #aa007f;]para [color= #0000a0;]'code'
main [color= #7f00ff;]proc [color= #aa007f;]far
[color= #ff007f;]jmp real_s
[color= #007f00; font-style: italic;]; data
arr [color= #7f00ff;]db [color= #ff0000;]1h[color= #0000ff;],[color= #ff0000;]2h[color= #0000ff;],[color= #ff0000;]3h[color= #0000ff;],[color= #ff0000;]4h[color= #0000ff;],[color= #ff0000;]5h[color= #0000ff;],[color= #7f7f7f;]0 [color= #007f00; font-style: italic;]; any length
real_s[color= #0000ff;]:
[color= #007f00; font-style: italic;]; now let the fun begin
[color= #ff007f;]mov [color= #7f7f40;]ax[color= #0000ff;],_dataseg
[color= #ff007f;]mov [color= #7f7f40;]ds[color= #0000ff;],[color= #7f7f40;]ax
[color= #ff007f;]mov [color= #7f7f40;]si[color= #0000ff;],[color= #7f00ff;]offset arr
[color= #ff007f;]xor [color= #7f7f40;]bx[color= #0000ff;],[color= #7f7f40;]bx
@[color= #7f7f7f;]1[color= #0000ff;]:
[color= #ff007f;]mov [color= #7f7f40;]dl[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]bx[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]add [color= #7f7f40;]bx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]test [color= #7f7f40;]dl[color= #0000ff;],[color= #7f7f40;]dl
[color= #ff007f;]jne @[color= #7f7f7f;]1
[color= #ff007f;]mov [color= #7f7f40;]si[color= #0000ff;],[color= #7f00ff;]offset arr
[color= #ff007f;]mov [color= #7f7f40;]di[color= #0000ff;],[color= #7f00ff;]offset arr
[color= #ff007f;]sub [color= #7f7f40;]bx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]lea [color= #7f7f40;]di[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000ff;]+bx[color= #7f7f7f;]-1[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]shr [color= #7f7f40;]bx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]neg [color= #7f7f40;]bx
[color= #ff007f;]sub [color= #7f7f40;]si[color= #0000ff;],[color= #7f7f40;]bx
@[color= #7f7f7f;]2[color= #0000ff;]:
[color= #ff007f;]mov [color= #7f7f40;]al[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]bx[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]mov [color= #7f7f40;]dl[color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]]
[color= #ff007f;]mov [color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000ff;]+[color= #7f7f40;]bx[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]dl
[color= #ff007f;]mov [color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]al
[color= #ff007f;]sub [color= #7f7f40;]di[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]add [color= #7f7f40;]bx[color= #0000ff;],[color= #7f7f7f;]1
[color= #ff007f;]jne @[color= #7f7f7f;]2
[color= #007f00; font-style: italic;]; at this point, the array has been swapped.
[color= #ff007f;]mov [color= #7f7f40;]ax[color= #0000ff;], [color= #ff0000;]4c00h
[color= #ff007f;]int [color= #ff0000;]21h
main [color= #7f00ff;]endp
_codeseg [color= #7f00ff;]ends
[color= #7f00ff;]endتم تعديل هذه المشاركة بواسطة Xacker في 23 ديسمبر 2008 في 21:23 — السبب: إضافة ملاحظة*
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
MODEL TINY .CODE jmp BEGIN array_start db 1,3,5,9,0,2 array_end: BEGIN: push cs pop ds lea si, array_start lea di, array_end - 1 mov cx, (array_end - array_start + 1)/2 xchg_next: mov al, [di] xchg al, [si] mov [di], al inc si dec di loop xchg_next ; Exit mov ax,4C00h int 21h END BEGIN
هذا الكود لا يشترط أن تنتهى المصفوفة ب (0) - كما يعمل أيضاً بشكل صحيح إذا احتوت بيانات المصفوفة على (0)
للحصول على الملف التنفيذى exe انسخ الكود السابق فى ملف جديد بأسم file.asm ثم نفذ:
tasm.exe file.asm tlink.exe file.obj
أولاً بحب أشكر الجميع على تفاعلهم معي ..
بالنسبة لبرنامج xacker كان يطلع خطأ وهو :
unmatched ends :dataseg
وعند التنفيذ يتجمد تماماً واضطر للخروج ..
أما بالنسبة لبرنامجa3ghadeer فكان على ما يرام ف..
وأنا أكرر شكري مرة أخرى للجميع وخاصة XACKER و rewsh لتجاوبهم معي بسرعة ..
ربي هذا العهد لك ... عزم القلب الوفا
ماريا اسلام كتب:أولاً بحب أشكر الجميع على تفاعلهم معي ..
بالنسبة لبرنامج xacker كان يطلع خطأ وهو :
unmatched ends :dataseg
وعند التنفيذ يتجمد تماماً واضطر للخروج ..
ربما لاختلاف الإصدار فقد اختبرته لدي على TASM 1.x كما ذكرت، بكل الأحوال بالتوفيق وإن شاء الله يكون في الموضوع فائدة وليس مجرد "نسخ" :wink:
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
استبدل السطر
mov cx, (array_end - array_start + 1)/2
بالسطر
mov cx, (array_end - array_start)/2