Эти ужасно необычные ЯВУ...

Тема в разделе "LANGS.C", создана пользователем Necromancer13, 10 июн 2008.

  1. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    не могу понять никак одну вещь в ЯВУ. вот, пример на асме. мне надо такой же на Дельфи и С =)

    Код (Text):
    1.        ; ESI - pointer to IMAGE_FILE_HEADER structure
    2.        movzx        ecx,word [esi+6]
    в С и Дельфи ведь нету возможности сделать типа что-то

    num_of_sect = word ptr (*(ifh + 6)) или NumOfSect:= Word Ptr (IFH+6^)...

    ну вы поняли, о чем я... как это делается на ЯВУ?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    var = *(USHORT*)( (UCHAR*)ifh + 6 );

    Си (дельфи собственно тоже в этом плане) очень гибкий с точки зрения памяти. Можно позволять себе любые выкрутасы. Главное - правильно делать type cast указателей +)
     
  3. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    огромное спасибо!
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Наверное, стоит добавить, что на Си так никогда не пишут.
    для этой цели используют обычно структуры.

    Код (Text):
    1. #pragma pack(1)      // отключаем выравнивание полей структур
    2. struct MyStruct
    3. {
    4.     ULONG dword1;    // смещение этого поля 0, размер - 4
    5.     USHORT word1;    // смещение этого поля 4, размер - 2
    6.     USHORT word2;    // смещение этого поля 6, размер - 2
    7. };
    8. #pragma pack()     // восстанавливаем выравнивание
    9.  
    10. ULONG var;
    11. MyStruct *obj;
    тогда var = obj->word2 как раз скомпилируется в movzx eax, word [ecx + 6]
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Почему, очень даже пишут :)
    Если надо такое выполнить один раз - какой смысл объявлять структуру?
     
  6. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    так пишут так или нет? %)

    и кстати... почему не

    Код (Text):
    1. #pragma pack(1)      // отключаем выравнивание полей структур
    2. struct MyStruct
    3. {
    4.     ULONG dword1;    // смещение этого поля 0, размер - 4
    5.     USHORT word1;    // смещение этого поля 4, размер - 2
    6.     USHORT word2;    // смещение этого поля 6, размер - 2
    7. };
    8. #pragma pack()     // восстанавливаем выравнивание
    9.  
    10. ULONG var;
    11. MyStruct obj;
    12.  
    13. var = obj.word2;
    ???


    P.S. и, если можно... код на Дельфи не помешал бы :-[
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Все очень сильно отличается :derisive:
    Код (Text):
    1. {$A-}
    2. type
    3.  MyStruct = record
    4.   dword1 : DWORD;
    5.   word1 : word;
    6.   word2 : word;
    7.  end;
    8. {$A+}
    9.  
    10. DWORD var;
    11. MyStruct obj;
    12.  
    13. var = obj.word2;
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну у меня доступ к указателю на объект, а у тебя сразу к объекту.
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Necromancer13
    Да пожалуйста:
    my_ecx:=(PCardinal(Cardinal(ifh)+6))^

    А вообще тех, кто всерьёз преобразует указатели к целым числам я в детстве убивал из рогатки. Потому что именно из-за таких уродов в итоге и появляются всякие Access violation. Так что более праведный путь, не нарушающий правил структурного программирования - определить тип "указатель на массив байт", преобразовать к нему указатель на целое, найти в этом псевдомассиве адрес шестого элемента и уже из этого адреса вытащить число.

    type TByteArr=array[0..$FFFFF000] of byte;
    PByteArr=^TByteArr;

    и дальше my_ecx:=(PCardinal(@(PByteArray(ifh)^[6])))^
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    на си будет как-то так
    var = *(USHORT*)&((UCHAR*)ifh)[6];
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Типа так:
    num_of_sect = *(unsigned short *)((unsigned char *)ifh+6) ;

    А вообще у Great ошибка и так как написано у него уж точно не пишут :)
    Там надо не struct а union.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    cppasm
    И, прости, нафига?
     
  13. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    хех господа знают только в извращениях =))
    если это справедливо
    то будет наверно как то так
    Код (Text):
    1. dwX = HIWORD(pImh->TimeDateStamp)
    =))
     
  14. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    почему TimeDateStamp? мне нужно количество секций :-P

    а вообще мне так и было надо, как господа и написали... =) только я не думал, что это аж так извращенно будет...

    "movzx ecx,[esi+6]" рулит! ненавижу ЯВУ =(
     
  15. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Necromancer13
    что ж ты хочешь?! на то и типизированность ЯП и контроль типов.
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вкурил я какая у тебя идея :)
    Но так же инизиализировать не удобно.
    Я имел ввиду сделать union между long и двумя short'ами к примеру.
    Т.е. инициализировать через long, а читать куски нужные через short.
    Ну а для смещения +6 можно int64_t с набором из short в union объединить.
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ты просто не привык видимо :)
    Вот какой у тебя тип имеет указатель - аналог esi?
    Объяви
    Код (Text):
    1. unisgned short *esi_ptr;
    и получиш
    Код (Text):
    1. var=esi_ptr[3];
    или
    Код (Text):
    1. var=*(esi_prt+3);
    Ну или если esi_ptr другого типа,то
    Код (Text):
    1. var=*((unsigned short*)esi_ptr+3);
    и все дела
     
  18. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Код (Text):
    1. wSections = pImgHdr->NumberOfSections
    делов та =)))