cmp word ptr[esi+ecx],0x2020 как добиться от cl.exe такой инструкции? if (*((short*) lpSource+i) == 0x2020) - это не идёт. Превращается в соответсвии с дурной привычкой подставлять размерность операнда в такое: cmp word ptr[esi+ecx*2],0x2020 Два раза проверять на *((char*) lpSource+i) == 0x20 && *((char*) lpSource+i+1) == 0x20 - на это он выдает буквально два сравнения cmp byte ptr[esi+ecx],20 je _label cmp byte ptr[esi+ecx+1],20 je _label Как-то должна генериться одна инструкция для word ptr?
Код (Text): int foo(char *src, int i) { return *((short *)(src + i)) == 0x2020 ? 1 : 0; } _TEXT SEGMENT _src$ = 8 ; size = 4 _i$ = 12 ; size = 4 _foo PROC NEAR ; File c:\t.c ; Line 4 mov ecx, DWORD PTR _i$[esp-4] mov edx, DWORD PTR _src$[esp-4] xor eax, eax cmp WORD PTR [edx+ecx], 8224 ; 00002020H sete al ; Line 5 ret 0 _foo ENDP _TEXT ENDS
Код без купюр (i не может быть больше 28): Код (Text): void copy_name(LPSTR lpDest, LPSTR lpSource){ [b]int i=0;[/b] while (i < 28){ *((char*) lpDest+i) = *((char*) lpSource+i); if (*((short*) lpSource+i) == 0x2020) break; i++; } *((char*) lpDest+i) = 0; } ====================================================================== = 00401276 /$ 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] 0040127A |. 53 PUSH EBX 0040127B |. 56 PUSH ESI 0040127C |. 57 PUSH EDI 0040127D |. 8B7C24 14 MOV EDI,DWORD PTR SS:[ESP+14] 00401281 |. 8BF7 MOV ESI,EDI 00401283 |. 33C9 XOR ECX,ECX 00401285 |. 8BC2 MOV EAX,EDX 00401287 |. 2BF2 SUB ESI,EDX 00401289 |> 8A1C06 /MOV BL,BYTE PTR DS:[ESI+EAX] 0040128C |. 8818 |MOV BYTE PTR DS:[EAX],BL 0040128E |. 66:813C4F 2020 |CMP WORD PTR DS:[[b]EDI+ECX*2[/b]],2020 00401294 |. 74 07 |JE SHORT FoneBook.0040129D 00401296 |. 41 |INC ECX 00401297 |. 40 |INC EAX 00401298 |. 83F9 1C |CMP ECX,1C 0040129B |.^7C EC \JL SHORT FoneBook.00401289 0040129D |> 5F POP EDI 0040129E |. 5E POP ESI 0040129F |. C60411 00 MOV BYTE PTR DS:[ECX+EDX],0 004012A3 |. 5B POP EBX 004012A4 \. C3 RETN Не получается. Хотя i как и у тебя, int.
cresta Ты хочешь проверить не являются ли два байта начиная с i-того двумя пробелами? Если да, то надо писать *((short*) (lpSource+i)).
cresta Если так: Код (Text): void copy_name2(char *dst, char *src) { int i; for (i = 28; i && 0x2020 != *((short *) src); i--) *dst++ = *src++; *dst = 0; return ; }
q_q Блин, изначально именно так и было: Остальной код видимо сбоил, поэтому в поисках причины и поубирал эти скобки. Поставил скобки на место - получается CMP WORD PTR DS:[EAX],2020 Сам положил себе грабли Спасибо