altm

altm MACRO Consts:VARARG
   
EXITM <>
ENDM

   Псевдо-макрос, в масме является ничего не делающей макро-функцией. При ассемблировании даёт дополнительную возможность устанавливать альтернативный опкод. Здесь у переменной указан тип VARARG, что означает возможность задания произвольного количества аргументов. Всего предусмотренно 18 аргументов, ниже они подробно описаны.

   Параметры записываются в виде чисел, через запятую. Каждое число должно умещаться в 1 байте т. е. оно не должно быть больше десятичного 255, двоичного 11111111y или шестнадцатеричного 0FFh. Определяются они последовательно, если к примеру нужно определить только второй параметр, то первый тоже необходимо обозначить хотя-бы как нуль, остальные можно не определять.

Таблица параметров

Номер параметра Описание Примеры использования, 64-битные инструкции 
1 Младшие 3 бита (2,1,0) это число от 0 до 7, которое определяет номер альтернативного опкода.
Бит 3 используется для принудительной установки бита SVEX/VEX/XOP.L.
Биты 7, 6, 5, 4 это маска обязательно устанавливаемых бит для поля SVEX/VEX/XOP.vvvv в 256-битных медиа инструкциях, но дизассемблером используется только седьмой бит и только для 16 и 32 битного кода. 
altm(0) xor edx,edx ассемблируется в опкод 31h,0D2h, а  altm(1) xor edx,edx уже в опкод  33h,0D2h. Есть много частных случаев. Для инструкций SETcc этот параметр является просто значением поля reg MODRM байта. Для инструкций mfence,lfence,sfence параметр соответсвует полю rmem MODRM байта.
2 Байт с 3 битовыми полями. Первое поле это младшие 3 бита 2,1 и 0 является самым главным и часто используемым. Второе поле это 5,4 и 3 биты являются просто 3 независимыми флагами.
   Бит 5 может быть использован только когда первое поле равно 6 (двоичное 110y), для инструкций в аддрессе которых значится однин регистр без индекса например altm(0,100110y) add eax,[rsi+0], здесь rsi определяется именно полем Index SIB-байта.
   Бит 4 может быть использован только когда первое поле равно 6 или 7, означает обязательное использование 4 байтного смещения например altm(0,10110y) add eax,[rsi+3], под тройку выделяется 4 байта, хотя может хватить и одного.
   Бит 3 может быть использован только когда первое поле равно 6 или 7, означает обязательное использование 1 байтного смещения например altm(0,10111y) add eax,[rdi+0], под ноль выделяется байт хотя это и не обязательно.
   Третье поле это 6 и 7 бит которые могут определять значение поля Scale у SIB-байта.
Для инструкции mov использование этого байта может привести и к изминению основного опкода.
Таблица второго параметра. (Определяет возможные способы аддрессации.)
3 Младшие 7 бит это число от 0 до 119, определяет номер перестановки для старых префиксов и соответственно их очередность в опкоде. Избыточные префиксы всегда игнорируются.
Старший бит может использоваться только в 16-битном и 32-битном коде, им можно принудительно устанавливать седьмой бит последнего байта для четырёх операндных, 256-битных медиа инструкций.
Таблица третьего параметра. (Определяет порядок расположения не избыточных префиксов.)
0000000200400000:F067654A0184FA00004000          lock add gs:[edx+8*r15d+400000h],rax
000000020040000B:F065674A0184FA0B004000          altm(0,0,8) lock add gs:[edx+8*r15d+40000Bh],rax
0000000200400016:67F0654A0184FA16004000          altm(0,0,30) lock add gs:[edx+8*r15d+400016h],rax
0000000200400021:6765F04A0184FA21004000          altm(0,0,32) lock add gs:[edx+8*r15d+400021h],rax
000000020040002C:65F0674A0184FA2C004000          altm(0,0,36) lock add gs:[edx+8*r15d+40002Ch],rax
0000000200400037:6567F04A0184FA37004000          altm(0,0,38) lock add gs:[edx+8*r15d+400037h],rax
4 Определяет значиние префикса REX, записывается обычно шестнадцатеричными цифрами. Младшая тетрада бит определяет какие биты будут обязательно установлены. altm(0,0,0,6h) cmpsd ассемблируется в опкод 46h,0A7h .
Старшая тетрада бит может быть равна 0 или 4. Равенство 4 говорит о том, что REX префикс является избыточным. altm(0,0,0,40h) add ax,[rdx+45h] ассемблируется в опкод 66h,40h,03h,42h,45h
Для инструкций у которых REX префикса не бывает, это прежде всего 256-битные медиа инструкции старшая тетрада иногда определяет младшие 4 бита последнего байта инструкции. 77D69777:C463FD690C1075 altm(0,0,0,50h) vfmaddpd ymm9,ymm0,ymm7,[rax+rdx] 
5-18 Остальные параметры определяют количество и место положения избыточных префиксов, а также их чередование с не избыточными. Идут они у меня в конце списка из-за того что реже всего используются, по крайне мере в полном объёме.

