Проблема со строками в ассемблере [новичок] - PullRequest
0 голосов
/ 18 января 2011

Я работаю в 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 является кодом ASCII для 'a'), но это не так. Если я сделаю

      cmp [edx + edi], 97

активирует прыжок JE.

Буду очень признателен, если вы скажете мне, что я делаю не так, и как я могу указать фактическое значение в EAX вместо адреса.

1 Ответ

1 голос
/ 18 января 2011

Нет, это на самом деле чтение памяти в [edx + edi].Проблема в том, что он читает 32 бита за раз.Что не хорошо, вы сравниваете содержимое строки.Это требует сравнения одного байта за раз.Исправить:

start: cmp byte ptr [edx + edi], 0
je end
mov esi, 0
mov al, [edx + edi]
cmp al, [ecx + esi]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...