Код (Text): struct FOURTH member1 dd ?; union member2 dd ? member3 dd ?; ends ends Зачем вообще придумали этот union? Как им пользоваться? Сколько я не читал мануал по flatassembleru я так и не смог понять, как задавать значение member3, а если ты к нему обращаешься он всё равно выдает значение которое у member2; Например: Код (Text): data:... four FOURTH 1,2; code:.. mov eax,[four.member3]; <===== eax=2,
Один из частых примеров использования union - когда есть битовые флаги в регистрах. Можно сделать структуру содержащую разные регистры и одно из полей - регистр и union из флагов для него. Можно обратиться как к целому регистру, так и к конкретному флагу.
Е Если не сложно, хотелось бы конечно пример и желательно в формате Fasm. На словах не понятно как это реализуется, особенно обращение к отдельному биту. Со слов Indy_ , union дает одному и тому же адресу разные названия меток.
На плюсах будет так Код (C++): typedef struct { union { LONGLONG val; struct { LONG pmcEn0 : 1; LONG pmcEn1 : 1; LONG pmcEn2 : 1; LONG pmcEn3 : 1; LONG res1 : 28; LONG fixedCtrEn0 : 1; LONG fixedCtrEn1 : 1; LONG fixedCtrEn2 : 1; LONG res2 : 29; }; }; } IA32_PERF_GLOBAL_CTRL; В формате фасма скорее всего не сделаю, там нет битфилдов - да и зачем - если есть инструкции установки нужных битов. Я просто рассказал пример использования. А так да. Можно обратиться сразу ко всему регистру. Либо к какой то ее части. Например импровизация: Код (ASM): struct EAX union val dd ? struct HI_PART dw ? AX_PART dw ? ends ends ends struct RAX union val dq ? struct HI_PART dd ? EAX_PART EAX <?> ends ends ends .data reg_val RAX 0 .code start: mov rax, 0x1122334455667788 mov [reg_val], rax mov ebx, [reg_val.HI_PART] mov ebx, [reg_val.EAX_PART.val] mov bx, word [reg_val.EAX_PART.HI_PART] mov bx, word [reg_val.EAX_PART.AX_PART]
Спасибо за пример, всё стало более понятно. Но что бы обращаться к регистру как на картинке надо поменять местами LOW и HIGH части безымянных структур. Код (Text): struct EAX union val dd ? struct AX_PART dw ? HI_PART dw ? ends ends ends struct RAX union val dq ? struct EAX_PART EAX <?> HI_PART dd ? ends ends ends