77D69797:F2668B4245 altm(0,0,0,0,0F2h) mov ax,[rdx+45h]
;пятый параметр это первый префикс
77D6979C:66F28B4245 altm(0,0,0,0,0h,0F2h) mov ax,[rdx+45h]
;пятый параметр это отступ для не избыточного префикса 66h
77D697A1:3E66F28B4245 altm(0,0,0,0,3Eh,0h,0F2h) mov ax,[rdx+45h]
;теперь 6 параметр является отступом
77D697A7:3E6766F28B4245 altm(0,0,0,0,3Eh,0h,0h,0F2h) mov ax,[edx+45h]
;теперь 5 и 6 оба отступы

Таблица второго параметра. (Определяет возможные способы аддрессации.)

Значение первого поля (биты 0,1 и 2)  Описание Пример использования Второе поле Третье поле (биты 6 и 7) 
Десятичное Двоичное 5 4 3
0 000y любой доступный способ аддрессации. 000000020040000F:67A300000000 mov [0h],eax mbz mbz mbz mbz
1 001y только rip-аддрессация. 00400000:3315FAFFBFFF altm(0,1) xor edx,[0h] mbz mbz mbz mbz
2 010y абсолютный аддресс. 00400006:33142500000000 xor edx,[0]
0040000D:3314E500000000 altm(0,11000010y) xor edx,[0]
mbz mbz mbz used
3 011y 16-битный абсолютный аддресс. В 64-битном коде применимо только для инструкций jcc. Для процессоров Intel64 в 64-битном коде не должно использоваться. 0000000000000102:66740B altm(0,3) jz short 110h mbz mbz mbz mbz
4 100y 32-битный абсолютный аддресс. В 64-битном коде не используется.

Сперва используйте use16
0128:66741D altm(0,4) jz short 148h

mbz mbz mbz mbz
5 101y 64-битный аддресс. Применим может быть только для инструкции mov и jcc в 64-битном коде. 000000000000011C:48A11C11000000000000 altm(0,5) mov rax,[111Ch] mbz mbz mbz mbz
6 110y Означает обязательное использование SIB-байта. Если пятый бит установлен то 6,7,4 и 3 биты должны быть равны нулю. 0000000000000110:4889442500 altm(0,6) mov [rbp+0],rax used used used used
7 111y Означает отсутствие SIB-байта. 0000000000000109:48898500000000 altm(0,10111y) mov [rbp+0],rax mbz used used mbz

mbz  - должно быть равно нулю.
used - используется.

Таблица третьего параметра. (Определяет порядок расположения не избыточных префиксов.)

pfx_lock   equ 0  - 0F0h
pfx_66     equ 1  - 66h
pfx_67     equ 2  - 67h
pfx_seg    equ 3  - 64h,65h и для унаследованых режимов и режима совместимости 2Eh,3Eh,26h,36h
pfx_f2_f3  equ 4  - 0F2h,0F3h

