- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
#include "stdafx.h"
#include "hackery.h"
#include <cstdint>
#include <windows.h>
/*XXX*/
unsigned char udiv128Data[] =
{
0x48, 0x89, 0xD0, // mov rax,rdx
0x48, 0x89, 0xCA, // mov rdx,rcx
0x49, 0xF7, 0xF0, // div r8
0x49, 0x89, 0x11, // mov [r9],rdx
0xC3 // ret
};
/*XXX*/
unsigned char sdiv128Data[] =
{
0x48, 0x89, 0xD0, // mov rax,rdx
0x48, 0x89, 0xCA, // mov rdx,rcx
0x49, 0xF7, 0xF8, // idiv r8
0x49, 0x89, 0x11, // mov [r9],rdx
0xC3 // ret
};
unsigned __int64(__fastcall *udiv128)(unsigned __int64 numhi, unsigned __int64 numlo, unsigned __int64 den, unsigned __int64* rem);
__int64(__fastcall *sdiv128)(__int64 numhi, __int64 numlo, __int64 den, __int64* rem);
namespace {
struct Q {
Q() {
/*XXX*/
udiv128 = reinterpret_cast<unsigned __int64(__fastcall *)(unsigned __int64, unsigned __int64, unsigned __int64, unsigned __int64*)>(&udiv128Data[0]);
/*XXX*/
sdiv128 = reinterpret_cast<__int64(__fastcall *)(__int64, __int64, __int64, __int64*)>(&sdiv128Data[0]);
/*XXX*/
DWORD dummy;
/*XXX*/
VirtualProtect(udiv128Data, sizeof(udiv128Data), PAGE_EXECUTE_READWRITE, &dummy);
/*XXX*/
VirtualProtect(sdiv128Data, sizeof(sdiv128Data), PAGE_EXECUTE_READWRITE, &dummy);
}
} q;
}
Вот такая вот загогулина получилась по причине того что в 64-х битной Вижуал Студии нет встроенного асма, нет интринсика для простой асмовой команды, но мне вот надо именно полное деление 128-битного числа на 64-х битное именно с остатком и мне совершенно фиолетово на то что Майкрософт думает на тему вредности команды DIV и заменимости деления умножением на обратное. Да, и мне влом усложнять структуру проекта и линковать какие-то символы с внешнего асма.
inkanus-gray 12.11.2015 23:33 # 0
А ещё вот это (не говно, просто старьё): http://govnokod.ru/3694
MinorThreat 12.11.2015 23:41 # +5
inkanus-gray 12.11.2015 23:41 # 0
Кстати, а как обратить целое число?
MinorThreat 12.11.2015 23:47 # +3
CHayT 12.11.2015 23:58 # +4
кстати, антивирус в теории не может это дело запалить?
MinorThreat 13.11.2015 00:17 # 0
Abbath 13.11.2015 13:46 # 0
MinorThreat 13.11.2015 17:04 # +1
bormand 13.11.2015 17:42 # +6
Ну вот с насмом разбираться, имхо, намного быстрее, чем байткоды руками хуярить... Всё! Ну разве что ещё прототипчик сишный описать и в систему сборки этот асм добавить.
И да, насм отлично линкуется и с вижуалкиным кодом и с гццшным (см. опцию -f). Так что можно ничего не портировать.
inkanus-gray 13.11.2015 18:29 # +2
Нельзя просто так взять и слинковать вижуалкин код с гэцэцэшным, потому что у формата COFF более 9000 модификаций.
bormand 13.11.2015 18:57 # +3
MinorThreat 13.11.2015 19:28 # +4
https://msdn.microsoft.com/ru-ru/library/dn375768.aspx
inkanus-gray 13.11.2015 19:34 # +3
http://xkcd.ru/927/
j123123 15.11.2015 02:16 # +2
Конвертер есть http://www.agner.org/optimize/#objconv
Koncord 13.11.2015 06:22 # +4
Koncord 13.11.2015 06:23 # 0
imihajlov 13.11.2015 10:39 # +2
inkanus-gray 13.11.2015 16:51 # 0
bormand 13.11.2015 17:48 # +4
inkanus-gray 13.11.2015 18:10 # +4
Луц частями не продаётся. Один заряд — десять чатлов.
inkanus-gray 13.11.2015 18:21 # 0
bormand 13.11.2015 18:58 # 0
Да вроде операционки не юзают большие страницы кроме редких случаев (когда мапают физическую память целиком и когда явно попросили большую страницу).
Ну а в общем случае - да. Гигабайтные странички рулят. Жаль, что мало где поддерживаются.
MinorThreat 13.11.2015 17:19 # +1
inkanus-gray 13.11.2015 17:33 # +2
MinorThreat 13.11.2015 17:43 # +2
bormand 13.11.2015 17:46 # +2
TarasB 13.11.2015 14:28 # +3
Если в компиляторе нет встроенных типов на всё, что поддерживает процессор, то это говно.
Ой, кажется я обосрал все компиляторы, потому что типы для векторных команд ни одна сволочь вшить не захотела.
MinorThreat 13.11.2015 18:05 # +1
guest 13.11.2015 16:58 # +1
Вот кстати с хабра http://habrahabr.ru/company/itseez/blog/210832/ :
>Подход с отдельной компиляцией ассемблера нас совсем не устраивал, потому как требовались значительные модификации в билдовой инфраструктуре. Важно ещё то, что компилятор отказывается встраивать ассемблерные функции и проводить какие-либо оптимизации их вызова. Решить проблему удалось только применением ключевого слова __emit. Оно позволяет вставить в любом блоке C или C++ кода произвольный кусок машинного кода. Зная соглашения о вызовах и опкоды инструкций, можно составить любой недостающий интринсик самостоятельно.
MinorThreat 13.11.2015 18:00 # +1
guest 13.11.2015 18:19 # +3
MinorThreat 13.11.2015 19:16 # +5
guest 13.11.2015 18:21 # +1
https://msdn.microsoft.com/en-us/library/5bkb2w6t.aspx
guest 13.11.2015 19:48 # 0
bormand 13.11.2015 19:50 # 0
guest 13.11.2015 19:57 # 0
bormand 13.11.2015 20:07 # 0
guest 13.11.2015 20:08 # 0
bormand 13.11.2015 20:13 # +1
Всё оставшееся время asm юзал только ради всякой системщины, которая из C невозможна...
guest 13.11.2015 19:37 # +8
--Поведай мне о них
--Я иногда люблю писать на машинных кодах под не самую простую архитектуру, где даже размер опкода не фиксирован
--Грязный ублюдок
Вот за что я обожаю крестовиков, так это за умение насрать на абстракцию. В одной руке у них там абстрактные фабрики и визиторы, а другой они вхуяривают машинный код и ставят странице флажок на запуск.
Треш же!
bormand 13.11.2015 19:41 # +3
> умение насрать на абстракцию
Дык главное хорошенько инкапсулировать все эти хаки. Так что это не умение насрать на абстракцию, а как раз таки наоборот - запилить годную абстракцию на основе низкоуровневого пиздеца.
guest 13.11.2015 19:46 # 0
А В MBR 512 байт минус таблица разделов, так что и того меньше.
bormand 13.11.2015 19:48 # +2
guest 13.11.2015 19:54 # 0
Наврядли все это удобно делать из одного блока) Обычно же в MBR тупой код который просто грузит с диска (через BIOSовый, простигосподи, LBA интерфейс, прямо через прерывание) остальные несколько блоков и запускает загрузчик оттуда.
bormand 13.11.2015 19:58 # +1
От MBR требуется только прочитать сектора с диска, найти entry и передать управление. Это в него влезет с запасом. В общем-то туда и flat GDT с переходом влезли бы...
guest 13.11.2015 20:04 # +1
Так ведь все операцыонки на PC (ну кроме UEFI) так именно и делают.
Ну в общем я генеральную мыслю понял: можно пользоваться писёй без оси. Я правда совершенно не представляю зачем такое может понадобиться.
bormand 13.11.2015 20:05 # +1
guest 13.11.2015 20:10 # 0
bormand 13.11.2015 20:14 # +3
Так что народ и без памяти (контроллер памяти включится чуть позже, в следующем модуле) юзает PE'шки... А ты про dll'ку из MBR не веришь...
guest 13.11.2015 20:15 # +2
Больше в фирмварю лазить не за чем.
bormand 13.11.2015 20:19 # +1
Эх, времени и сил не хватает, чтобы эмулятор SPI флешки на STM32 допаять/дописать... А без него совсем не айс.
guest 13.11.2015 20:22 # +1
bormand 13.11.2015 20:26 # 0
Да через программатор и сейчас можно. Даже проще, наверное. Потому что SPI флешки восьминогие и более-менее стандартные.
Но толком не поотлаживаешься... Чипсет же ещё не настроен, емнип, в этом состоянии даже до pci карточек не добраться...
guest 13.11.2015 20:32 # 0
Правда он делает это очень рано, потому что во время POSTа он пишет в IO 80h, и там его слышит POST карта на PCI.
А вот как ДО этого дебажиться я даже не знаю. JTAG какой-нить?
bormand 13.11.2015 20:34 # 0
Ну вот я и думал дебажиться через эмулятор SPI флешки. Прочитали определённый байт - единичка, прочитали другой - нолик... Читать флешку там всё-таки можно :3
Правда х.з., как на это отреагируют кеши флешки в чипсете (я не уверен, что их нет)...
guest 13.11.2015 20:19 # 0
Это мазер-борд специфик?
bormand 13.11.2015 20:21 # +1
В core boot, емнип, ради этой инициализации сделали подпиленную версию gcc, которая компилит код, который может работать без памяти, на одних регистрах и r/o флешке.
guest 13.11.2015 20:26 # 0
По идее всё что товрица в материнке это личное дело вендора. Для программиста существует UEFi/BIOS API и ACPI. Так что мне вообще странно что core boot существует. И много материнок он умеет?
Так а как включение контроллера происходит физически? Надо в IO порт писать или по определенному адресу?
bormand 13.11.2015 20:28 # 0
Надо много писать и читать в порты/из них. Там же ещё сначала надо SPD у планок памяти выпытать... А вот memory mapped эти порты или нет - я х.з. В общем-то большой разницы нет.
> Так что мне вообще странно что core boot существует
Ну гугл на хромбуках юзает... Кстати, хромбуковские процы/чипсеты - считай единственные из свежих интеловских, где корбут работает. На амд дела получше обстоят.
> Для программиста существует UEFi/BIOS API и ACPI.
А для прикладника - так вообще только юзермод :)
guest 13.11.2015 20:35 # 0
И контроллер на частоту настроить и на всякие латенси, да. Причем пользователь же может свои значения указать в CMOS.
Страшно подумать сколько всего происходит в BIOS
>> А для прикладника - так вообще только юзермод :)
да, пошел я плагин к jQuery писатьЖ)
bormand 13.11.2015 20:38 # 0
Имхо, можно какие-нибудь безопасные значения поставить, скорость же не важна на этом этапе. А потом уже подкрутить на заданные юзером, когда окружение дружелюбнее станет.
guest 13.11.2015 20:43 # 0
ну а самые дружелюбные это, конечно, spd. Правда я видел говнопамять которая не работала на своих заявленных, пришлось cas латенси снижать, но это бракованый экземпляр
bormand 13.11.2015 20:45 # +1
Вай нот? Главное память в это время не юзать ;) Ну и не факт, что данные в ней выживут.
guest 13.11.2015 20:49 # 0
Вот, да. Пока контроллер будет её менять у нее заряд утечет. Её же рефрешить нужно, болезную. Этим же контроллер занимается? Или там прямо на DRAMе чип?
Хотя когда ты BIOS и единственная программа на компе то можно конечно и такое провернуть.
bormand 13.11.2015 20:54 # 0
Ну. Код никуда не денется, он на флешке. А данные можно и в кеше проца подержать, если не жадничать.
> Или там прямо на DRAMе чип
Емнип, и так и так. Во сне сама рефрешится. А в рабочее время контроллер должен кидать команду.
guest 13.11.2015 20:58 # 0
Во время работы она видимо сама не рефрешится чтобы не конфликтовать с синхронными запросами контроллера, она же SDRAM лет 18 как.
Так вот и получается что если контроллер будет менять частоту то велик шанс продалбывания содержимого. Круто писать код зная что у тебя вся память или r/o или регистры:)
bormand 13.11.2015 21:24 # +1
Кстати, можно же загнать память в self refresh, как перед сном, и спокойно настраивать контроллер...
MinorThreat 13.11.2015 19:52 # +1
Antervis 16.11.2015 06:10 # 0
MinorThreat 13.11.2015 21:55 # +1
Abbath 16.11.2015 12:51 # +2
Зачем это все?
kegdan 16.11.2015 13:23 # +3
MinorThreat 16.11.2015 15:28 # +2
Abbath 16.11.2015 15:29 # +4
kegdan 16.11.2015 15:34 # +1
А вообще всегда отвечай на такие вопросы - потому что могу!
guest 17.11.2015 03:05 # +3
типа все тут ламеры, а он один понимает как работает проц
TEH3OPHblu_nemyx 04.06.2020 22:15 # 0
TEH3OPHblu_nemyx 04.06.2020 23:06 # 0
mov rdx,rcx можно заменить на push rcx; pop rdx. В опкодах это будет "QZ".
Для PUSH/POP REX-префиксы не требуются, поэтому удалось сэкономить два байта.
Вот div и ret уже в ASCII-кодах не представить. IMUL вот в ASCII-кодах есть. И mov с косвенной адресацией придётся заменять на арифметику (SUB, XOR, AND).
TEH3OPHblu_nemyx 05.06.2020 02:19 # +1
\n — это символ с кодом 0x0A, \" — это экранированная кавычка.
Открываю специальную олимпиаду по сокращению этого кода. Необходимое условие — машинные коды должны быть печатаемыми ASCII-символами (в качестве исключения разрешаю перевод строки).
Нидлесс, есть идеи?
bormand 06.06.2020 11:51 # +1
Ты же уже показал, что div и ret не выразить.
TEH3OPHblu_nemyx 06.06.2020 12:25 # 0
Конкретно в этой программе и вправду не нужно.
Noodles 06.06.2020 12:30 # 0
Кстати, код петуха насрал мне в переменную мусором.
TEH3OPHblu_nemyx 06.06.2020 12:49 # 0
bormand 06.06.2020 13:23 # 0
Сейчас везде ASLR :(
TEH3OPHblu_nemyx 06.06.2020 13:24 # 0
gost 06.06.2020 13:26 # 0
bormand 06.06.2020 13:27 # 0
guest8 06.06.2020 13:33 # −999
gost 06.06.2020 13:34 # 0
UPD: ну ладно, ладно, не в любой, в [[noreturn]] нет.
bormand 06.06.2020 13:37 # 0
Там ud2 какой-нибудь? Или просто UB и следующая функция начинается?
gost 06.06.2020 13:43 # 0
bormand 06.06.2020 13:52 # 0
Ну да, UB'ов в коде не бывает, значит ты ее не вызываешь.
Какая UBтимизация )))
Noodles 06.06.2020 14:07 # 0
Я эту фичу юзал, когда интерпретатор ШК писал, хотя можно было бы и без неё, конеплятор не настолько тупой, чтобы за goto return вставлять.
guest8 06.06.2020 14:22 # −999
Noodles 06.06.2020 16:43 # 0
TEH3OPHblu_nemyx 06.06.2020 14:01 # 0