Anonymous
https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-list_entry
Anonymous
как получить доступ к эллементу
Eugene
Eugene
Anonymous
тут нету VALUE
Anonymous
https://docs.microsoft.com/en-gb/windows/win32/api/winternl/ns-winternl-peb_ldr_data
Anonymous
LIST_ENTRY где тут value ?
Anonymous
как извлечь значение
Anonymous
?
Marsel
s54820
как извлечь значение
У тебя по ссылке есть LDR_DATA_TABLE_ENTRY, это и есть значение. Указатели в LIST_ENTRY указывают не на начало LDR_DATA_TABLE_ENTRY, а на соответствующий элемент LIST_ENTRY в этой структуре (там кроме InMemoryOrderLinks есть и другие, просто Microsoft не хочет их докуметировать). Чтобы получить указатель на всю структуру из указателя на элемент, нужно вычесть из указателя на элемент его офсет в структуре. Для Си у Microsoft есть макрос CONTAINING_RECORD, в ассемблере ты просто вычтешь 8 или 16, в зависимости от разрядности.
Eugene
Ну ты подумай логически.
Если игроков n, то со сколькими другими игроками каждый может сыграть?
Вот 10 человек пришло. Один из них — ты. Со сколькими ты можешь сыграть?
Marsel
Marsel
и это именно это и имеется ввиду в подобных ситуациях?))
Anonymous
Anonymous
Aiwan \ (•◡•) / _bot
кто салатик заказывал?
Aiwan \ (•◡•) / _bot
мне кажется, или на потолке плесень?
Eugene
Такой интересный вопрос у меня.
Необходимо выполнить умножение 2-х длинных целых знаковых чисел длиной N слов, которые хранятся в дополнительном коде little-endian. Т.е. 2 — это 0002 0000 (hex, при условии, что слово = 16 бит, побайтно: 02 00 00 00), а -2 — FFFE FFFF (побайтно: FE FF FF FF).
Для примера возьмём простой алгоритм умножения (без Карацубы), где для C = A * B каждое слово числа A умножается на каждое слово числа B и записывается в C со сдвигом и суммированием (с переносом при переполнении).
У нас есть операции умножения знаковых чисел и беззнаковых, причём результат произведения может быть в 2 раза больше, чем множители. По моим наблюдениям, удобнее использовать беззнаковое умножение (каждой пары слов), например:
FFFE FFFF
x
0002 0000
=
FFFC 0001
+
0000 FFFE 0002
=
FFFC FFFF 0002
2-ку убираем, получаем
FFFC FFFF = -4, всё ок.
Именно поэтому 2-3-операндный imul в асме (где старшая часть произведения отбрасывается) используется как для знаковых чисел, так и для беззнаковых.
При знаковом умножении получается так:
FFFE FFFF
x
0002 0000
=
FFFC FFFF
+
0000 FFFC FFFF
=
FFFC FFFB 0000 0001
Какая-то ерунда. По крайней мере, это требует преобразования но не очень понятному мне алгоритму.
А теперь самое главное :)
Необходимо определить — было бы переполнения при умножении.
Понятное дело, что если мы вылезли за диапазон N слов, то переполнение было.
А если нет?
Я пока вижу только такой алгоритм: умножать абсолютные значения множителей (C = abs(A)*abs(B)), поменять знак произведения, если знаки A и B отличаются и сравнить знак результата с тем, что должно получиться (т.е. если знаки A и B разные, значит должно получиться отрицательное число).
Это работает, но это, опять же, лишние операции по проверке и изменению знаков, к тому же, нужно ещё проверять множители на 0, т.к. при нуле результат не будет отрицательным, что может выдать ложный сигнал переполнения.
Вопрос: можно ли (и самое главное, как — по какому алгоритму) определить переполнение после умножения без приведения исходных множителей к абсолютным величинам?
Если нужно, алгоритм умножения можно чуть-чуть модифицировать (добавив что-то или заменив какие-то операции).
Цель — упрощение кода.
Aiwan \ (•◡•) / _bot
#book ЭФФЕКТИВНОЕ ПРОГРАММИРОВАНИЕ СОВРЕМЕННЫХ МИКРОПРОЦЕССОРОВ
Aiwan \ (•◡•) / _bot
R
Здравствуйте, объясните пожалуйста, могут ли ехе файлы грузиться не по ImageBase? Я смотрел и в дизассемблере и в хекс редакторе, вижу что внутри ехе используются абсолютные вирт адреса, таблицы релокаций нет. Получается, их можно грузить только по 0х00400000 ?
Eugene
Здравствуйте, объясните пожалуйста, могут ли ехе файлы грузиться не по ImageBase? Я смотрел и в дизассемблере и в хекс редакторе, вижу что внутри ехе используются абсолютные вирт адреса, таблицы релокаций нет. Получается, их можно грузить только по 0х00400000 ?
Если ASLR отключен, то не может, даже при наличии релокаций. Если включен, то должны быть релоки. Если их нет, то либо ошибка будет, либо по базовому адресу грузиться будет, точно не скажу.
Eugene
ASLR — отделений бит в заголовке.
R
ясно, спасибо
Eugene
ясно, спасибо
Есть ещё, правда, принудительное использование ASLR, как-то включается в ОС, даже если в заголовке отключено. Но без релоков тут никак.
Сергей
есть знакомый препод, по вычислительной технике, застал момент ввода в работу ламповых компьютеров, на них же работал
Сергей
думаю, как заинтересовать его в онлайн активности, может архитектуру ЭВМ рассказать с нуля
Aiwan \ (•◡•) / _bot
ему лет 80 должно быть
Сергей
как вариант мотивировать его собрать свои конспекты и оформить в виде книги с математическими выкладками и конкретной практикой применения
Сергей
https://youtu.be/wvTIfKLy1Z0
Сергей
https://ru.wikipedia.org/wiki/MMIX_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80)
Сергей
интересно почему MMIX никто не пытается реализовать
Сергей
или он слишком далек от реальной практики
Aiwan \ (•◡•) / _bot
#book Пирогов В. Ю. Ассемблер для Windows. Изд. 4-е
sc
полный ку
sc
помогите пж
sc
как вызывать руками vararg функции?
sc
точнее как пушить что-то арбитрарное на стек
sc
допустим std string
Ask
шошо?
sc
есть допустим функция foo(std::string, int, float)
sc
есть указатель на неё без прототипа
sc
есть список аргументов для вызова (типы правильные, дата верная) в формате типа void* buffer и size_t bufSize
sc
как мне эти аргументы запушить?
sc
явно ведь тот же char не один байт пушит
sc
а std::string мб референсом
Ask
гугл 1й же ссылкой ответ вроде как дает
sc
ну и че гуглить то?)
sc
я дурак не знаю че вбивать
Ask
а что ты хочешь сделать?
sc
вообще рефлексию в с++ делаю, чисто для общего развития
sc
вот столкнулся с проблемой при вызове методов
Ask
РЕФЛЕ́КСИЯ
Размышление о своём психическом состоянии... %)
Ask
std string asm
sc
при чем тут стринг вообще, он как пример приводился
Ask
ну пример использования и получил
sc
которое мне не нужно
sc
не ну я конечно дебил и не умею объяснять
sc
но все же пример бесполезен
Оффтоп — во флудилку.
sc
s234802893 прав, именно это я и просил
s54820
s234802893 прав, именно это я и просил
На самом деле всё уже давно написано и называется libffi. Но в простых случаях можно выделить кусок памяти, напихать туда пушей-мовов десятью строками, пометить память как исполняемую и вызывать. Берёшь ABI платформы и смотришь, кого куда пихать.
sc
ffi смотрел. вещь неплохая, согласен, мб заюзаю
sc
ну или как ты сказал сгенерить можно просто
sc
но!
sc
пушить те же инты просто
sc
а вот как сложные типы пихаются я понятия не имею