Как прописывается 16-байтная переменная на masm32

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 16 сен 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Целочисленные переменные в MASM32 могут быть:

    1-байтовые (8 бит), обозначаются byte или db
    2-байтовые (16 бит), обозначаются word или dw
    4-байтовые (32 бит), обозначаются dword или dd
    6-байтовые (48 бит), обозначаются fword или df
    8-байтовые (64 бит), обозначаются qword или dq
    10-байтовые (80 бит), обозначаются tbyte или dt
    16-байтовые (128 бит), обозначаются oword или ???

    в этом списке у всех кроме 16-байтовой переменной есть
    маленький эквивалент размера
    большой эквивалент размера (16 байт) это - oword
    можно например задать 16-байтную переменную

    .data?
    Temp oword ?
    .code

    а вот как обозначается маленький эквивалент этого размера
    еще раз подчеркну именно на синтаксисе - masm32
     
  2. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Если следовать дедуктивным путём, сравнив все названия, вероятно получается oword - do , можно ведь проверить собрав пример минимальный, хотя do я ещё нигде не встречал =))))
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    masm32 не знает такого двух-символа - do
    надо пологать наверное в синтаксисе masm32 такой двух-символ по умолчанию не предусмотрен
    можно конечно самому объявить (do typedef oword) но я думаю это лишнее
    я просто думал а вдруг он по умолчанию существует
    но как оказалось нет
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    assch,
    в ml64 oword = 16 байтов
    Код (ASM):
    1. .data
    2. a oword 99999999999999999999999999999999h
    3. .code
    4. mov rax,qword ptr a
    5. mov qword ptr a+8,rbx
    a do 99999999999999999999999999999999h - error A2008:syntax error : a
     
    yashechka нравится это.
  5. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Да, так и есть, я уже сам проверил на разных версиях, в мсдн я не увидел в справке .. Изучаем дальше из исходников -

    Код (C):
    1. USHORT dirsize[] = {
    2. /* I_BYTE */    1,
    3. /* I_DWORD */    4,
    4. /* I_FAR */    CSFAR,
    5. /* I_NEAR */    CSNEAR,
    6. /* I_QWORD */    8,
    7. /* I_TBYTE */    10,
    8. /* I_WORD */    2,
    9. /* I_FWORD */    6,
    10. /* I_PROC */    CSNEAR
    11. };
    и

    Код (ASM):
    1. globalW macro n,i,s
    2. ?aD <n>,2
    3. ?dd n,1,<WORD>,<DW>,<i>,<s>
    4. endm
    5. globalD macro n,i,s
    6. ?aD <n>,4
    7. ?dd n,1,<DWORD>,<DD>,<i>,<s>
    8. endm
    9. globalQ macro n,i,s
    10. ?aD <n>,8
    11. ?dd n,1,<QWORD>,<DQ>,<i>,<s>
    12. endm
    13. globalT macro n,i,s
    14. ?aD <n>,10
    15. ?dd n,1,<TBYTE>,<DT>,<i>,<s>
    16. endm
    17. if sizeC
    18. globalCP macro n,i,s
    19. globalD n,<i>,<s>
    20. endm
    21. else
    22. globalCP macro n,i,s
    23. globalW n,<i>,<s>
    24. endm
    25. endif
    26. if sizeD
    27. globalDP macro n,i,s
    28. globalD n,<i>,<s>
    29. endm
    30. else
    31. globalDP macro n,i,s
    32. globalW n,<i>,<s>
    33. endm
    34. endif
    35. endif
    36. ifndef ?NOSTATIC
    37. staticB macro n,i,s
    38. ?aD <n>,1
    39. ?dd n,0,<BYTE>,<DB>,<i>,<s>
    40. endm
    41. staticW macro n,i,s
    42. ?aD <n>,2
    43. ?dd n,0,<WORD>,<DW>,<i>,<s>
    44. endm
    45. staticD macro n,i,s
    46. ?aD <n>,4
    47. ?dd n,0,<DWORD>,<DD>,<i>,<s>
    48. endm
    49. staticQ macro n,i,s
    50. ?aD <n>,8
    51. ?dd n,0,<QWORD>,<DQ>,<i>,<s>
    52. endm
    53. staticT macro n,i,s
    54. ?aD <n>,10
    55. ?dd n,0,<TBYTE>,<DT>,<i>,<s>
    56. endm
    Скорее всего они не успели описать всё, а сами сокращения это часть макрообработки в ассемблере .. т.к. в инклудах студии нет таких описателей .. Далее дизасм самого мл64 ..

    Код (ASM):
    1. .rdata:000000014003E948                 dq offset byte_14006639F
    2. .rdata:000000014003E950                 dq offset aInteger      ; "integer"
    3. .rdata:000000014003E958                 dq offset aByte_3       ; "byte"
    4. .rdata:000000014003E960                 dq offset aWord_1       ; "word"
    5. .rdata:000000014003E968                 dq offset aDword        ; "dword"
    6. .rdata:000000014003E970                 dq offset aFword_0      ; "fword"
    7. .rdata:000000014003E978                 dq offset aQword_0      ; "qword"
    8. .rdata:000000014003E980                 dq offset aTbyte_1      ; "tbyte"
    9. .rdata:000000014003E988                 dq offset aSbyte        ; "sbyte"
    10. .rdata:000000014003E990                 dq offset aSword        ; "sword"
    11. .rdata:000000014003E998                 dq offset aSdword       ; "sdword"
    12. .rdata:000000014003E9A0                 dq offset aSqword       ; "sqword"
    13. .rdata:000000014003E9A8                 dq offset aOword        ; "oword"
    14. .rdata:000000014003E9B0                 dq offset aReal4        ; "real4"
    15. .rdata:000000014003E9B8                 dq offset aReal8        ; "real8"
    16. .rdata:000000014003E9C0                 dq offset aReal10       ; "real10"
    17. .rdata:000000014003E9C8                 dq offset aMmword       ; "mmword"
    18. .rdata:000000014003E9D0                 dq offset aXmmword_0    ; "xmmword"
    19. .rdata:000000014003E9D8                 dq offset aYmmword      ; "ymmword"
    и далее мы находим вот такие строки

    Код (ASM):
    1. .data:000000014006B773                 dq offset dbRE
    2. .data:000000014006B77B                 dq offset dwRE
    3. .data:000000014006B783                 dq offset ddRE
    4. .data:000000014006B78B                 dq offset dfRE
    5. .data:000000014006B793                 dq offset dqRE
    6. .data:000000014006B79B                 dq offset dtRE
    7. .data:000000014006B7A3                 dq offset alignRE
    8. .data:000000014006B7AB                 dq offset evenRE
    9. .data:000000014006B7B3                 dq offset procRE
    10. .data:000000014006B7BB                 dq offset endpRE
    11. .data:000000014006B7C3                 dq offset protoRE
    12. .data:000000014006B7CB                 dq offset labelDirRE
    13. .data:000000014006B7D3                 dq offset orgRE
    14. .data:000000014006B7DB                 dq offset publicRE
    15. .data:000000014006B7E3                 dq offset extrnRE
    16. .data:000000014006B7EB                 dq offset commRE
    17. .data:000000014006B7F3                 dq offset extrnRE
    18. .data:000000014006B7FB                 dq offset recordRE
    Наверное можно сделать вывод, что сокращений для последующих директив просто не существует =) А описываются они как и говорилось выше через макрообработку ... Чтобы всё было как всегда нам стоит написать собственный макрос который будет обрабатывать всё по табличке к примеру

    Код (ASM):
    1. 1 byte (8 bit): byte, DB
    2. 2 bytes (16 bit): word, DW
    3. 4 bytes (32 bit): dword, DD
    4. 8 bytes (64 bit): qword, DQ
    5. 10 bytes (80 bit): tword, DT
    6. 16 bytes (128 bit): oword, DO
    7. 32 bytes (256 bit): yword, DY
    8. 64 bytes (512 bit): zword, DZ
    Не включая конечно то, что мы уже имеем ...
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    IMHO, DO такое же служебное слово, как END/BEGIN/UNTIL/IF и т.д.
     
    calidus нравится это.