- 1
#define BSWAP16(x) ( (uint16_t)(((uint32_t)x)*(1 | 1 << 16) >> 8) )
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
#define BSWAP16(x) ( (uint16_t)(((uint32_t)x)*(1 | 1 << 16) >> 8) )
j123123 15.03.2019 10:46 # 0
bormand 15.03.2019 11:35 # +1
COTOHuHCKuu_nemyx 15.03.2019 11:58 # 0
j123123 15.03.2019 12:04 # +1
Надо наверно так, чтоб уж наверняка:
bormand 15.03.2019 12:34 # 0
guest8 15.03.2019 12:41 # −999
gost 15.03.2019 12:45 # 0
guest8 15.03.2019 12:46 # −999
gost 15.03.2019 12:48 # 0
TEH3OPHblu_nemyx 15.03.2019 12:59 # 0
По крайней мере, в Open Watcom уже есть <stdint.h>.
У x86 есть несколько инструкций для 32-битных чисел, они используют пару регистров (DX и AX, например).
guest8 15.03.2019 13:15 # −999
COTOHuHCKuu_nemyx 15.03.2019 13:25 # 0
guest8 15.03.2019 13:28 # −999
COTOHuHCKuu_nemyx 15.03.2019 13:30 # +2
guest8 15.03.2019 17:42 # −999
COTOHuHCKuu_nemyx 15.03.2019 17:53 # 0
gost 15.03.2019 18:05 # 0
TEH3OPHblu_nemyx 15.03.2019 18:10 # 0
Потому что автор оставил такие метаданные в pdf-файле. Он ещё написа́л, что автора зовут gabriele.
gost 15.03.2019 18:26 # 0
TEH3OPHblu_nemyx 15.03.2019 13:36 # +1
Я ещё открыл для себя давно забытую инструкцию SHLD: сдвинуть содержимое регистра на N позиций влево, вдвинув в освободившиеся позиции биты из другого регистра. Есть аналогичная инструкция SHRD.
А ещё в плавпитухе есть 32-битное и 64-битное целое.
COTOHuHCKuu_nemyx 15.03.2019 14:01 # 0
Но как с целым-то с ним оперировать не получится.
TEH3OPHblu_nemyx 15.03.2019 15:13 # +1
Но снимок в оперативке, сделанный инструкцией КУЛАК, выглядит так же, как обычное целое число.
guest8 15.03.2019 17:41 # −999
TEH3OPHblu_nemyx 15.03.2019 18:11 # 0
guest8 15.03.2019 18:19 # −999
gost 15.03.2019 12:40 # 0
j123123 15.03.2019 14:01 # 0
x = BSWAP16(x++);
COTOHuHCKuu_nemyx 15.03.2019 14:14 # +1
COTOHuHCKuu_nemyx 15.03.2019 14:16 # 0
COTOHuHCKuu_nemyx 15.03.2019 14:28 # +1
3oJloTou_nemyx 15.03.2019 21:03 # 0
Собственно, по твоей аве это заметно.
3.14159265 26.08.2021 15:07 # 0
В js никаких uint16_t нету.
> ((x << 8 | x >> 8)&0xFFFF) .toString(16);
Именно поэтому я за «js».
На самом деле касты говно, а такой код будет работать в любом сиподобном языке.
j123123 15.03.2019 21:47 # 0
COTOHuHCKuu_nemyx 15.03.2019 23:27 # 0
TEH3OPHblu_nemyx 16.03.2019 02:33 # 0
3oJIoTou_xyu 16.03.2019 06:12 # 0
gost 15.03.2019 17:26 # 0
j123123 16.03.2019 11:45 # +1
Сократил, проверь.
Очевидно же, что если ксорить какое-то говно два раза с одним и тем же говном, то ничего не поменяется
gost 16.03.2019 12:20 # 0
TEH3OPHblu_nemyx 16.03.2019 12:24 # 0
COTOHuHCKuu_nemyx 15.03.2019 11:53 # +1
https://ideone.com/1KiivR Работает и в режиме компиляции (как макрос) и в режиме интерпретации.
COTOHuHCKuu_nemyx 15.03.2019 14:49 # +2
3.14159265 26.08.2021 15:12 # +1
В js тоже есть «union»
COTOHuHCKuu_nemyx 15.03.2019 16:09 # +2
COTOHuHCKuu_nemyx 15.03.2019 16:29 # 0
COTOHuHCKuu_nemyx 15.03.2019 21:20 # 0
3_dar 15.03.2019 21:24 # 0
TEH3OPHblu_nemyx 15.03.2019 21:26 # 0
j123123 16.03.2019 11:40 # +2
gost 16.03.2019 12:46 # 0
j123123 16.03.2019 13:06 # 0
TEH3OPHblu_nemyx 16.03.2019 13:27 # +1
Есть инструкция xchg, ожидающая восьмибитные данные. Аргументами могут выступать два восьмибитных регистра либо восьмибитный регистр и указатель на память.
COTOHuHCKuu_nemyx 16.03.2019 14:03 # +2
TEH3OPHblu_nemyx 16.03.2019 14:24 # 0
TEH3OPHblu_nemyx 16.03.2019 14:48 # 0
TEH3OPHblu_nemyx 16.03.2019 15:18 # +2
Итого: 2g@0G@2G@2G@2g@0g@0G@
21 байт. Длинновато вышло, зато в ASCII-кодах.
HoBblu_nemyx 16.03.2019 15:38 # +1
TEH3OPHblu_nemyx 16.03.2019 15:42 # +2
guest8 16.03.2019 15:42 # −999
TEH3OPHblu_nemyx 16.03.2019 15:44 # +1
http://govnokod.ru/15764#comment419684
guest8 16.03.2019 15:56 # −999
TEH3OPHblu_nemyx 16.03.2019 16:01 # 0
g@ –— это ah, [bx+40h]
G@ –— это al, [bx+40h]
TEH3OPHblu_nemyx 18.03.2019 15:57 # 0
http://www.club155.ru/x86cmdformats-modrm
TEH3OPHblu_nemyx 16.03.2019 15:51 # 0
COTOHuHCKuu_nemyx 16.03.2019 18:18 # +2
PPDXD
TEH3OPHblu_nemyx 16.03.2019 18:20 # 0
TEH3OPHblu_nemyx 16.03.2019 18:25 # +1
COTOHuHCKuu_nemyx 16.03.2019 18:48 # 0
TEH3OPHblu_nemyx 16.03.2019 21:53 # 0
А так придётся SP где-то ещё сохранять, а потом восстанавливать.
TEH3OPHblu_nemyx 18.03.2019 01:55 # +1
64-битный вариант (почему-то не работает):
TEH3OPHblu_nemyx 18.03.2019 03:15 # +1
TEH3OPHblu_nemyx 18.03.2019 03:22 # +3
https://ideone.com/jycvRV
bormand 18.03.2019 09:21 # +2
А ты декомпильни этот код. 'D' - не инкремент. Это префикс REX.R
TEH3OPHblu_nemyx 18.03.2019 13:39 # +1
Какой багор )))
Надо запомнить, что у x86-64 однобайтовых инкрементов/декрементов нет, на их месте ненужные префиксы Рэкс-фас; PUSHA, POPA, BOUND отменили; на месте ARPL теперь MOVSXD; AAA, AAS, DAA, DAS, AAM, AAD отменили; префиксы сегментов отменили, за исключением FS, GS; пуш и поп для сегментных регистров тоже отменили; LES, LDS, CALL FAR, JMP FAR тоже отменили.
И зачем-то отменили опкод 82H, который никому не мешал.
Как вообще можно что-то делать без однобайтовых инкрементов/декрементов???
TEH3OPHblu_nemyx 18.03.2019 13:45 # +1
83H –— это операции с 16/32-битным регистром, у которых в качестве второго аргумента выступало 8-битное непосредственное, которое на лету дополнялось нулями до 16/32-битного. Было очень удобно, потому что не нужно было хранить в программе лишние нули.
А 82H –— это просто копия 80H.
TEH3OPHblu_nemyx 18.03.2019 14:34 # +1
TEH3OPHblu_nemyx 18.03.2019 15:19 # +2
https://ideone.com/2Z5MCE
Узнал две особенности x86-64:
1. У кучи инструкций непосредственный аргумент может быть максимум 32-битным. Старшая половина добивается нулями. Мне пришлось делать четыре 16-битных пуша, чтобы запушить 64-битное число.
2. У инструкций с mod-R/M нужно указывать префикс REX.W (H), иначе результат обрежется до 32-битного.
Как всё сложно...
TEH3OPHblu_nemyx 18.03.2019 15:27 # 0
https://ideone.com/6T9Ima
3.14159265 26.08.2021 16:15 # 0
> fffUUfUU
Что-то мне не нравится pitush word 0x5555.
ABryCTOBCKuu_nemyx 26.08.2021 16:17 # 0
Есть альтернативный способ?
3.14159265 26.08.2021 16:23 # 0
> вместо инкремента вычитать минус единицу
А через CWD/CDQ не получится?
ABryCTOBCKuu_nemyx 26.08.2021 16:26 # 0
3.14159265 26.08.2021 16:28 # 0
Например
ABryCTOBCKuu_nemyx 26.08.2021 16:33 # 0
3.14159265 26.08.2021 16:35 # +1
SUB AL, 85
SUB AL, 85
SUB AL, 85
ABryCTOBCKuu_nemyx 26.08.2021 16:31 # +1
Вот тут автор изобрёл компилятор, который получает EXE-файлы для «DOS», состоящие только из печатаемых ASCII-символов (включая заголовок):
http://tom7.org/abc/
https://sourceforge.net/p/tom7misc/svn/HEAD/tree/trunk/abc/
Такой экзешник можно передавать как текстовый файл.
3.14159265 26.08.2021 16:34 # 0
Даже file не разгадал
ABryCTOBCKuu_nemyx 26.08.2021 16:38 # 0
А вот EXE-файлов, зожатых таким образом, я не видел. Tom7 — первый, кто придумал заголовки EXE составлять из печатаемых символов.
3.14159265 26.08.2021 16:42 # +3
В странную эпоху живём.
Появились читабельные EXEшники.
Исчезли читабельные JSники.
Теперь JS имеет читабельность бинарного файла, зато обладает скоростью скриптового языка.
guest6 26.08.2021 16:50 # 0
Миша Збыковски просил передать, что давно уже
ABryCTOBCKuu_nemyx 26.08.2021 17:49 # 0
3.14159265 26.08.2021 16:58 # 0
cdq не ascii
Именно поэтому я за x86-32
3.14159265 26.08.2021 17:09 # 0
TEH3OPHblu_nemyx 18.03.2019 16:02 # 0
gost 18.03.2019 16:19 # +1
https://stackoverflow.com/questions/14698350/x86-64-asm-maximum-bytes-for-an-instruction
«mov qword [rax + rcx + 0x11223344], 0x55667788», например, занимает 12 байт, а с 64-битным аргументом получится 16 (и ещё всякие префиксы могут быть же). Ну и как пишут на SO — 64-битный аргумент можно напрямую загружать в регистр.
TEH3OPHblu_nemyx 18.03.2019 16:24 # +1
TEH3OPHblu_nemyx 18.03.2019 16:29 # 0
TEH3OPHblu_nemyx 18.03.2019 14:09 # +1
В 64-битном режиме у «gcc» есть два соглашения о вызове: «sysv_abi» и «ms_abi». При «sysv_abi» первые 6 аргументов передаются через регистры (RDI, RSI, RDX, RCX, R8, R9), при «ms_abi» только четыре первых аргумента передаются через регистры (RCX, RDX, R8, R9). Плавающий питух передаётся через питушиный стек (до четырёх аргументов в случае «ms_abi» и до восьми аргументов в случае «sysv_abi»). Стек в обоих случаях чистит вызываемая функция. Нельзя портить RBX и RBP (а для «ms_abi» ещё и RSI и RDI) и четыре последних нумерных.
В 32-битном режиме вариантов способа вызова гораздо больше. «Fastcall» у разных компиляторов реализован по-разному («gcc» первые два аргумента передаёт через ecx и edx).
Мне больше всего понравилось, как сделали в «Watcom C»: там с помощью #pragma можно создать своё собственное соглашение, указав, через какие именно регистры нужно передавать аргументы и кто будет чистить стек.
TEH3OPHblu_nemyx 18.03.2019 18:26 # 0
gost 18.03.2019 18:33 # +1
bormand 18.03.2019 19:05 # +2
Эта хуйня порождает очень весёлые баги в ring 0 (если пишешь своё ядро, например)... Её, конечно, можно отключить. Но для этого про неё надо знать.
guest8 18.03.2019 19:36 # −999
bormand 18.03.2019 19:48 # +1
Да тупо процессор во время обработки прерывания. Он же ничего не знает про эти ваши редзоны.
TEH3OPHblu_nemyx 18.03.2019 19:55 # +1
BEKTOPHblu_nETyX 18.03.2019 19:37 # 0
TEH3OPHblu_nemyx 18.03.2019 20:19 # 0
Я надеваю штиблеты и галстук-шнурок,
Я запираю свою дверь на висячий замок.
bormand 18.03.2019 19:49 # +1
Вызывающая.
TEH3OPHblu_nemyx 18.03.2019 19:54 # +2
То есть можно создавать функции с переменным количеством аргументов, а вот сделать принудительный пуш/поп посредством каламбура типов не получится.
bormand 18.03.2019 19:58 # +2
bormand 18.03.2019 20:29 # +1
В общем-то это даже надёжней т.к. вызываемый видит обе границы аргументов. А в cdecl - только нижнюю.
TEH3OPHblu_nemyx 18.03.2019 20:42 # 0
Варианты реализации:
1. Патчить код (изменять байтик, следующий за опкодом RET). Для этого нужно снимать защиту.
2. Свитч-кейс, в каждой ветке которого будет RET N с соответствующим значением N.
3. Извлекать из стека адрес возврата, чистить стек, после этого делать джамп (ну или push+ret) на сохранённый в регистре адрес возврата.
bormand 18.03.2019 20:48 # 0
А можно даже количество не передавать. Не дочитал все vararg'и - получай UB.
bormand 18.03.2019 20:53 # +1
BEKTOPHblu_nETyX 18.03.2019 22:36 # 0
bormand 18.03.2019 21:06 # 0
Кстати, а ведь ret и ret N спекулятивно возвращаются к вызывающему независимо от N и состояния стека? Т.е. вариант с push + ret будет более правильным, нежели jmp...
TEH3OPHblu_nemyx 18.03.2019 22:24 # 0
BEKTOPHblu_nETyX 18.03.2019 22:35 # 0
BEKTOPHblu_nETyX 18.03.2019 22:35 # 0
bormand 18.03.2019 22:42 # +2
Сперва присунул, потом спросил?
BEKTOPHblu_nETyX 18.03.2019 22:47 # 0
CHayT 18.03.2019 22:50 # +1
TEH3OPHblu_nemyx 18.03.2019 22:53 # 0
guest8 18.03.2019 23:07 # −999
gost 19.03.2019 00:01 # 0
…кроме ЗППП.
BEKTOPHblu_nETyX 18.03.2019 22:36 # 0
TEH3OPHblu_nemyx 18.03.2019 22:49 # 0
guest8 16.03.2019 16:33 # −999
A3APTHblu_nemyx 16.03.2019 16:39 # +3
guest8 16.03.2019 16:43 # −999
TEH3OPHblu_nemyx 16.03.2019 16:46 # +1
guest8 16.03.2019 16:56 # −999
TEH3OPHblu_nemyx 16.03.2019 18:41 # 0
COTOHuHCKuu_nemyx 16.03.2019 18:52 # 0
HoBblu_nemyx 16.03.2019 19:23 # 0
COTOHuHCKuu_nemyx 17.03.2019 11:11 # 0
PACTPOBblu_nemyx 20.04.2019 01:22 # 0
Пишут, что сервис славится нереальными задачами типа доставить еду на расстояние 4 километра за 14 минут. Напоминаю, что курьер пеший. За опоздание штраф.
cmepmop 20.04.2019 02:03 # +1
PACTPOBblu_nemyx 20.04.2019 03:09 # 0
https://habr.com/ru/news/t/448722/
Один комментатор уже вспомнил песню «16 тонн». Если кто-то не знает, это песня про США эпохи Великой депрессии:
https://ru.wikipedia.org/wiki/Sixteen_Tons
guest8 20.04.2019 04:05 # −999
bormand 20.04.2019 02:59 # +1
Имхо, страшнее когда так работают таксисты или газелисты. Зомбаки за рулём.
> нереально
Если верить гуглу, то КМС должен пробежать за это время 5км. Так что вполне реально.
PACTPOBblu_nemyx 20.04.2019 03:11 # 0
С десятикилограммовым рюкзаком?
> Зомбаки за рулём.
Читал в какой-то книжке, что спящий водитель хуже пьяного: у пьяного есть хоть какая-то реакция, пусть даже с задержкой, а у спящего реакции на обстановку нет.
bormand 20.04.2019 04:06 # 0
Ну да, это уже к спецназовцам...
guest8 20.04.2019 04:10 # −999
bormand 20.04.2019 04:12 # 0
Xyu_HE_3HAET 20.04.2019 04:12 # 0
guest8 20.04.2019 04:13 # −999
bormand 20.04.2019 04:17 # 0
Xyu_HE_3HAET 20.04.2019 04:19 # 0
bormand 20.04.2019 04:10 # 0
6arPoBblu_nemyx 20.04.2019 10:43 # 0
guest8 17.03.2019 01:00 # −999
guest8 17.03.2019 01:01 # −999
guest8 17.03.2019 01:35 # −999
guest8 17.03.2019 01:50 # −999
COTOHuHCKuu_nemyx 17.03.2019 11:09 # 0
guest8 17.03.2019 11:58 # −999
BEKTOPHblu_nETyX 17.03.2019 23:50 # 0
A3APTHblu_nemyx 18.03.2019 00:31 # 0