我在Visual Studio 2010中工作,这里有一些我遇到问题的代码:
void main()
{
int x;
char c1[100]="cd";
char c2[100]="abcdef";
_asm {
lea edx,c2
lea ecx,c1
push edx
push ecx
call subsir
add esp, 8
mov x, eax
}
}
char subsir (char *c1, char *c2)
{
_asm {
mov ecx, c1
mov edx, c2
mov edi, 0
mov esi, 0
start: cmp [edx + edi], 0
je end
mov esi, 0
mov eax, [edx + edi]
cmp eax, [ecx + esi]
.....
这是一个旨在比较2个单词的程序的第一部分。
我遇到的问题是当我做的时候
mov eax, [edx + edi]
eax接收地址而不是实际值。 我通过
测试了这个 cmp eax, 97
应该激活JE指令(97是'a'的ASCII代码)但它没有。如果我做
cmp [edx + edi], 97
它确实激活了JE跳跃。
如果你能告诉我我做错了什么以及如何将实际价值放在EAX而不是地址上,我将非常感激。
答案 0 :(得分:1)
不,它实际上是在[edx + edi]读取内存。问题是它一次读取32位。哪个不好,你正在比较字符串内容。这需要一次比较一个字节。修正:
start: cmp byte ptr [edx + edi], 0
je end
mov esi, 0
mov al, [edx + edi]
cmp al, [ecx + esi]