التجميع - محاولة عكس السلسلة ، لكنه يضيف حرفًا إضافيًا على السلسلة النهائية
سؤال
أنا جديد إلى حد ما في التجميع (والبرمجة بشكل عام ، لأكون صادقًا). أحاول اللعب مع المكدس.الغرض من هذا الرمز:
- خذ سلسلة ، تقتصر على 80 حرفًا
- إعادة طباعة السلسلة كما تم إدخالها
- اطبع كل حرف أثناء دفعه إلى المكدس
- اطبع كل حرف لأنه برزت من المكدس
- اطبع السلسلة العكسية.
فشل الرمز في الخطوة الأخيرة.
إذا كانت السلسلة التي تم إدخالها هي "مساعدة" ، فستطبع "plehe". الحرف الأخير في السلسلة النهائية هو الحرف الثاني للسلسلة الأصلية.
الرجاء مساعدتي في رؤية أين أتعاطى مع!
.data buffer WORD 81 DUP(0) byteCount WORD ? .code main PROC call Clrscr ;Clear screen RS: mov edx, OFFSET buffer ;Move String to edx mov cl, [SIZEOF buffer]-1 ;Set loop counter to (size of buffer) -1 call ReadString ;Read a User's String mov byteCount, ax ;Move the size of User's String to byteCount cmp byteCount, 80 ;Compare byteCount with 80 ja RS ;If byteCount is greater then 80, ask for another String call WriteString ;Write User's String to screen call Crlf ;New Line call reverseIt ;Reverse order of String exit reverseIt PROC movzx ecx, byteCount ;Set Loop1 Counter to size of String mov esi, 0 ;Zero out ESI L1: ;Loop1 - Pushes String into Stack one character at a time movzx eax, buffer[esi] ;Dereference buffer and place in eax call Crlf ;New Line call WriteChar ;Print current character to screen push eax ;Push current character to stack inc esi ;Move to next character loop L1 call Crlf movzx ecx, byteCount ;Set Loop2 Counter to size of String mov esi, 0 ;Zero out ESI L2: ;Loop2 - Pops Characters back into String in reverse order pop eax ;Retrieve character from top of stack call Crlf ;New Line call WriteChar ;Print current character to screen mov buffer[esi], ax ;Writes character to String inc esi ;Increase esi loop L2 call Crlf ;New Line call Crlf ;New Line mov edx, OFFSET buffer ;Move String to edx for WriteString call WriteString ;Prints String to Screen call Crlf ;New Line ret ;Return to main reverseIt ENDP main ENDP END main
المحلول
مشكلة
أنت تعامل شخصيات ASCII الخاصة بك ككلمات بدلاً من البايتات ، لذلك ينتهي بك الأمر إلى عكس حرفين في وقت واحد:
عند عكس السلسلة حرفين في وقت واحد ، ينتهي بك الأمر إلى كتابة هذه القيم إلى المخزن المؤقت:
esi+0: p-
esi+1: lp
esi+2: el
esi+3: He
أثناء كل تكرار ، يبدو المخزن المؤقت الخاص بك هكذا:
Help--
p-lp--
plpp--
plel--
pleHe-
لذلك ينتهي بك الأمر إلى كتابة هذا الإضافي إلى المخزن المؤقت. أفترض أن E لا تظهر في حلقة Writechar.
المحلول
لم أختبر الكود الخاص بك ، لذا لا يمكنني معرفة ذلك بالتأكيد ، لكن يبدو أنك بحاجة إلى تغيير هذا السطر:
mov buffer[esi], ax ;Writes character to String
ل
mov ptr byte buffer[esi], al ;Writes character to String
من المحتمل أن تكون فكرة جيدة لتغيير هذا الخط أيضًا:
buffer WORD 81 DUP(0)
لذلك يستخدم البايت بدلاً من ذلك:
buffer BYTE 81 DUP(0)
نصائح أخرى
شكرا لك على هذا! كنت أعلم أنني كنت أستخدم الكلمات بدلاً من البايتات لأن الجزء الأول ، حيث يحد من حجم السلسلة ، لم يكن يعمل مع البايتات. كان قطع السلسلة في الوسط.
لذلك لم أغير المخزن المؤقت إلى البايت.
بعد قولي هذا ، حاولت إجراء التغيير الآخر (الذي أعتقد أنني قد جربته من قبل ، ولكن استمرت في الحصول على خطأ تجميع في توضيح أن كلا المعاملين يجب أن يكون بنفس الحجم.
لقد أصلحت هذا عن طريق إلقاء المخزن المؤقت [ESI] باعتباره بايت! الآن يعمل بشكل مثالي! شكرًا!
mov byte ptr buffer[esi], al