s54820
а вот как сложные типы пихаются я понятия не имею
Тоже описано в ABI. Мелкие типы расширяются до интов, структуры по необходимости выравниваются до размера, кратного инту и копируются, плавающая точка может передаваться через FPU/SIMD-регистры. В общем, всё зависит от конкретной платформы.
sc
так
sc
а что насчёт структур? больших
s54820
а вот как сложные типы пихаются я понятия не имею
https://www.agner.org/optimize/calling_conventions.pdf лучше начать с этого.
sc
платформа х86
s54820
а что насчёт структур? больших
Если не по ссылке, то тупо копируются в стек.
sc
лол норм
Влада
Привет) Подскажите, пожалуйста, почему на выходе я получаю "Ошибка сегментирования"? Но результат выводится global main extern printf extern scanf section .data formatIn db "%f %f %f",0 formatOut db "numbers is %f",10,0 section .bss x resq 1 b resq 1 a resq 1 r_s resq 1 section .text main: push x push b push a push formatIn call scanf add esp,28 fld dword[a] fld dword[a] fld dword[b] fsub fdiv fld dword[a] fld dword[b] fadd fld dword[b] fld dword[x] fadd fdiv fsin fmul fld dword[b] fld dword[a] fld dword[b] fsub fld dword[b] fld dword[x] fadd fmul fdiv fsub fstp dword[r_s] fld dword [r_s] sub esp,8 fstp qword [esp] push formatOut call printf add esp,12 ret
Eugene
А дальше будет переполнение стека fpu, т.к. fadd, fdiv и пр без суффикса p.
Влада
А вот такую запись можно использовать? то есть выражение a/(a-b) fld dword[a] fld dword[a] fld dword[b] fsub fdiv
Eugene
И ещё. Резервируется qword, а работа идёт с dword. Вообще, можно писать fadd qword[x] и т.д.
Aiwan \ (•◡•) / _bot
А вот такую запись можно использовать? то есть выражение a/(a-b) fld dword[a] fld dword[a] fld dword[b] fsub fdiv
можно, но у тя запись неправльная. первое же действие делает b-a
Aiwan \ (•◡•) / _bot
следи внимательно что находится в каждом регистре после выполнения каждой инстукции
Aiwan \ (•◡•) / _bot
прочитай что такое обратная польская запись, стек fpu работает по такому принципу
­
я уже запуталась как он считает
Привет! Давно тебя не было видно.
Влада
Привет! Давно тебя не было видно.
Ну просто кроме учебы он мне вообще не нужен)
Влада
а кто-то работал с MARS? как сделать, чтобы отображались значения в десятичной системе, а не 16?
Aiwan \ (•◡•) / _bot
твою запись a/(a-b) можно представить как a a b - / fld dword[a] fld dword[a] fld dword[b] дальше идет вычитание, но если сделать fsub то получим b-a, (по умолчанию fsub разворачивается в fsub st0,st1) значит надо поменять местами операнды fsub st1,st0 результат помещается в st1. но так как нам содержимое st0 уже не нужно то добавляем p fsubp st1,st0 итого в st0 у нас результат a-b, в st1 - a дальше делим ст1/ст0 fdiv st1,st0 результат опять будет в st1, а st0 нам не нужен, значит выталкиваем st0 добьавлением p fdivp st1,st0 - ответ в st0 итого полный код fld dword[a] fld dword[a] fld dword[b] fsubp st1,st0 fdivp st1,st0
Eugene
Кто-нибудь знает, Windows кэширует сжатые NTFS файлы в памяти в упакованном виде или в распакованном?
Danil
Судя по всему, в распакованном :)
Думаю на политику кеширования NTFS распространяется https://docs.microsoft.com/en-us/windows/win32/fileio/file-caching https://docs.microsoft.com/en-us/windows-server/storage/file-server/ntfs-overview
Влада
Привет) А подскажите, пожалуйста, в чем разница когда стоит число 51,52,54?
електр🟢нік ✙🟠рчбеч ඞ
мне кажется, это номер системного вызова
­
Какой страшный Юля...
Eugene
Фернандо Юлия, однако.
Eugene
Существуют ли алгоритмы блокировок spin-lock без сложных атомарных операций, т.е. без использования префиксов lock, короче говоря?
Eugene
Ну и без xchg, разумеется.
Danil
Vladimir
https://en.wikipedia.org/wiki/Peterson's_algorithm на ассемблере реализации я не видел, но на С подавно
Как блокировки на чисто программном уровне учтут все аппаратные особенности (кэши и т д)?
Vladimir
Обе переменные в кэше одного проца, другой о них ни сном ни духом
Danil
Как блокировки на чисто программном уровне учтут все аппаратные особенности (кэши и т д)?
То есть у вас флаг для алгоритма - обычная переменная, вы опрашиваете в цикле, а атомарную используете только для попыток захвата, которая соответственно процессором блокирует любое выполнение на системной шине
Eugene
https://en.wikipedia.org/wiki/Peterson's_algorithm на ассемблере реализации я не видел, но на С подавно
Блин, работает алгоритм :)) Для двух потоков пока проверил. Главное, не забыть mfence'ы выставить, иначе косячить будет.
Eugene
Только скорость... короче, lock inc N работает быстрее, чем эта бадяга. И обычный spin-lock с xchg вокруг inc'а тоже быстрее работает. Жаль...
Eugene
Короче, протестил я несколько алгоритмов: Петерсона, Деккера, Ламперта, xchg-spinlock и lock inc. По убыванию скорости: 0. Без блокировок вообще (но с ошибками) [45-60K] 🤣 1. lock inc [30-31K] 2. xchg (логично, что медленнее lock inc'а) [19-21K] 3. Петерсон [10K] 4. Деккер [9.5K] 5. Лампорт [7.5K] Числа в скобках — это кол-во inc'ов в секунду (в моих тестах на моём компе). Но я только с двумя потоками пробовал. Везде (кроме 0 и 1) стоят mfence'ы, без которых эти Петерсоны, Деккеры и Ламперты не работают, для xchg тоже поставил на всякий случай. Короче, эти без-lock-овые алгоритмы годятся только для систем, в которых lock'и в принципе отсутствуют. p.s. Есть ещё Шиманского (Szymański), а также Эйзенберга и МакГира (Eisenberg & McGuire), но они ещё более замороченные какие-то. Пока даже не стал тестить их.
Danil
Короче, протестил я несколько алгоритмов: Петерсона, Деккера, Ламперта, xchg-spinlock и lock inc. По убыванию скорости: 0. Без блокировок вообще (но с ошибками) [45-60K] 🤣 1. lock inc [30-31K] 2. xchg (логично, что медленнее lock inc'а) [19-21K] 3. Петерсон [10K] 4. Деккер [9.5K] 5. Лампорт [7.5K] Числа в скобках — это кол-во inc'ов в секунду (в моих тестах на моём компе). Но я только с двумя потоками пробовал. Везде (кроме 0 и 1) стоят mfence'ы, без которых эти Петерсоны, Деккеры и Ламперты не работают, для xchg тоже поставил на всякий случай. Короче, эти без-lock-овые алгоритмы годятся только для систем, в которых lock'и в принципе отсутствуют. p.s. Есть ещё Шиманского (Szymański), а также Эйзенберга и МакГира (Eisenberg & McGuire), но они ещё более замороченные какие-то. Пока даже не стал тестить их.
Спасибо за вашу информацию, было бы великолепно, если бы вы могли еще и поделиться небольшими снипетами вашей реализации, благодарю
Eugene
Спасибо за вашу информацию, было бы великолепно, если бы вы могли еще и поделиться небольшими снипетами вашей реализации, благодарю
Вот весь проект, он на Delphi 7. Там всё на коленке написано, конечно... :) p.s. Кстати, значения там были в тысячах, т.е. 60K - это 60 млн, конечно :)
Aiwan \ (•◡•) / _bot
студенты в агонии
Eugene
Да я вот всё жду, когда 1000 будет. Уже не первый месяц 900+, а потом, видимо, происходит чистка, и хопа — 800 :))
Aiwan \ (•◡•) / _bot
эт как юбилей при 256
Eugene
И это тоже.
Eugene
Мне когда было 32, я тоже говорил, что у меня круглая дата :))
Aiwan \ (•◡•) / _bot
Круглая дата и всего лишь 20.
20битная шина в досе
Eugene
round data (data bus)
Eugene
В винде в 32-х битах (в т.ч. в WoW64) CS всегда = 23h, а в 64-х битах = 33h ? Под всегда я имею в виду версии винды, начиная с NT, скажем? Или с какой версии так стало?
Eugene
Потестил сам: в обычной 32-битной винде CS = 1Bh (до 7 точно, в 10-ке не знаю), только в WoW64 = 23h (7 и 10, других у меня нет). У кого есть 32-битная 10-ка и 64-битная XP, можете потестить?
Aiwan \ (•◡•) / _bot
демкой занимаешься?
Eugene
демкой занимаешься?
Не, ноги растут отсюда: http://blog.rewolf.pl/blog/?p=102
Aiwan \ (•◡•) / _bot
я что то близкое к этой теме переписываю. для фасма утилку, которая собиратет экспортируемые функции из dll в таком формате
Aiwan \ (•◡•) / _bot
в fasmeditor2.0 она есть, но каждый раз открывать редактор для этой функции напрягает
CB
Всем, привет. Есть небольшая задача по Assembler. В этом канале можно найты специалыста на выполнение.? Если нет, то может посоветуете другой канал. Заранее спасибо.
Marsel
Подскажите как в Int сохранить число 011111111, чтобы оно не превращалось в 11111111?
Ivan
я что то близкое к этой теме переписываю. для фасма утилку, которая собиратет экспортируемые функции из dll в таком формате
Я что-то похожее делаю в свободное время, чисто ради обката новых стандартов плюсов, без особой цели, так лишь, когда нечем заняться. https://github.com/jcfromsiberia/SymSeek
Aiwan \ (•◡•) / _bot
Подскажите как в Int сохранить число 011111111, чтобы оно не превращалось в 11111111?
числа кстати одинаковые, поэтому не совсем понятно что во что не должно превращаться
Marsel
нужно чтобы при побитовой операции например (0110&0101) из int выходило именно 0110 и 0101 а не 110 и 101
Marsel
0110 это 6 а 110 это 110
Marsel
есть конечно что то типа std::bitset<32>(n) но мне надо в инте просто схоранить типа в бинарном виде числа
s54820
0110 это 6 а 110 это 110
Протестую, 0110 — это очень даже 72, а не 6!
Marsel
у меня калькулятор показывает 72 это 1001000
s54820
А у меня printf("%d\n", 0110) показывает, что 72.
s54820
нужно чтобы при побитовой операции например (0110&0101) из int выходило именно 0110 и 0101 а не 110 и 101
Короче, у тебя там проблемы то ли с парсингом, то ли с выводом, но к ассемблеру и самим числам это никакого отношения не имеет. В двоичном представлении (да и в других позиционных системах счисления) можешь дорисовывать слева столько ноликов, сколько тебе нужно. Или не дорисовывать.
Marsel
cout тоже показывает что это 72
s54820
cout тоже показывает что это 72
Потому что это, сюрприз, восьмеричная система.
Marsel
дак мне то не надо в 8ричной
Marsel
в принципе мне не важно как выводит на консоль число
s54820
Дак это вопрос парсинга числа. Распарсишь, как восьмеричную — будет 72, распарсишь как десятичную — будет 110, как двоичную — 6.
Marsel
дорисовать не получится в инте
s54820
Кто запретил? Ты задачу озвучь хотя бы. Не надо в инте рисовать, ты в строке с отформатированным числом рисуй. В инте и так бесконечное количество нулей слева (ну, или единиц, если он отрицательный).