Почему символ новой строки автоматически добавляется в строку? - PullRequest
0 голосов
/ 09 апреля 2019

Следующая программа ведет себя очень странно.

После выполнения \n автоматически добавляется в конец строки с именем str_low.

Я начал отладку с первой строки _main и проверил конецадрес строки с помощью следующей команды:

print *(char *) 0x...... 

и обнаружил, что последний символ был \n вместо \0.

Что может бытьпричина?

extern _printf
extern _putchar

section .data
    str_form:      db "%s", 10, 0
        str_low:       db "abxyz", 10, 0        

section .text
    global  _main

_main:
    mov     ebp, esp; for correct debugging
    push    ebp
    mov     ebp, esp

    push   str_low
    call  _reversepairs
    add esp, 4

    push str_low
    call _PrintString
    add esp,4

    mov     esp, ebp
    pop     ebp
    ret

_reversepairs:
    ; entry sequence
    push    ebp             ; save the previous value of ebp for the benefi$
    mov     ebp, esp        ; copy esp -> ebp so that ebp can be used as a $
    sub     esp, 4          ; create 1 local variables

    ;--------------------------;
    ; [ebp+8]== string-address ;
    ;--------------------------; 
    xor eax, eax 
    mov eax, dword[ebp+8]; obtain string address

    ;-------------------------;
    ; [ebp-4] == loop counter ;
    ;-------------------------;   
    mov [ebp-4], eax ; save address for loop counting

    while_cs:
        mov eax, dword[ebp-4];obtain current char address
        xor ecx, ecx
        mov cl, byte[eax];char ch = str[i];

        cmp ecx, 0; ch <?> '\0'
        je  while_exit_cs ; if(ch == '\0') break;

        ; char cl = newString[i + 1];
        mov eax, dword[ebp-4]; obtain current char address
        xor ecx, ecx
        mov cl, byte[eax+1]; obtain next char

        cmp cl, 0
        je  while_exit_cs

        xor edx, edx
        mov dl, byte[eax]; obtain current char
        mov byte[eax+1], dl  ; ------
        mov byte[eax], cl    ; swap       


    increment_i:
        mov eax, dword[ebp-4]
        inc eax ;------
        inc eax ; i=i+2;
        mov dword[ebp-4], eax
        mov eax, dword[ebp-4]; make sure char was assinged properly      

        jmp     while_cs   ; iterate through while 
    while_exit_cs:                

    xor eax, eax 
    mov eax, dword[ebp+8]; return str address

    ; exit sequence
    add     esp, 4  ; destroy local variable
    mov     esp, ebp ; restore esp with ebp
    pop     ebp ; remove ebp from stack
    ret ; return the value of temporary variable 


_PrintString:
    push    ebp
    mov     ebp, esp

    mov     eax, dword[ebp+8]

    push    eax
    push    str_form
    call    _printf
    add     esp, 8 

    mov     esp, ebp
    pop     ebp
    ret
...