Fasm структура с использованием Union

Тема в разделе "WASM.BEGINNERS", создана пользователем CrawlUp, 7 мар 2018.

  1. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Код (Text):
    1.          struct FOURTH
    2.             member1                         dd ?;
    3.              union      
    4.                 member2                     dd ?
    5.                 member3                     dd ?;
    6.              ends
    7.          ends
    Зачем вообще придумали этот union?
    Как им пользоваться?
    Сколько я не читал мануал по flatassembleru я так и не смог понять, как задавать значение member3, а если ты к нему обращаешься он всё равно выдает значение которое у member2;
    Например:
    Код (Text):
    1.                                data:...
    2.                                           four FOURTH 1,2;
    3.                                code:..
    4.                                            mov eax,[four.member3];  <===== eax=2,
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    CrawlUp,

    По одному адресу могут располагаться разные структуры. Для этого и придумали.
     
    CrawlUp нравится это.
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Один из частых примеров использования union - когда есть битовые флаги в регистрах. Можно сделать структуру содержащую разные регистры и одно из полей - регистр и union из флагов для него. Можно обратиться как к целому регистру, так и к конкретному флагу.
     
  4. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Е
    Если не сложно, хотелось бы конечно пример и желательно в формате Fasm. На словах не понятно как это реализуется, особенно обращение к отдельному биту. Со слов Indy_ , union дает одному и тому же адресу разные названия меток.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    На плюсах будет так
    Код (C++):
    1. typedef struct {
    2.   union {
    3.     LONGLONG val;
    4.     struct {
    5.       LONG pmcEn0 : 1;
    6.       LONG pmcEn1 : 1;
    7.       LONG pmcEn2 : 1;
    8.       LONG pmcEn3 : 1;
    9.       LONG res1 : 28;
    10.  
    11.       LONG  fixedCtrEn0 : 1;
    12.       LONG  fixedCtrEn1 : 1;
    13.       LONG  fixedCtrEn2 : 1;
    14.       LONG  res2 : 29;
    15.     };
    16.   };
    17. } IA32_PERF_GLOBAL_CTRL;
    В формате фасма скорее всего не сделаю, там нет битфилдов - да и зачем - если есть инструкции установки нужных битов.
    Я просто рассказал пример использования.

    А так да. Можно обратиться сразу ко всему регистру. Либо к какой то ее части. Например импровизация:

    Код (ASM):
    1.  
    2.        struct EAX
    3.             union
    4.                 val dd ?
    5.                 struct
    6.                        HI_PART dw ?
    7.                        AX_PART dw ?
    8.                 ends
    9.             ends
    10.          ends
    11.  
    12.          struct RAX
    13.             union
    14.                 val dq ?
    15.                 struct
    16.                        HI_PART dd ?
    17.                        EAX_PART EAX <?>
    18.                 ends
    19.             ends
    20.          ends
    21.  
    22.  
    23. .data
    24.        reg_val RAX 0
    25.  
    26. .code
    27.  
    28.   start:
    29.         mov rax, 0x1122334455667788
    30.  
    31.         mov [reg_val], rax
    32.  
    33.         mov ebx, [reg_val.HI_PART]
    34.         mov ebx, [reg_val.EAX_PART.val]
    35.  
    36.         mov bx, word [reg_val.EAX_PART.HI_PART]
    37.         mov bx, word [reg_val.EAX_PART.AX_PART]
    38.  
     
    CrawlUp нравится это.
  6. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Спасибо за пример, всё стало более понятно. Но что бы обращаться к регистру как на картинке надо поменять местами LOW и HIGH части безымянных структур.
    [​IMG]

    Код (Text):
    1.          struct EAX
    2.              union
    3.                 val dd ?
    4.                  struct
    5.                     AX_PART dw ?
    6.                     HI_PART dw ?  
    7.                  ends
    8.              ends
    9.          ends
    10.          struct RAX
    11.              union
    12.                 val dq ?
    13.                  struct
    14.                     EAX_PART EAX <?>
    15.                     HI_PART dd ?                  
    16.                  ends
    17.              ends
    18.          ends