Aiwan \ (•◡•) / _bot
Всем доброго дня, можете, пожалуйста, подсказать зачем мы в цикле отдельно считаем количество флагов cf, командой
adcl $0, -28(%ebp)
, а потом отнимаем это число из регистра eax командой
sbbl -28(%ebp), %eax
???
Вот фрагмент кода:
movl $0, -28(%ebp)
jmp .L2
.L3:
fldl -16(%ebp)
faddl -24(%ebp)
fstpl -16(%ebp)
fldl -24(%ebp)
fmull -40(%ebp)
fildq -32(%ebp)
fdivrp %st, %st(1)
fstpl -24(%ebp)
addl $1, -32(%ebp)
adcl $0, -28(%ebp)
.L2:
movl $999999, %edx
movl $0, %eax
cmpl -32(%ebp), %edx
sbbl -28(%ebp), %eax
jge .L3
это сложение с переносом
Дмитрий
А зачем потом это отнимается от eax ?
Aiwan \ (•◡•) / _bot
а это вычитание с заемом
Дмитрий
А какую функцию они в коде играют?
Aiwan \ (•◡•) / _bot
а чтоб знать "зачем" надо подробно разбирать сам алгоритм
Дмитрий
а чтоб знать "зачем" надо подробно разбирать сам алгоритм
Вычисление экспоненты через ряд:
#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;
}
Дмитрий
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
Eugene
Eugene
Оно же не внутри условия.
Ask
rdtsc заюзать для определения, а предотвратить свич только через cli нарна🤪. если правильно понял вопрос)
Eugene
Ask
ну сама идея предотвратить смену контекста на мультипоточной системе такая себе
Ask
Eugene
Ask
Поправил
ну так в начале алгоритма вызываешь, потом в конце, поулчаешь количество тактов которое прошло, и думаешь твой код мог столько тактов выполняться или нет
Ask
никак имхо
Ask
может если код в поток отдельный засунуть он начнет исполнение с начала отсчета🤔 или приоритет максимальный задать
Eugene
Eugene
Короче, проще всего GetThreadTimes для детекта. И дальше тестить с Switch, Sleep.
Eugene
Поток создать долго (для моего случая). Но идея интересная. Хотя не факт, что перед моим кодом не будет куча системного кода исполняться из юзермода.
Ask
для детекта рдтсц проще, так как нет дополнительных калов
Ask
А фумитокс-то... работает!
Hello, World! 🎄
Интересно, что не так.
Не работает:
mov ebx, [i]
mov eax, [code+ebx]
Работает:
mov eax, [code+1]
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
и в ebx не будет 1
Hello, World! 🎄
Aiwan \ (•◡•) / _bot
edb, ida free
Aiwan \ (•◡•) / _bot
я как раз щас пишу printf для линуха
Hello, World! 🎄
Hello, World! 🎄
Дизасемблировал, вроде указывает в нужное место в памяти, хотя без понятия
Aiwan \ (•◡•) / _bot
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! 🎄
Hello, World! 🎄
Кажется понял, там же 1 байт db, а он наверно читает 4 байта в 32 bit регистр. 4 * 8 = 32;
disba1ancer
Hello, World! 🎄
disba1ancer
Hello, World! 🎄
Aiwan \ (•◡•) / _bot
Hello, World! 🎄
Aiwan \ (•◡•) / _bot
Guldan
Кто-нибудь может объяснить как делать переадресацию на cpu580
Guldan
?
Aiwan \ (•◡•) / _bot
что такое ПЕРЕадресация?
Влад
вопрос не по теме но кто то мб знает серийники пк (HWID GUID CPUID) передаются на виртуальную машину или они отличаются от оригинальных серийников пк ?
Aiwan \ (•◡•) / _bot
а что такое ПК?
Aiwan \ (•◡•) / _bot
корпус, мат плата, жесткий, рам память, цпу, видео карта. ЧТО?
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 для конкретной ОС. имхо
Guldan
Guldan
Aiwan \ (•◡•) / _bot
тоесть эт типа команда mov из х86?
Guldan