не могу понять никак одну вещь в ЯВУ. вот, пример на асме. мне надо такой же на Дельфи и С =) Код (Text): ; ESI - pointer to IMAGE_FILE_HEADER structure movzx ecx,word [esi+6] в С и Дельфи ведь нету возможности сделать типа что-то num_of_sect = word ptr (*(ifh + 6)) или NumOfSect:= Word Ptr (IFH+6^)... ну вы поняли, о чем я... как это делается на ЯВУ?
var = *(USHORT*)( (UCHAR*)ifh + 6 ); Си (дельфи собственно тоже в этом плане) очень гибкий с точки зрения памяти. Можно позволять себе любые выкрутасы. Главное - правильно делать type cast указателей +)
Наверное, стоит добавить, что на Си так никогда не пишут. для этой цели используют обычно структуры. Код (Text): #pragma pack(1) // отключаем выравнивание полей структур struct MyStruct { ULONG dword1; // смещение этого поля 0, размер - 4 USHORT word1; // смещение этого поля 4, размер - 2 USHORT word2; // смещение этого поля 6, размер - 2 }; #pragma pack() // восстанавливаем выравнивание ULONG var; MyStruct *obj; тогда var = obj->word2 как раз скомпилируется в movzx eax, word [ecx + 6]
так пишут так или нет? %) и кстати... почему не Код (Text): #pragma pack(1) // отключаем выравнивание полей структур struct MyStruct { ULONG dword1; // смещение этого поля 0, размер - 4 USHORT word1; // смещение этого поля 4, размер - 2 USHORT word2; // смещение этого поля 6, размер - 2 }; #pragma pack() // восстанавливаем выравнивание ULONG var; MyStruct obj; var = obj.word2; ??? P.S. и, если можно... код на Дельфи не помешал бы :-[
Все очень сильно отличается Код (Text): {$A-} type MyStruct = record dword1 : DWORD; word1 : word; word2 : word; end; {$A+} DWORD var; MyStruct obj; var = obj.word2;
Necromancer13 Да пожалуйста: my_ecx:=(PCardinal(Cardinal(ifh)+6))^ А вообще тех, кто всерьёз преобразует указатели к целым числам я в детстве убивал из рогатки. Потому что именно из-за таких уродов в итоге и появляются всякие Access violation. Так что более праведный путь, не нарушающий правил структурного программирования - определить тип "указатель на массив байт", преобразовать к нему указатель на целое, найти в этом псевдомассиве адрес шестого элемента и уже из этого адреса вытащить число. type TByteArr=array[0..$FFFFF000] of byte; PByteArr=^TByteArr; и дальше my_ecx:=(PCardinal(@(PByteArray(ifh)^[6])))^
Типа так: num_of_sect = *(unsigned short *)((unsigned char *)ifh+6) ; А вообще у Great ошибка и так как написано у него уж точно не пишут Там надо не struct а union.
хех господа знают только в извращениях =)) если это справедливо то будет наверно как то так Код (Text): dwX = HIWORD(pImh->TimeDateStamp) =))
почему TimeDateStamp? мне нужно количество секций :-P а вообще мне так и было надо, как господа и написали... =) только я не думал, что это аж так извращенно будет... "movzx ecx,[esi+6]" рулит! ненавижу ЯВУ =(
Вкурил я какая у тебя идея Но так же инизиализировать не удобно. Я имел ввиду сделать union между long и двумя short'ами к примеру. Т.е. инициализировать через long, а читать куски нужные через short. Ну а для смещения +6 можно int64_t с набором из short в union объединить.
Ты просто не привык видимо Вот какой у тебя тип имеет указатель - аналог esi? Объяви Код (Text): unisgned short *esi_ptr; и получиш Код (Text): var=esi_ptr[3]; или Код (Text): var=*(esi_prt+3); Ну или если esi_ptr другого типа,то Код (Text): var=*((unsigned short*)esi_ptr+3); и все дела