Вложенные STRUCT и UNION на ассемблере x86 - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь реализовать структуру данных переменного тока на языке ассемблера для сетевого приложения.ПРИМЕЧАНИЕ: это для проекта класса Assembly, поэтому он должен быть в ассемблере !!!

Вот структура c из MS docs:

typedef struct in_addr {
    union {
        struct {
          UCHAR s_b1;
          UCHAR s_b2;
          UCHAR s_b3;
          UCHAR s_b4;
    } S_un_b;
    struct {
          USHORT s_w1;
          USHORT s_w2;
    } S_un_w;
        ULONG S_addr;
    } S_un;
} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;

Вот код на языке ассемблера:

in_addr STRUCT
    UNION S_un
        S_un_b STRUCT      ; an error here!
            s_b1 BYTE ? 
            s_b2 BYTE ?
            s_b3 BYTE ?
            s_b4 BYTE ?    
        S_un_b ENDS        ; an error here!

        S_un_w STRUCT      ; an error here!
            s_w1 WORD ? 
            s_w2 WORD ? 
        S_un_w ENDS        ; an error here!

        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

Когда я пытаюсь собрать, я получаюсообщение об ошибке (см. комментарии выше), являющееся либо синтаксической ошибкой (в первых 3 случаях), либо «непревзойденным вложением блоков» в качестве последнего.Я пытался просмотреть документацию Intel о том, может ли структура быть определена в объединении, но я не смог найти никакой определенной информации.

Я буду признателен за документацию Intel / MS, а также за решение, если не больше.Я новичок в языке ассемблера, хотя это становится странным хобби, странно.

1 Ответ

0 голосов
/ 18 ноября 2018

Для любого, у кого есть подобный вопрос, способ определения союза, который содержит структуры, состоит в том, чтобы определить структуры заранее.

Вот то, что у меня было изначально:

in_addr STRUCT
    UNION S_un
        S_un_b STRUCT      
            s_b1 BYTE ? 
            s_b2 BYTE ?
            s_b3 BYTE ?
            s_b4 BYTE ?    
        S_un_b ENDS        

        S_un_w STRUCT     
            s_w1 WORD ? 
            s_w2 WORD ? 
        S_un_w ENDS        

        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

Это не скомпилируется, по крайней мере в маске.Вот что можно сделать:

S_un_b STRUCT
    s_b1 BYTE ? 
    s_b2 BYTE ? 
    s_b3 BYTE ? 
    s_b4 BYTE ? 
S_un_b ENDS

S_un_w STRUCT
    s_w1 WORD ? 
    s_w2 WORD ? 
S_un_w ENDS

in_addr STRUCT
    UNION S_un
        S_un_b<>
        S_un_w<>
        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

Чтобы затем использовать эту структуру, используйте обычные операции над структурами:

Например:

; To set S_addr
mov <in_addr instance name>.<union_name>.S_addr, 0h

Можно применять аналогичные принципы.чтобы получить доступ к байтов и слов.

Надеюсь, это поможет кому-то с таким же вопросом.

...