使用C和内联汇编来反转字符串

时间:2013-11-19 03:11:08

标签: c++ assembly

我正在尝试反转字符串“Hello bob”,然后使用C和内联汇编将其传递给另一个字符串。我正在使用Visual Studio C ++,结果是"Dbob bob"。我在这里做错了什么?

#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;
}

2 个答案:

答案 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
^

我指出每次复制的信件......你可以看到发生了什么。

答案 1 :(得分:-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];
}