Псевдо-макрос, в масме является ничего не делающей макро-функцией. При ассемблировании даёт дополнительную возможность устанавливать альтернативный опкод. Здесь у переменной указан тип 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] |
Значение первого поля (биты 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 |
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 - должно быть равно нулю. |
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.