Aiwan \ (•◡•) / _bot
типа #book
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 байта?
Eugene
Размер линии кэша в х86 всегда 64 байта?
Вроде в мане написано, что по крайней мере, 32. Но обычно 64. Всегда или нет, не скажу. Мне кажется, что через cpuid можно определить.
Vyacheslav
Ok. Спасибо
Eugene
http://sandpile.org/x86/cpuid.htm 8000_0005h
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 Тут не знаю где, но где-то должно быть
Vyacheslav
xk8.ru/inteldoc Третий (вроде) том.
Столько новой инфы мне минимум на пару месяцев хватит. Давно асмом не занимался. Спасибо
­
/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
Anonymous
https://en.wikichip.org/wiki/intel/microarchitectures/cascade_lake
Eugene
Вторая инструкция в objdump правильно распознается
Вторая инструкция - это часть первой, vpdpwssd длиннее 5 -ти байт.
­
Что за сспек?
sspec. 6 буквоцифр, обозначающие конкретную реализацию проца.
Eugene
Ааа
Eugene
Руслан, конкретную модель проца можешь написать?
­
Нанесён на теплораспределительной крышке процессора.