Perm. Num. 1 2 3 4 5
0 pfx_lock  pfx_67    pfx_seg   pfx_66    pfx_f2_f3
1 pfx_lock  pfx_67    pfx_seg   pfx_f2_f3 pfx_66   
2 pfx_lock  pfx_67    pfx_66    pfx_seg   pfx_f2_f3
3 pfx_lock  pfx_67    pfx_66    pfx_f2_f3 pfx_seg  
4 pfx_lock  pfx_67    pfx_f2_f3 pfx_seg   pfx_66   
5 pfx_lock  pfx_67    pfx_f2_f3 pfx_66    pfx_seg  
6 pfx_lock  pfx_66    pfx_67    pfx_seg   pfx_f2_f3
7 pfx_lock  pfx_66    pfx_67    pfx_f2_f3 pfx_seg  
8 pfx_lock  pfx_66    pfx_seg   pfx_67    pfx_f2_f3
9 pfx_lock  pfx_66    pfx_seg   pfx_f2_f3 pfx_67   
10 pfx_lock  pfx_66    pfx_f2_f3 pfx_67    pfx_seg  
11 pfx_lock  pfx_66    pfx_f2_f3 pfx_seg   pfx_67   
12 pfx_lock  pfx_seg   pfx_66    pfx_67    pfx_f2_f3
13 pfx_lock  pfx_seg   pfx_66    pfx_f2_f3 pfx_67   
14 pfx_lock  pfx_seg   pfx_67    pfx_66    pfx_f2_f3
15 pfx_lock  pfx_seg   pfx_67    pfx_f2_f3 pfx_66   
16 pfx_lock  pfx_seg   pfx_f2_f3 pfx_66    pfx_67   
17 pfx_lock  pfx_seg   pfx_f2_f3 pfx_67    pfx_66   
18 pfx_lock  pfx_f2_f3 pfx_66    pfx_67    pfx_seg  
19 pfx_lock  pfx_f2_f3 pfx_66    pfx_seg   pfx_67   
20 pfx_lock  pfx_f2_f3 pfx_67    pfx_66    pfx_seg  
21 pfx_lock  pfx_f2_f3 pfx_67    pfx_seg   pfx_66   
22 pfx_lock  pfx_f2_f3 pfx_seg   pfx_66    pfx_67   
23 pfx_lock  pfx_f2_f3 pfx_seg   pfx_67    pfx_66   
24 pfx_66    pfx_lock  pfx_67    pfx_seg   pfx_f2_f3
25 pfx_66    pfx_lock  pfx_67    pfx_f2_f3 pfx_seg  
26 pfx_66    pfx_lock  pfx_seg   pfx_67    pfx_f2_f3
27 pfx_66    pfx_lock  pfx_seg   pfx_f2_f3 pfx_67   
28 pfx_66    pfx_lock  pfx_f2_f3 pfx_67    pfx_seg  
29 pfx_66    pfx_lock  pfx_f2_f3 pfx_seg   pfx_67   
30 pfx_66    pfx_67    pfx_lock  pfx_seg   pfx_f2_f3
31 pfx_66    pfx_67    pfx_lock  pfx_f2_f3 pfx_seg  
32 pfx_66    pfx_67    pfx_seg   pfx_lock  pfx_f2_f3
33 pfx_66    pfx_67    pfx_seg   pfx_f2_f3 pfx_lock 
34 pfx_66    pfx_67    pfx_f2_f3 pfx_lock  pfx_seg  
35 pfx_66    pfx_67    pfx_f2_f3 pfx_seg   pfx_lock 
36 pfx_66    pfx_seg   pfx_lock  pfx_67    pfx_f2_f3
37 pfx_66    pfx_seg   pfx_lock  pfx_f2_f3 pfx_67   
38 pfx_66    pfx_seg   pfx_67    pfx_lock  pfx_f2_f3
39 pfx_66    pfx_seg   pfx_67    pfx_f2_f3 pfx_lock 
40 pfx_66    pfx_seg   pfx_f2_f3 pfx_lock  pfx_67   
41 pfx_66    pfx_seg   pfx_f2_f3 pfx_67    pfx_lock 
42 pfx_66    pfx_f2_f3 pfx_lock  pfx_67    pfx_seg  
43 pfx_66    pfx_f2_f3 pfx_lock  pfx_seg   pfx_67   
44 pfx_66    pfx_f2_f3 pfx_67    pfx_lock  pfx_seg  
45 pfx_66    pfx_f2_f3 pfx_67    pfx_seg   pfx_lock 
46 pfx_66    pfx_f2_f3 pfx_seg   pfx_lock  pfx_67   
47 pfx_66    pfx_f2_f3 pfx_seg   pfx_67    pfx_lock 
48 pfx_67    pfx_lock  pfx_66    pfx_seg   pfx_f2_f3
49 pfx_67    pfx_lock  pfx_66    pfx_f2_f3 pfx_seg  
50 pfx_67    pfx_lock  pfx_seg   pfx_66    pfx_f2_f3
51 pfx_67    pfx_lock  pfx_seg   pfx_f2_f3 pfx_66   
52 pfx_67    pfx_lock  pfx_f2_f3 pfx_66    pfx_seg  
53 pfx_67    pfx_lock  pfx_f2_f3 pfx_seg   pfx_66   
54 pfx_67    pfx_66    pfx_lock  pfx_seg   pfx_f2_f3
55 pfx_67    pfx_66    pfx_lock  pfx_f2_f3 pfx_seg  
56 pfx_67    pfx_66    pfx_seg   pfx_lock  pfx_f2_f3
57 pfx_67    pfx_66    pfx_seg   pfx_f2_f3 pfx_lock 
58 pfx_67    pfx_66    pfx_f2_f3 pfx_lock  pfx_seg  
59 pfx_67    pfx_66    pfx_f2_f3 pfx_seg   pfx_lock 
60 pfx_67    pfx_seg   pfx_lock  pfx_66    pfx_f2_f3
61 pfx_67    pfx_seg   pfx_lock  pfx_f2_f3 pfx_66   
62 pfx_67    pfx_seg   pfx_66    pfx_lock  pfx_f2_f3
63 pfx_67    pfx_seg   pfx_66    pfx_f2_f3 pfx_lock 
64 pfx_67    pfx_seg   pfx_f2_f3 pfx_lock  pfx_66   
65 pfx_67    pfx_seg   pfx_f2_f3 pfx_66    pfx_lock 
66 pfx_67    pfx_f2_f3 pfx_lock  pfx_66    pfx_seg  
67 pfx_67    pfx_f2_f3 pfx_lock  pfx_seg   pfx_66   
68 pfx_67    pfx_f2_f3 pfx_66    pfx_lock  pfx_seg  
69 pfx_67    pfx_f2_f3 pfx_66    pfx_seg   pfx_lock 
70 pfx_67    pfx_f2_f3 pfx_seg   pfx_lock  pfx_66   
71 pfx_67    pfx_f2_f3 pfx_seg   pfx_66    pfx_lock 
72 pfx_seg   pfx_lock  pfx_66    pfx_67    pfx_f2_f3
73 pfx_seg   pfx_lock  pfx_66    pfx_f2_f3 pfx_67   
74 pfx_seg   pfx_lock  pfx_67    pfx_66    pfx_f2_f3
75 pfx_seg   pfx_lock  pfx_67    pfx_f2_f3 pfx_66   
76 pfx_seg   pfx_lock  pfx_f2_f3 pfx_66    pfx_67   
77 pfx_seg   pfx_lock  pfx_f2_f3 pfx_67    pfx_66   
78 pfx_seg   pfx_66    pfx_lock  pfx_67    pfx_f2_f3
79 pfx_seg   pfx_66    pfx_lock  pfx_f2_f3 pfx_67   
80 pfx_seg   pfx_66    pfx_67    pfx_lock  pfx_f2_f3
81 pfx_seg   pfx_66    pfx_67    pfx_f2_f3 pfx_lock 
82 pfx_seg   pfx_66    pfx_f2_f3 pfx_lock  pfx_67   
83 pfx_seg   pfx_66    pfx_f2_f3 pfx_67    pfx_lock 
84 pfx_seg   pfx_67    pfx_lock  pfx_66    pfx_f2_f3
85 pfx_seg   pfx_67    pfx_lock  pfx_f2_f3 pfx_66   
86 pfx_seg   pfx_67    pfx_66    pfx_lock  pfx_f2_f3
87 pfx_seg   pfx_67    pfx_66    pfx_f2_f3 pfx_lock 
88 pfx_seg   pfx_67    pfx_f2_f3 pfx_lock  pfx_66   
89 pfx_seg   pfx_67    pfx_f2_f3 pfx_66    pfx_lock 
90 pfx_seg   pfx_f2_f3 pfx_lock  pfx_66    pfx_67   
91 pfx_seg   pfx_f2_f3 pfx_lock  pfx_67    pfx_66   
92 pfx_seg   pfx_f2_f3 pfx_66    pfx_lock  pfx_67   
93 pfx_seg   pfx_f2_f3 pfx_66    pfx_67    pfx_lock 
94 pfx_seg   pfx_f2_f3 pfx_67    pfx_lock  pfx_66   
95 pfx_seg   pfx_f2_f3 pfx_67    pfx_66    pfx_lock 
96 pfx_f2_f3 pfx_lock  pfx_66    pfx_67    pfx_seg  
97 pfx_f2_f3 pfx_lock  pfx_66    pfx_seg   pfx_67   
98 pfx_f2_f3 pfx_lock  pfx_67    pfx_66    pfx_seg  
99 pfx_f2_f3 pfx_lock  pfx_67    pfx_seg   pfx_66   
100 pfx_f2_f3 pfx_lock  pfx_seg   pfx_66    pfx_67   
101 pfx_f2_f3 pfx_lock  pfx_seg   pfx_67    pfx_66   
102 pfx_f2_f3 pfx_66    pfx_lock  pfx_67    pfx_seg  
103 pfx_f2_f3 pfx_66    pfx_lock  pfx_seg   pfx_67   
104 pfx_f2_f3 pfx_66    pfx_67    pfx_lock  pfx_seg  
105 pfx_f2_f3 pfx_66    pfx_67    pfx_seg   pfx_lock 
106 pfx_f2_f3 pfx_66    pfx_seg   pfx_lock  pfx_67   
107 pfx_f2_f3 pfx_66    pfx_seg   pfx_67    pfx_lock 
108 pfx_f2_f3 pfx_67    pfx_lock  pfx_66    pfx_seg  
109 pfx_f2_f3 pfx_67    pfx_lock  pfx_seg   pfx_66   
110 pfx_f2_f3 pfx_67    pfx_66    pfx_lock  pfx_seg  
111 pfx_f2_f3 pfx_67    pfx_66    pfx_seg   pfx_lock 
112 pfx_f2_f3 pfx_67    pfx_seg   pfx_lock  pfx_66   
113 pfx_f2_f3 pfx_67    pfx_seg   pfx_66    pfx_lock 
114 pfx_f2_f3 pfx_seg   pfx_lock  pfx_66    pfx_67   
115 pfx_f2_f3 pfx_seg   pfx_lock  pfx_67    pfx_66   
116 pfx_f2_f3 pfx_seg   pfx_66    pfx_lock  pfx_67   
117 pfx_f2_f3 pfx_seg   pfx_66    pfx_67    pfx_lock 
118 pfx_f2_f3 pfx_seg   pfx_67    pfx_lock  pfx_66   
119 pfx_f2_f3 pfx_seg   pfx_67    pfx_66    pfx_lock 


Примечание: макрос всегда учитывается при ассемблировании функцией Assemble. При использовании AssembleEx, более приоритетной считается структура AltmBytes.

Сайт управляется системой uCoz