Что за FF FF FF лепит MVS?

Тема в разделе "WASM.ASSEMBLER", создана пользователем sasha_s, 23 янв 2009.

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Может я не в ту ветку пишу, но мне кажется что вопросс именно к знатокам АСМа.

    есть С код слудующего вида:

    Код (Text):
    1.         Uint32_t crcSum = 0;
    2.         Uint32_t strLenInWCHAR = wcslen(wbuf);
    3.         for (i = 0; i < strLenInWCHAR; ++i)
    4.         {
    5.             if (wbuf[i] >= 'A' && wbuf[i] <= 'Z')
    6.             {
    7.                 wbuf[i] += (L'a' - L'A');
    8.             }
    9.             crcSum = A*crcSum + ((char*)&wbuf[i])[0];
    10.             crcSum = A*crcSum + ((char*)&wbuf[i])[1];
    11.         }
    А MVS 6.0 его кодирует в следующие команды:


    46: Uint32_t crcSum = 0;

    00403DFD C7 85 30 FF FF FF 00 mov dword ptr [crcSum],0

    47: Uint32_t strLenInWCHAR = wcslen(wbuf);

    00403E07 8D 85 64 FF FF FF lea eax,[ebp-9Ch]
    00403E0D 50 push eax
    00403E0E E8 18 22 00 00 call _wcslen (0040602b)
    00403E13 83 C4 04 add esp,4
    00403E16 89 85 2C FF FF FF mov dword ptr [strLenInWCHAR],eax

    48: for (i = 0; i < strLenInWCHAR; ++i)

    00403E1C C7 85 50 FF FF FF 00 mov dword ptr [ebp-0B0h],0
    00403E26 EB 0F jmp Func+0A7h (00403e37)
    00403E28 8B 8D 50 FF FF FF mov ecx,dword ptr [ebp-0B0h]
    00403E2E 83 C1 01 add ecx,1
    00403E31 89 8D 50 FF FF FF mov dword ptr [ebp-0B0h],ecx
    00403E37 8B 95 50 FF FF FF mov edx,dword ptr [ebp-0B0h]
    00403E3D 3B 95 2C FF FF FF cmp edx,dword ptr [strLenInWCHAR]
    00403E43 0F 83 8D 00 00 00 jae Func+146h (00403ed6)

    49: {
    50: if (wbuf >= 'A' && wbuf <= 'Z')

    00403E49 8B 85 50 FF FF FF mov eax,dword ptr [ebp-0B0h]
    00403E4F 33 C9 xor ecx,ecx
    00403E51 66 8B 8C 45 64 FF FF mov cx,word ptr [ebp+eax*2-9Ch]
    00403E59 83 F9 41 cmp ecx,41h
    00403E5C 7C 35 jl Func+103h (00403e93)
    00403E5E 8B 95 50 FF FF FF mov edx,dword ptr [ebp-0B0h]
    00403E64 33 C0 xor eax,eax
    00403E66 66 8B 84 55 64 FF FF mov ax,word ptr [ebp+edx*2-9Ch]
    00403E6E 83 F8 5A cmp eax,5Ah
    00403E71 7F 20 jg Func+103h (00403e93)

    51: {
    52: wbuf += (L'a' - L'A');

    00403E73 8B 8D 50 FF FF FF mov ecx,dword ptr [ebp-0B0h]
    00403E79 66 8B 94 4D 64 FF FF mov dx,word ptr [ebp+ecx*2-9Ch]
    00403E81 66 83 C2 20 add dx,20h
    00403E85 8B 85 50 FF FF FF mov eax,dword ptr [ebp-0B0h]
    00403E8B 66 89 94 45 64 FF FF mov word ptr [ebp+eax*2-9Ch],dx

    53: }
    54: crcSum = A*crcSum + ((char*)&wbuf)[0];

    00403E93 8B 8D 30 FF FF FF mov ecx,dword ptr [crcSum]
    00403E99 6B C9 1F imul ecx,ecx,1Fh
    00403E9C 8B 95 50 FF FF FF mov edx,dword ptr [ebp-0B0h]
    00403EA2 0F BE 84 55 64 FF FF movsx eax,byte ptr [ebp+edx*2-9Ch]
    00403EAA 03 C8 add ecx,eax
    00403EAC 89 8D 30 FF FF FF mov dword ptr [crcSum],ecx

    55: crcSum = A*crcSum + ((char*)&wbuf)[1];

    00403EB2 8B 8D 30 FF FF FF mov ecx,dword ptr [crcSum]
    00403EB8 6B C9 1F imul ecx,ecx,1Fh
    00403EBB 8B 95 50 FF FF FF mov edx,dword ptr [ebp-0B0h]
    00403EC1 0F BE 84 55 65 FF FF movsx eax,byte ptr [ebp+edx*2-9Bh]
    00403EC9 03 C8 add ecx,eax
    00403ECB 89 8D 30 FF FF FF mov dword ptr [crcSum],ecx

    56: }

    00403ED1 E9 52 FF FF FF jmp Func+98h (00403e28)

    Так что это за "FF FF FF"?
    Оптимизация отключена.
     
  2. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    8B 95 50 FF FF FF mov edx,dword ptr [ebp-0B0h]

    в данном случае это просто 50FFFFFF в коде = FFFFFF50h = -0B0h

    E9 52 FF FF FF jmp Func+98h (00403e28)
    Здесь тоже просто отрицательное смещение

    Вобщем читай литературу по опкодам
     
  3. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Примного благодарен!
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Адресация [esp + offset] более уместна для локальных переменных. Это просто старый компилятор.