2017-01-07 2 views
0

Я пишу простую программу, которая использует inline-асинхронно, чтобы проверить, является ли данное слово палиндром. Проблема в том, что он не возвращает правильных ответов. Во время отладки я обнаружил, что там что-то не так с ЭРИ регистра (значение в al правильно ('a'), но в bl это не (0). Я не уверен, что я делаю неправильно.встроенная сборка - проверьте, является ли слово палиндром

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char s[] = "arabara"; 
    int sizeofstring = 8; // size of s[] 
    int x = 0; 
    int y = 1; //flag when is_palindrome 
    __asm 
    { 
     lea edi, s 
     mov esi, edi 
     add esi, sizeofstring 
     dec esi //point to the last char 

     mov ecx, sizeofstring 
     cmp ecx, 1 
     je is_palindrome //single char is always a palindrome 

     shr ecx, 1 //divide by 2 

nextchar: 
     mov al, [edi] 
     mov bl, [esi] 
     cmp al, bl 
     jne stop 
     inc edi 
     dec esi 
     loop nextchar 

    is_palindrome: 
    mov eax, y 
    mov x, eax //change flag to 1 

stop: 
    } 

    cout << x << endl; //shoud print 1 when palindrome 
    system("pause"); 
    return 0; 
} 
+1

Вы первоначально добавили 8 к стартовому адресу (_EDI_) строки и поместили этот адрес в _ESI_. Это указатель на символ один минус терминатор nul (0). Вы вычитаете 1 из ESI, который совпадает с [EDI + 7]. Затем символ в [ESI] ([EDI + 7]) является терминатором nul (0). Возможно, вы имели в виду вычесть 2 из _ESI_, а не только один? было бы установлено 'sizeofstring' равным 7 вместо 8 (игнорируя nul terminator по длине). Фактически, первый раз через вашу петлю вы сравниваете «a» с «\ 0», и они, разумеется, разные. –

+0

Спасибо. Кажется, сейчас он работает. –

+0

Почему вы делаете это с помощью встроенной сборки? Если вы пытаетесь изучить программирование на ассемблере, тогда встроенная сборка - очень плохая вещь для использования. Просто настройте Visual Studio на выполнение MASM, и вы можете продолжать использовать IDE и отладчик. Если вы * не * пытаетесь изучить сборку, тогда было бы намного быстрее и проще писать код на C++. –

ответ

0

Вы установили sizeofstring в 8, но ваша строка «arabara» имеет семь символов.

+0

'' arabara ''длиной 8 символов. Не забывайте о завершающем нулевом знаке – NathanOliver

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