0
我正在編寫一個簡單的程序,它使用內聯安全地檢查給定的單詞是否是迴文。問題是它不會返回正確答案。在調試過程中我發現有一些錯誤ESI寄存器(在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;
}
您最初將8添加到字符串的起始地址(_EDI_),並將該地址放入_ESI_中,即指向字符1你可以從ESI中減去1,這與[EDI + 7]相同,然後[ESI]([EDI + 7])中的字符就是nul(0)終止符。從_ESI_中減去2,而不是一個?替代方案將sizeofstring設置爲7而不是8(忽略長度中的nul終止符)。實際上,通過循環第一次將'a'和'\ 0'進行比較,當然它們是不同的。 –
謝謝。它現在似乎在工作。 –
你爲什麼使用內聯彙編做這件事?如果您正在嘗試學習彙編語言編程,那麼內聯彙編是一件非常糟糕的事情。只需配置Visual Studio以執行MASM,並且您可以繼續使用IDE和調試器。如果你不*試圖學習彙編,那麼用C++編寫代碼會更快更簡單。 –