التجميع - محاولة عكس السلسلة ، لكنه يضيف حرفًا إضافيًا على السلسلة النهائية

StackOverflow https://stackoverflow.com/questions/2308057

سؤال

أنا جديد إلى حد ما في التجميع (والبرمجة بشكل عام ، لأكون صادقًا). أحاول اللعب مع المكدس.الغرض من هذا الرمز:

  • خذ سلسلة ، تقتصر على 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top