x86?
Чем отличается movsx и movzx
гут фор бегинерс, тов. бро
ог бы что полегче спросить, а то вдруг ещё не сталкивался он с этим
в каких регистрах команда mul получает и возвращает данные
Есть гугл. Если не понял в гугле - заодно и вопрос задать можно)
что делает инструкция db 'ffffffffffffff',90h
Сконоплировался один большой ноп
Оно у тебя ещё и в аски. Он вообще про ассемблер спрашивал проверить, а не знание опкодов 😁
я это и пытался ему объяснить
тогда второй вопрос, есть ли тут ошибка? mov eax, dword [esp+esp]
66 P4+ M no mnemonic sse2 Precision-size override prefix
Напиши код копирования памяти из одного места в другое. На входе: esp-4: куда копировать esp-8: откуда копировать esp-12: число байт учитывай ситуацию, когда число байт кратно 2 или 4
Если источник и назначение местами поменять, будет вообще идеально.
-4? Отрицательное смещение на стеке? С огнём играешь
Так это push обычный.
Не, это явно функция
Стек растет в сторону уменьшения адресов - не забывай
Ну как раз таки да
бывает, если написать комментарий что со стеком аккуратно код менять
У него на входе параметры по отрицательному смещению
Смотри: esp-4 = источник esp-8 = назначение esp-12 = сколько А теперь call memcpy Где тут огонь, если это просто push?
Но она хороший претендент на переписывание чтоб научиться работать с циклами и памятью
Ну тогда надо добавить sub esp, 12 перед вызовом
Не надо. Все будет уже там... stdcall же, ну
Просто тебя могли не так понять, в плане esp-4 - это на момент вызова функции, или уже внутри функции. Вот если уже внутри функции аргумент лежит по -4 - тогда да. Но это невозможно, он затрётся адресом возврата.
Ну чтоб проще
На момент вызова
stdcall затирает стек за собой
Вот тогда всё нормально. Правда поменять бы источник и назначение, и в итоге можно просто вызвать memcpy))
Ну то дело такое
Смотри как оно будет выглядеть: Когда ты делаешь push, стек растет в сторону уменьшения Допустим я сделаю push count push src push dst Стек после этого будет выглядеть так: [esp] - dst [esp + 4] - src [esp + 8] - size Соответственно при вызове эти значения сместятся ещё на +4, потому что стек уменьшится на 4
Если мы хотим именно по отрицательным грузить, то делать надо так mov [esp-4], size mov [esp-8], src mov [esp-12], dst sub esp, 12
Да и кстати, rep movsb все равно быстрее, чем movsw, movsd и movsq. Нет смысла кратность учитывать😁
так за одну инструкцию 2 или 4 байта уйдет, не один же
Читал где-то мануал по оптимизации, щас поищу
нам во время учебы еще препод говорил: если надо копировать большие куски памяти - копируйте максимально возможными блоками, а остаток от деления числа байт на длину блока добивайте как получитсмя. В скорости кратно выиграете
Сейчас посмотрел, и ничего подобного я не нашёл. Агнер пишет, что обязательно при использовании rep movs - блоки должны быть выравнены по границе 32 байта, в остальных случаях самый быстрый способ будет с ZMM\XMM\YMM регистрами. Таким образом, по скорости: 1. SSE/AVX копирование 2. rep movsd/q с выравненными данными 3. rep movsb 4. Обычный цикл с побайтовым копированием
Почитал что есть какая-то улучшенная версия rep movsb
Там написано, что тесты проводились на адресах, которые были выравнены на 16 байт. Возможно, если бы для movsd выравнять на 32\64, было бы быстрее\одинаково.
Ну выравнивание на 32/64 уже странно ожидать
Речь про скорость. А странно... Для кого-то странно и писать свою реализацию вместо использования memcpy. А я вообще не заморачиваюсь, и всегда movsb использую.
Ну для выровненных адресов логичнее просто отдельную функцию завести
Мне вообще на скорость без разницы. По нескольким причинам: 1. Я по-умолчанию всегда быстрее высокоуровневых компиляторов, мне даже стараться не надо 2. Я пишу программы, мне пофиг
поправка - ты пишешь прикладные программы, не нацеленные на большие математические вычисления. В прикладных прогах скорость почти и не нужна, всё равно события ждать.
Сейчас программы с ботанскими вычислениями и не в моде, поэтому и всё на NodeJS, Python и .NET.
а не проще нормальную функцию написать, которая всё сама сделает. Как например при получении физического адреса из виртуального
а даже если они нужны, то есть уже куча готовых библиотек и языков, на которых математика будет сделана хорошо
Вот именно. А я к программе на ассемблере её просто подключу, и всё.
Недавно вот экспериментировал, к программе на ассемблере подключил библиотеку на Go, и ещё одну на Rust. Думаю, можно ещё на .NET подключить.
на .net скорее всего проблемы будут, вм грузить придётся скорее всего. А go это же по сути Си современный
Нет, это совсем не так
Достаточно двух слов: сборщик мусора
про какую часть ответа?
Тут прелесть в том, что только на ассемблере я могу подключить библиотеку на любом языке. Условно, есть какая-то крутая библиотека, но она только на Go. Мне не надо учить Go, я могу просто затолкать эту библиотеку внутрь, и вызывать её функции по её соглашениям. Не зная ассемблера, я либо танцевал бы с бубном, либо сидел, и учил бы Go со слезами на глазах.
GO современный Си? Я слышал что на нём бэк пишут
микросервисы пишут
Однохренственно
Кстати, хотите, я покажу как я в одном проекте подключаю библиотеки на: Rust, Ruby, Go, .NET и Java? Всё сразу.
лучше скажи зачем столько подключать и какой конечный софт?
У самурая нет цели, есть только путь. Классика же.
он не обязателен
зато система ошибок просто шикарная
Или вообще всякой дичи вроде лямбда-выражений
Коды возврата теперь шикарная система ошибок? Или ты про ошибки компиляции?
можно вообще заолгоритмить, чтоб было без разницы выровнены адреса или нет.
Конечный софт: сервис на ассемблере Ruby on Rails с вычислениями бесконечной точности (BigRational, C#), безопасным выводом информации (Rust), и используя время в этой отладочной информации используя библиотеку Carbon (Go).
да, про коды возврата. Это то что удобно, а не ставить везде эти чёртовы исключения и думать как с ними что-то сделать
Давно хотел RubyOnRails на ассемблере написать, ай да хорошо.
Ну тогда будет в рантайме затрачено время на эту самую алгоритмичность. Тут ЯВУ намного легче - коноплятор заранее знает, что, где и как выровнено, какая память пойдет функции в зависимости от того, как эта память была выделена и вызывать соответствующую функцию
отметите если получится сделать, интересно посмотреть
Это получится.
ну допустим, хотя по описанию кажется избыточным использование go либы
Ну это при условии того, что компилятор умный и обо всем этом знает
В моих словах нельзя сомневаться. Можно только надеяться, что я выделю на это время, сейчас я валяюсь на кресле и смотрю "Пираты Карибского моря".
Ты ж говорил не надо фильмы смотреть, надо только на ассемблере писать
Я это с пальца высосал. Мне лень было искать библиотеку на Go, аналогов которой не существует в других языках. Подставь вместо того, что я написал, что-то: 1. Что существует только в Rust 2. ... только в Go 3. ... C# 4. ... Ruby И получится: ассемблер.
Нуу, её тоже можно. Всего-лишь засунуть программку в виртуальную машину Java, исполнить, и вытащить вывод функции на лету. Чудеса ревёрса, талант ассемблера.
Однако зачем выполнять в принципе лишние операции, если можно не выполнять
не уверен что такие либы существуют. А вообще я за полностью асм софт, так что когда stm8 и AT команды на модем?
про замок в гараж
А модем тут при чем
с сигнализацией объединять
Как не знает, если у функций выделения памяти все документировано?
Тебе как будто это нужнее, чем мне самому. Когда захочу, тогда и напишу.
Купи детали, 300 руб. всего-лишь, и сам напиши для себя.
эм, мы про memcopy говорим?
да у меня тут уже 2 месяца одни дожди идут, код нормально писать не получается
Ну. Да. Коноплятор может в компайл-тайме понимать, откуда у него где будут адреса
Шутишь, у меня когда дождь начинается - это +1000 к мотивации писать код. Не ценитель ты, ой не ценитель. Я уже которую неделю молюсь, чтоб дождь начался.
это можно и в рантайме определить
Зачем определять что-то в рантайме, если можно в компайл-тайме?
Писать код на ассемблере ночью под спокойную музыку, пока за окном капает дождь - о большем и мечтать нельзя.
ну я дождь тоже люблю, но ни когда од почти без остановок 2 месяца идёт, даже на огороде не отвлечься от дум лишних
кружечка кофе и небольшой ветерок со свежим немного прохладным воздухом
Извините за офтопик, но такое поэтическое описание процесса толкает на визуализацию.
Любой язык можно прилепить к любому другому, ты ничего нового не изобрёл.
жалко чувака, на моник не заработал.
Я бы не стал вглядываться в картинки от нейросети, можно весь день потом смеяться.
Неа. thiscall в Си как вызывать?
Ой, да не надо спорить. Пусть у него в голове в С можно .NET и Java библиотеки подключать, и Go библиотеку внутрь линковать с С-программой.
Любой язык поддерживает экспорт и импорт сишных символов, соответственно достаточно для нужных языков сделать такую прослойку
Ну то есть не язык прикрутить к любому другому, а на том же языке сделать прослойку сишную, чтобы можно было обращаться)
Ты же технарь, ей богу, выкинь это чудо.
Я хочу сам написать движок для генеративной сети!
как успехи?
Я тоже сталиквался - компиль обнулял массивы командой stosb, я дооптимизировал заменив на stosq, и все стало в два раза медленнее. Но это походу только на коротких массивах, а так одинаково.
Ну и смысл париться с movsq когда movsb проще тогда
Факт.
Обсуждают сегодня