Постфиксы

Тема в разделе "MASM", создана пользователем Mikl___, 30 янв 2025 в 10:33.

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    Префикс (прикрепленный впереди) приставка, часть слова (аффикс), стоящая перед корнем и изменяющая его лексическое или грамматическое значение
    Инфикс морфема, вставляемая в середину корня для образования грамматических форм
    Постфикс аффикс, расположенный в слове после всех морфем
    Masm поддерживает следующие постфиксы (показатель используемой системы счисления)
    ПостфиксСистема
    представления
    числа
    Используемые
    цифры
    b, y (binary)​
    двоичная​
    01​
    o, q (octal)​
    восьмеричная​
    01234567​
    нет постфикса,
    d (decimal), t (ten)​
    десятичная​
    0123456789​
    h (hexadecimal)​
    шестнадцатеричная0123456789ABCDEF
    r (real ?)​
    какая-то смешанная,
    десятерично-
    шестнадцатеричная?​
    0123456789ABCDEF
    Кроме двоичной, восьмеричной, десятичной, шестнадцатеричной, существует еще какая-то система в которой есть постфикс "R". Роюсь в своих книгах, которые имеют отношение к синтаксису ассемблера. Практически во всех пишут о постфиксах b, o/q и h. В книге Л.В.Лямина "Макроассемблер MASM" (М.: Радио и связь, 1994) написано:1.2. Целые числа
    . . .

    Указатель вещественных чисел (R) может использоваться только с шестнадцатеричными числами состоящими из 8, 16 или 20 значащих цифр можно добавлять к ним предваряющий 0
    . . .
    1.4. Кодированные вещественные числа

    • синтаксис цифрыR
    Так называемое "кодированное вещественное число" представляет собой шестнадцатеричное число в "кодированном" формате. Любое кодированное вещественное число включает знак, порядок смещения (в представлении числа с плавающей запятой) и мантиссу. Эти значения кодируются в виде битовых полей в пределах конкретного числа. Определение значения и размер каждого битового поля зависят от количества битов в данном числе. Указанные цифры должны быть в шестнадцатеричными. Само представляемое число должно начинаться с десятичной цифры 0-9 и заканчиваться указателем вещественного числа (R).
    Кодированные вещественные числа могут использоваться только с директивами DD, DQ и DT. Количество цифр в кодированных числах, используемых с DD, DQ и DT, должно быть равно соответственно 8, 16 и 20 (при подстановке предваряющего 0 получается соответственно 9, 17 и 21 цифра)
    #Примеры:#
    DD 3F800000r ; 1.0 для DD
    DQ 3FF0000000000000r; 1.0 для DQ
    Еще немного есть в книге Ирвина Кипа "Язык ассемблера для процессоров Intel, 4-е издание" (M.: Издательский дом "Вильямс", 2005) Закодированные вещественные константы. Вещественную константу можно также задать и в шестнадцатеричном виде в форме закодированного вещественного числа. Разумеется, для этого нужно знать точный формат представления вещественных чисел в шестнадцатеричном виде. Ниже приведен пример закодированного 4-байтового вещественного числа, соответствующего десятичному числу +1.0: 3F800000rВ книге "Turbo Assembler. Version 3.2 User's Guid" (Borland International, Inc., 1992)Turbo Assembler also allows encoded real numbers for DD, DQ and DT directives. An encoded real number is hexadecimal number of exactly a certain length. A suffix of R indicates that the number will be interpreted as an encoded real number. The length of the number must fill the required fild (plus one digit if the leading digit is a zero);
    #for example:#
    DD 12345678r ;legal number
    DD 012345678r ;legal number
    DD 1234567r ;Illegal number (too short)
    У А.А.Чекатова в книге "Использование Turbo Assembler при разработке программ" (Киев "Диалектика", 1995)Кроме того, Turbo Assembler поддерживает закодированные действительные числа, задаваемые в директивах DD, DQ и DT. При этом действительное число кодируется шестнадцатеричным числом, имеющим размер, который передается шестнадцатеричным числом, имеющим размер, который определяется используемой директивой. Постфикс R указывает, что данное число должно интерпретироваться как закодированное действительное число. Длина такого числа должна полностью заполнить поле, определяемое директивой (плюс одна цифра, если первая цифра 0),
    #например:#
    DD 12345678r ; допустимое значение
    DD 0FFFFAAAAr ; допустимое значение
    DD 1234567r ; ошибка - длина < 8
    DD FFFFAAAAr ; ошибка - пропущен 0
    Хорошо, подумал я, еще один постфикс вместо h, далее пишу mov eax,1r под отладчиком вижу mov eax,5Ch. Начинаю свои наблюдения заносить в таблицу, вот что получилось.
    RhexRhexRhexRhex
    0r
    52​
    8r​
    A2​
    10r
    B6​
    18r​
    106​
    1r
    5C​
    9r​
    AC​
    11r
    C0​
    19r​
    110​
    2r
    66​
    0Ar
    B6​
    12r
    CA​
    1Ar​
    11A​
    3r
    70​
    0Br
    C0​
    13r
    D4​
    3F7FFFFFFr1B56B2EC
    4r
    7A​
    0Cr
    CA​
    14r
    DE​
    3F799999r1B4C86C8
    5r
    84​
    0Dr
    D4​
    15r
    E8​
    3F800000r1B4C86D2
    6r
    8E​
    0Er
    DE​
    16r
    F2​
    3F800001r1B4C86DC
    7r
    98​
    0Fr
    E8​
    17r
    FC​
    0FFr​
    6C4​
    Если посмотреть на значения от 0r до 9r видно, что каждое последующее значение больше предыдущего на 10. Также видно, что значения от 0Ar до 0Fr и от 10r до 15r кодируются одинаково. При попытке поместить в eax число 3А800000r (аналог real4 1.0) под дебагером вижу mov eax,1B4C86D2h. В какую непонятную муть я залез?
     
  2. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    607
    Ещё нужна четверичная система. 3210q, ой q занят. Ну тогда от немецкого vier - четыре. 3210v это надо для констант для инструкции перемешивания SSE. Но поддержки нет приходится городить макрос.
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    Intro,
    тогда уж «f» от four. Masm не Java, здесь постфикс F (float) не занят. А hex-буква «F» без постфикса «h» не работает. :) А по поводу странной системы с постфиксом «R» есть мысли? По-моему, что-то наклевывается...
    0r=5216=8210 ASCII-код буквы «R»=5216=8210
    7r=7×10+82=15210=9816
    18r=18×10+82=26210=10616
    3F800000r=1B4C86D216=45800000010+8210
    3F=30+15
    Проверяем:
    3E800000r=1AB3F05216=44800008210
    0FFr=6C416=165010+8210=15×110+8210
    3F7FFFFFFr=45866665010+8210=45866673210=1B56B29A16
    «The Truth Is Out There» чертовщина какая-то... :scratch_one-s_head:
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    Intro,
    расскажите о вашей работе с инструкциями перемешивания SSE и макросе для работы в четверичной системе
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    607
    Mikl___, ну типа так.
    shufps xmm5, xmm5, 11010010b ; 3102v // перемещаем члены x->z, y->x, z->y
    Тут я даже макросы поленился делать, но прокомментировал. А макрос там простой, ну не сложный. И f это всё таки ассоциируется с float, ну и немцы тоже внесли вклад в развитие ИТ(типа первый механический компьютер и пр), поэтому постфикс v лучше f.
     
    Mikl___ нравится это.
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.009
    Сначала ml.exe раскладывает 3F799999r на 03 0F 07 09 09 09 09 09 52, затем кормит этим процедуру:
    Код (Text):
    1. 0041A7D0 push ecx
    2. 0041A7D1 mov ecx,dword ptr ss:[esp+8]
    3. 0041A7D5 mov al,byte ptr ds:[46C479]
    4. 0041A7DA xor edx,edx
    5. 0041A7DC mov byte ptr ss:[esp],al
    6. 0041A7E0 mov dl,byte ptr ds:[ecx]
    7. 0041A7E2 xor eax,eax
    8. 0041A7E4 lea edx,dword ptr ds:[edx+ecx+1]
    9. 0041A7E8 inc ecx
    10. 0041A7E9 cmp ecx,edx
    11. 0041A7EB jae ml.41A80B
    12. 0041A7ED push esi
    13. 0041A7EE mov esi,dword ptr ss:[esp+4]
    14. 0041A7F2 push edi
    15. 0041A7F3 and esi,FF
    16. 0041A7F9 mov edi,esi
    17. 0041A7FB imul edi,eax
    18. 0041A7FE xor eax,eax
    19. 0041A800 mov al,byte ptr ds:[ecx]
    20. 0041A802 add eax,edi
    21. 0041A804 inc ecx
    22. 0041A805 cmp ecx,edx
    23. 0041A807 jb ml.41A7F9
    24. 0041A809 pop edi
    25. 0041A80A pop esi
    26. 0041A80B pop ecx
    27. 0041A80C ret 4
    28.  
    Таким образом:
    3*10000000+15*1000000+7*100000+9*10000+9*1000+9*100+9*10+82=45800072
    Двоично-десятичная система без контроля запрещенных 10+ значений. Причем сам суффикс 'r' тоже считает разрядом. Как такое можно использовать затрудняюсь угадать.
     
    MaKsIm и Mikl___ нравится это.