Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
https://vk.com/@codeby_net-0x01-issleduem-portable-executable-exe-fail-format-pe-faila
🦋
В каких случаях используются инструкции например andn / orn, т.е. которые сначала выполняют логическую операцию, а потом делают NEG над вторым аргументом?
Eugene
Не neg, а not, наверное?
Надо смотреть для конкретного процессора/контроллера, могут отличаться.
Для Intel:
and a,b — выделяет в a установленные биты по маске b
andn z,a,b — выделяет в a сброшенные биты по маске b, переводя их в 1, и записывает в z (условно and z,0101b,0011b запишет 0010b)
Eugene
Т.е. сначала делает not a, а потом and a,b и записывает в z.
Eugene
Бывает, что нужно не единицы выделить, а нули (или определить сразу все единицы). К примеру.
Классика:
and eax,edx
jz @fuck ; ни один бит edx в eax не установлен
И вот так:
andn ecx,eax,edx
jz @good ; все биты edx в eax установлены
Eugene
Если как ты описываешь, тогда х/з. Может, не над вторым аргументом, а над результатом?
И сколько там всего операндов?
🦋
Eugene
Ну, так это интеловский andn. Сначала not второго операнда, а потом and. Пример использования выше.
Eugene
А orn нет в Intel.
Eugene
По крайней мере, не было, если не добавили совсем недавно.
Ned
сессия прошла вроде, чё поналетели-то?
Ned
или это самые умные, которые первыми скачали расписание?
bilka00
должники
Ned
или пересдачники...
Ned
кстати, тут ведь не только про x86-й ассемблер, верно? мне вот интересно (не к спеху), как устроены прерывания в ARM. Коллеги сказали, там чуть ли не 16 уровней приоритетов... Чёт меня с этого удивило слегка.
ඞ
Пересдающие
Vyacheslav
Размер линии кэша в х86 всегда 64 байта?
Vyacheslav
Ok. Спасибо
Eugene
http://sandpile.org/x86/cpuid.htm
8000_0005h
Vyacheslav
Eugene
👍
mov eax,1
cpuid
shr ebx,5
and ebx,255*8
; EBX = cache line size for CLFLUSH (bits 8..15 * 8)
Написано, что clflush флашит линию кэша, значит так можно получить размер. У меня показывает 64 байта.
Vyacheslav
Надеюсь, отличий для amd64 не будет. Спасибо за способ проверки.
Eugene
Вот ещё:
mov eax,80000006h
cpuid
and ecx,255
; ECX = cache line size
Более надёжный, но тут надо сначала проверить - поддеживает ли cpuid конкретного процессора функцию 80000006h.
У меня тоже показывает 64 (i5, 2nd gen).
Eugene
Можно скомбинировать, короче :)
Eugene
Если не поддерживает, использовать первый способ.
Eugene
80000005h показывает во всех регистрах 0 в Intel, reserved типа.
Eugene
Вот, сделал универсальный вариант (сохраню себе тоже) 🙂
proc GetCacheLineSize
push ebx
mov eax,80000000h
cpuid ; get max ext. leaf level (EAX)
mov ecx,80000006h
cmp eax,ecx
jb @F
mov eax,ecx
cpuid ; cache size = ECX [0..7]
movzx eax,cl
jmp .ok
@@:
mov eax,1
cpuid ; cache size for CLFLUSH = EBX [8..15] * 8
movzx eax,bh
shl eax,3
.ok:
pop ebx
ret
endp
Результат, разумеется, в EAX.
Eugene
Eugene
Eugene
Vyacheslav
Вот это я понимаю, развёрнутый ответ! 😁
Eugene
Самому интересно стало :)
Vyacheslav
А вот этот документ доступен публично?
Eugene
xk8.ru/inteldoc
Третий (вроде) том.
Eugene
xk8.ru/amddoc
Тут не знаю где, но где-то должно быть
Eugene
/ban
Anonymous
А вот такой вопрос - если я заюзал y некоторый ISA а при выполнении мне линукс пишет Illegal Instruction
Anonymous
Версия ядра важна тут?
Anonymous
То есть поддержка со стороны ядра необходима?
Anonymous
лол
Anonymous
Я про Instruction Set
А, а я про порт подумал...
Anonymous
нене
Anonymous
Я инструкцию заюзал, но при выполнении кода она почему-то роняет приложуху
Anonymous
в /proc/cpuinfo этого набора нету
Anonymous
и версия ядра так себе
Дык, если нет поддержки инструкции, то её вызов и будет ронять программу.
Anonymous
Вот я и спрашиваю, важно чтобы версия ядра была актуальная, чтобы собранное приложение запустить или нет
Нет, сам проц должен уметь.
Anonymous
Вот проц и умеет
Anonymous
А ядро старенькое
Vyacheslav
Anonymous
Хм. То есть если пересобрать ядро с новым микрокодом, то может хватить?
Anonymous
3.10
Anonymous
400751: fd ff ff
400754: 62 f2 75 48 52 (bad)
400759: c2 62 f1 retq $0xf162
...
4007f0: 62 f2 f5 48 b5 c2 vpmadd52huq %zmm2,%zmm1,%zmm0
4007f6: 62 f1 7c 48 11 85 50 vmovups %zmm0,-0xb0(%rbp)
Anonymous
Вторая инструкция в objdump правильно распознается
Anonymous
первая как bad
Eugene
Если cpuid показывает, что инструкция не поддерживается, значит её не поддерживает процессор. ОС тут ни причём вообще. Если только это не привилегированная инструкция. Но vpmadd* - это обычная инструкции AVX512, vmovups - это AVX-1.
Проц какой?
Anonymous
Cascade Lake
А вообще, я бы по сспек посмотрел бы поддержку инструкций.
Eugene
А если речь про 62 F2 75 48 52, то это vpdpwssd, тоже AVX512
Anonymous
По спекам все как раз ОК
Anonymous
Да
Anonymous
VNNI
«
- Какой у тебя телефон?
- Краснинький! ^____^
»
Anonymous
:D
Eugene
Anonymous
https://en.wikichip.org/wiki/intel/microarchitectures/cascade_lake
Что за сспек?
sspec. 6 буквоцифр, обозначающие конкретную реализацию проца.
Eugene
Ааа
Eugene
Руслан, конкретную модель проца можешь написать?
Нанесён на теплораспределительной крышке процессора.