2013-11-19 4 views
0

Я пытаюсь изменить строку «Hello bob», а затем передать ее в другую строку, используя C и встроенную сборку. Я использую Visual Studio C++, и результат "Dbob bob". Что я здесь делаю неправильно?Обратный строки с использованием C и встроенной сборки

#include "stdafx.h" 
#include <stdio.h> 
#include <string.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char source[10] = "Hello bob"; 
    char dest[] = ""; 

    int i; 
    for (i = 0; i < 10; ++i) 
    { 
     source[i] = source[10-i-1]; 
    } 

    __asm 
    { 
     lea esi, source 
     cld 
     lodsb 

     lea edi, dest 
     mov eax, 0xFF 
     stosb 

     lea edi, dest 
     cld 
     mov ecx, length source 
     mov eax, 0x44 
     rep stosb 


     lea esi, source 
     lea edi, dest 
     mov ecx, length source 
     cld 
     rep movsb 
    } 

    printf("%s",source); 
    printf("%s" ,"\n"); 
    printf("%s",dest); 
    getchar(); 
    return 0; 
} 

ответ

1

Вы переписываете вторую часть строки, прежде чем добираться до нее. Вам нужно выполнить «полный обмен» (a->temp; b->a; temp->b;). Вместо

for (i = 0; i < 10; ++i) 
{ 
    source[i] = source[10-i-1]; 
} 

легко исправить было бы изменить его

char dest[10]; 
for (i = 0; i < 10; ++i) 
{ 
    dest[i] = source[10-i-1]; 
} 

Глядя на это с другой стороны, если вы начинаете с "Hello Bob", вы получите:

Hello Bob 
     ^
bello Bob 
    ^
bollo Bob 
    ^
boBlo Bob 
    ^
boB o Bob 
    ^
boB o Bob 
^
boB o Bob 
^
boB o Bob 
^ 
boB o Bob 
^ 

Я указываю письмо, которое каждый раз копируется ... вы можете видеть, что происходит.

+0

Это было полезно, спасибо. – user3007093

-1

Вы делаете это намного сложнее, чем это должно быть:

const unsigned int SIZE = 11; 
char source[SIZE] = "Hello Bob"; 
for (unsigned int i = 0; i < SIZE/2; ++i) // you only need to go to the halfway point 
{ 
    // std::swap(source[i], source[SIZE - i - 1]); 
    char temp = source[i]; 
    source[i] = source[SIZE - i - 1]; 
    source[SIZE - i - 1] = temp; 
} 

Это будет полностью изменить строку на месте. Если вы хотите сделать это в другом массиве:

const unsigned int SIZE = 11; 
char source[SIZE] = "Hello Bob"; 
char dest[SIZE] = {0}; 
for (unsigned int i = 0; i < SIZE; ++i) 
{ 
    dest[i] = source[SIZE - i - 1]; 
} 
+0

@downvoter: помогите объяснить свой голос? –

Смежные вопросы