Необходимо определить в конце строки наличие '-s'. Длина строки неизвестна. Почему не работает следующий код? Код (Text): cld mov esi,eax ;eax - указатель на строку nextletter: lodsb cmp al,2DH je @F test al,al jz endstr jmp nextletter @@: lodsb cmp al,53H je @F test al,al jz endstr jmp nextletter @@: invoke MessageBox,hwnd,addr ok,0,MB_OK endstr: Может кто-нибудь знает другой способ решения данной задачи?
Получить длину строки с помощью lstrlen, сравнить последний ворд с 's-'. [добавлено] invoke lstrlen,ebx ;в ebx - указатель (так проще) add ebx,eax cmp word ptr [ebx-2],'s-' Я бы так сделал...
Может потому что 53H - это код большой "S", а не маленькой? А вообще в таких случаях INT3 перед cld и все это дело в OllyDbg.
Поэтому, в любом случае, лучше сравнивать с аски-значением ( '-','s' ), компилятор подставит нужное..
Aspire Код (Text): invoke lstrlen,ebx ;в ebx - указатель (так проще) add ebx,eax cmp word ptr [ebx-2],'s-' То, что нужно. Только, можно пояснить зачем add ebx,eax?
vg 'jmp nextletter' во второй части, где идет сравнение с 'S' замени на 'jmp @B'. А вообще, IMHO логичнее сделать так: Код (Text): mov esi, eax .l00p: lodsb cmp al, 0x2D jnz @F lodsb cmp al, 0x53 jz .found @@: or al, al jz .not_found jmp .l00p .found: ;Найдено. Делаешь, что нужно jmp @F .not_found: ;Не найдено. Делаешь, что нужно @@:
Mika0x65 ИМХО совсем не логично. Ваш код найдет первое вхождение "-S" в строку, а не "определит в конце строки наличие '-s' ", как в постановке задачи. Самый логичный вариант, опять таки ИМХО, - тот, который предложил Aspire.