Сторнирование строки в MASM. Получать странный вывод - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь перевернуть строку в моем классе ассемблера. Я считаю, что у меня есть правильный код, но вывод только "а". Вот код:

; Reverses an input string of at least 10 characters
; Author:  Nathan Smith
; Created: 10/26/2018
; Revisions:
; Date:             Modified by:

INCLUDE Irvine32.inc

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD

.data
myString BYTE "abcdefghij", 0       ; original string
temp BYTE ?                         ; temporary string holder

.code
main PROC
    mov esi, SIZEOF myString    ; source index register
    mov ecx, SIZEOF myString    ; loop counter
    movzx eax, myString         ; moves string to temp holder
    mov temp, al
    mov edi, 0                  ; destination index register
L1:
    mov al, temp[esi]           ; moves last letter to al
    mov myString[edi], al       ; moves letter from al to myString
    dec esi                     ; decreases pointer by 1
    inc edi                     ; increases destination pointer by 1
    loop L1                     ; repeat for length of string

    mov edx, OFFSET myString
    call WriteString
    INVOKE ExitProcess,0
main ENDP
END main

Я не уверен, что происходит.

1 Ответ

0 голосов
/ 27 октября 2018

Длина строки должна учитывать нулевое индексирование, поэтому;

mov   esi, SIZEOF myString - 1         ; Should equal 8
mov   ecx, SIZEOF myString             ; Should equal 9

Завершающий символ 0x0 NULL необходимо записать до конца temp . Чтобы хоть немного оптимизировать, запись 4 NULL работает, так как EDI является только 32-битным регистром.

xor   edi, edi
mov   temp[ecx],edi                    ; Writing 4 chars

; Instead of

mov   BYTE temp[ecx], 0

Единственное, что нужно изменить в вашем цикле;

@@:
mov   al, myString [edi]               ; Read char from source
mov   temp[esi], al                    ; and write to destination
dec   esi
inc   edi
loop  @B

Что случилось с вашей программой, так это

movzx eax, myString
mov   temp, al

Перемещал первый символ источника в первую позицию назначения, и поскольку вы не смогли учесть нулевую индексацию, последующим символом, записанным в temp, был следующий завершающий символ из источника.

...