Дмитрий
А зачем потом это отнимается от eax ?
Aiwan \ (•◡•) / _bot
а это вычитание с заемом
Дмитрий
А какую функцию они в коде играют?
Aiwan \ (•◡•) / _bot
а чтоб знать "зачем" надо подробно разбирать сам алгоритм
Aiwan \ (•◡•) / _bot
А какую функцию они в коде играют?
выяснить было ли переполнение при сложении (был ли выставлен CF)
Дмитрий
а чтоб знать "зачем" надо подробно разбирать сам алгоритм
Вычисление экспоненты через ряд: #include <iostream> int main() { double exp = 0, x = 20, iter; iter = 1; for (long long int i = 1; i < 1000000; i++) { exp = exp + iter; iter = (iter*x)/(double)i; } std :: cout << "e^" << std :: fixed << x << " = " << exp << std :: endl; return 0; }
Дмитрий
выяснить было ли переполнение при сложении (был ли выставлен CF)
Ну это я понимаю, но не понятно зачем это нужно вычислять
Aiwan \ (•◡•) / _bot
если что то непонятно - удали это. если при многочисленных тестах поведение никак не изменяется, значит эта(и) строка была лишней. если результаты буддут неправильные - значит инструкция необходима в вычислениях
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
мож это магия оптимизации
Дмитрий
это на O0
Aiwan \ (•◡•) / _bot
exp = exp + iter; в этой строке скорей всего используется add+adc
Aiwan \ (•◡•) / _bot
а понял
Aiwan \ (•◡•) / _bot
for (long long int i = 1; i < 1000000; i++) используется long long, а это уже размер выходит за архитектурный размер, поэтому используется длинаая математика для итерации i на 1
Aiwan \ (•◡•) / _bot
при значении ограничения до 1млн - эти строки лишние, если значения для i будут больше 4млрд 2млрд (потому что знаковый) с хвостиком, то эти инструкции необходимы
Дмитрий
Спасибо большое
Eugene
Вычитание там идёт для того, чтобы не делать 2 условных перехода после сравнений. Цикл выполняется, пока 999999-i >= 0.
Eugene
Вычисляется 999999-i. Если результат меньше 0 (происходит перенос), то CF=1. И тогда после 0-0-CF = -1, при этом SF=1, OF=0, т.е. SF<>OF, jge не срабатывает.
Eugene
Т.о. проверяется и старшая часть, и младшая. Скажем, если i = 100000000h, то 999999-0 флага CF не устанавливает, но после 0-1 опять получаем -1 и SF<>OF.
Eugene
@retyp12
Дмитрий
Благодарю!
Aiwan \ (•◡•) / _bot
Вычитание там идёт для того, чтобы не делать 2 условных перехода после сравнений. Цикл выполняется, пока 999999-i >= 0.
не, скорей всего изза того что i++, а не ++i. инкремент после того как тело отработало
Eugene
Оно же не внутри условия.
Ask
rdtsc заюзать для определения, а предотвратить свич только через cli нарна🤪. если правильно понял вопрос)
Ask
ну сама идея предотвратить смену контекста на мультипоточной системе такая себе
Ask
Поправил
ну так в начале алгоритма вызываешь, потом в конце, поулчаешь количество тактов которое прошло, и думаешь твой код мог столько тактов выполняться или нет
Eugene
ну сама идея предотвратить смену контекста на мультипоточной системе такая себе
Вопрос не в том, чтобы её предотвратить вообще, а чтобы её не было на коротком коде. Т.е. читай как: запустить код в начале отведённого потоку системной кванта времени.
Ask
никак имхо
Ask
может если код в поток отдельный засунуть он начнет исполнение с начала отсчета🤔 или приоритет максимальный задать
Eugene
Короче, проще всего GetThreadTimes для детекта. И дальше тестить с Switch, Sleep.
Eugene
Поток создать долго (для моего случая). Но идея интересная. Хотя не факт, что перед моим кодом не будет куча системного кода исполняться из юзермода.
Ask
для детекта рдтсц проще, так как нет дополнительных калов
s54820
Поток создать долго (для моего случая). Но идея интересная. Хотя не факт, что перед моим кодом не будет куча системного кода исполняться из юзермода.
Куча системного кода после создания потока и до передачи управления в ThreadFunc обязательно будет (BaseThreadStart/RtlUserThreadStart). Тогда уж проще APC запостить, там пролог инструкций десять, в зависимости от версии винды.
Eugene
Куча системного кода после создания потока и до передачи управления в ThreadFunc обязательно будет (BaseThreadStart/RtlUserThreadStart). Тогда уж проще APC запостить, там пролог инструкций десять, в зависимости от версии винды.
Мне кажется, можно WaitForSingleObject(Event) сделать или Sleep(1). Наверняка стартует с нового кванта. Причём, первый должен быть быстрее. Хотя... Таймер работает в определённые моменты. Вряд ли после WaitFor... есть гарантия, что через 10 тактов не будет переключения.
­
А фумитокс-то... работает!
Hello, World! 🎄
Интересно, что не так. Не работает: mov ebx, [i] mov eax, [code+ebx] Работает: mov eax, [code+1]
Aiwan \ (•◡•) / _bot
Интересно, что не так. Не работает: mov ebx, [i] mov eax, [code+ebx] Работает: mov eax, [code+1]
ошибку сегментирования легко понять прогнав свой код в отладке
Aiwan \ (•◡•) / _bot
и в ebx не будет 1
Hello, World! 🎄
ошибку сегментирования легко понять прогнав свой код в отладке
А есть под Linux удобные отладчики (Просто возможно знаете)?
Aiwan \ (•◡•) / _bot
edb, ida free
Aiwan \ (•◡•) / _bot
я как раз щас пишу printf для линуха
Hello, World! 🎄
Дизасемблировал, вроде указывает в нужное место в памяти, хотя без понятия
Hello, World! 🎄
и чему edx равен?
А он тут причем? У меня в eax, ebx складывается все это.
Hello, World! 🎄
Поменял i, code на code, i: code: db "54+++>++++><", 0 i: db 1 char: db 0 И все заработало, без понятия почему вот так не работало: i: db 1 code: db "54+++>++++><", 0 char: db 0
Hello, World! 🎄
Интересно, что не так. Не работает: mov ebx, [i] mov eax, [code+ebx] Работает: mov eax, [code+1]
Или если вместо i: db 0 написать: i: dw 1, 0 То тоже все работает 🧐
Hello, World! 🎄
Кажется понял, там же 1 байт db, а он наверно читает 4 байта в 32 bit регистр. 4 * 8 = 32;
Hello, World! 🎄
Aiwan \ (•◡•) / _bot
disba1ancer
Лучше тогда dd указывать? Но с dw тоже работает
указывай так как удобно, ведь есть замечателная инструкция: movzx ebx, byte ptr [i]
Hello, World! 🎄
указывай так как удобно, ведь есть замечателная инструкция: movzx ebx, byte ptr [i]
Понял спасибо, но я все равно наверно буду тип dd указывать, чтоб проблем с данными не было
Aiwan \ (•◡•) / _bot
Guldan
Кто-нибудь может объяснить как делать переадресацию на cpu580
Guldan
?
Aiwan \ (•◡•) / _bot
что такое ПЕРЕадресация?
Leon
что такое ПЕРЕадресация?
Хедэр Location в HTTP?🙂
Влад
вопрос не по теме но кто то мб знает серийники пк (HWID GUID CPUID) передаются на виртуальную машину или они отличаются от оригинальных серийников пк ?
Aiwan \ (•◡•) / _bot
а что такое ПК?
Aiwan \ (•◡•) / _bot
корпус, мат плата, жесткий, рам память, цпу, видео карта. ЧТО?
­
а что такое ПК?
Это деталька в процессоре
Glo
а что такое ПК?
конфигурация его комплектующих?
Aiwan \ (•◡•) / _bot
CPU: Info: Quad Core model: Intel Core i7-10875H bits: 64 type: MCP arch: Comet Lake rev: 2 L2 cache: 16 MiB я вот в илнухе под VB сижу, и вот какую инфку он мне дает про проц, на котором работает линух. внимаю обращаю на 4 ядра проца, это столько сколько выделил под работу виртуалки. а в действительности там чуть больше
Aiwan \ (•◡•) / _bot
конфигурация его комплектующих?
тогда вопрос должен стоять как "кто знает серийник конфигурации комплектующих". но это выглядит как чушь
Aiwan \ (•◡•) / _bot
думаю отличаются. выбираются какие то определнные значения серийников, заложенных в самом VB, исходя из реального железа и настройки машины VB для конкретной ОС. имхо
Aiwan \ (•◡•) / _bot
тоесть эт типа команда mov из х86?