Спойлер Префикс (прикрепленный впереди) — приставка, часть слова (аффикс), стоящая перед корнем и изменяющая его лексическое или грамматическое значение Инфикс — морфема, вставляемая в середину корня для образования грамматических форм Постфикс — аффикс, расположенный в слове после всех морфем Masm поддерживает следующие постфиксы (показатель используемой системы счисления) ПостфиксСистема представления числаИспользуемые цифрыb, y (binary)двоичная01o, q (octal)восьмеричная01234567нет постфикса, d (decimal), t (ten)десятичная0123456789h (hexadecimal)шестнадцатеричная0123456789ABCDEFr (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. Начинаю свои наблюдения заносить в таблицу, вот что получилось. RhexRhexRhexRhex0r528rA210rB618r1061r5C9rAC11rC019r1102r660ArB612rCA1Ar11A3r700BrC013rD43F7FFFFFFr1B56B2EC4r7A0CrCA14rDE3F799999r1B4C86C85r840DrD415rE83F800000r1B4C86D26r8E0ErDE16rF23F800001r1B4C86DC7r980FrE817rFC0FFr6C4Если посмотреть на значения от 0r до 9r видно, что каждое последующее значение больше предыдущего на 10. Также видно, что значения от 0Ar до 0Fr и от 10r до 15r кодируются одинаково. При попытке поместить в eax число 3А800000r (аналог real4 1.0) под дебагером вижу mov eax,1B4C86D2h. В какую непонятную муть я залез?
Ещё нужна четверичная система. 3210q, ой q занят. Ну тогда от немецкого vier - четыре. 3210v это надо для констант для инструкции перемешивания SSE. Но поддержки нет приходится городить макрос.
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» чертовщина какая-то...
Intro, расскажите о вашей работе с инструкциями перемешивания SSE и макросе для работы в четверичной системе
Mikl___, ну типа так. shufps xmm5, xmm5, 11010010b ; 3102v // перемещаем члены x->z, y->x, z->y Тут я даже макросы поленился делать, но прокомментировал. А макрос там простой, ну не сложный. И f это всё таки ассоциируется с float, ну и немцы тоже внесли вклад в развитие ИТ(типа первый механический компьютер и пр), поэтому постфикс v лучше f.
Сначала ml.exe раскладывает 3F799999r на 03 0F 07 09 09 09 09 09 52, затем кормит этим процедуру: Код (Text): 0041A7D0 push ecx 0041A7D1 mov ecx,dword ptr ss:[esp+8] 0041A7D5 mov al,byte ptr ds:[46C479] 0041A7DA xor edx,edx 0041A7DC mov byte ptr ss:[esp],al 0041A7E0 mov dl,byte ptr ds:[ecx] 0041A7E2 xor eax,eax 0041A7E4 lea edx,dword ptr ds:[edx+ecx+1] 0041A7E8 inc ecx 0041A7E9 cmp ecx,edx 0041A7EB jae ml.41A80B 0041A7ED push esi 0041A7EE mov esi,dword ptr ss:[esp+4] 0041A7F2 push edi 0041A7F3 and esi,FF 0041A7F9 mov edi,esi 0041A7FB imul edi,eax 0041A7FE xor eax,eax 0041A800 mov al,byte ptr ds:[ecx] 0041A802 add eax,edi 0041A804 inc ecx 0041A805 cmp ecx,edx 0041A807 jb ml.41A7F9 0041A809 pop edi 0041A80A pop esi 0041A80B pop ecx 0041A80C ret 4 Таким образом: 3*10000000+15*1000000+7*100000+9*10000+9*1000+9*100+9*10+82=45800072 Двоично-десятичная система без контроля запрещенных 10+ значений. Причем сам суффикс 'r' тоже считает разрядом. Как такое можно использовать затрудняюсь угадать.