- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
#include <iostream>
using namespace std;
void f(int i)
{
cout << "----" << endl;
void *array[] = { &&foo, &&bar, &&baz };
goto *array[i];
foo:
cout << "Foo" << endl;
bar:
cout << "Bar" << endl;
baz:
cout << "Baz" << endl;
}
int main() {
// your code goes here
f(0);
f(1);
f(2);
return 0;
}
Анонимус 11.11.2014 00:17 # 0
bormand 11.11.2014 06:11 # +1
Анонимус 11.11.2014 14:31 # 0
bormand 11.11.2014 14:33 # +2
Анонимус 11.11.2014 14:37 # 0
Я не знал что это gcc only, потому не понял к чему вообще.
inkanus-gray 11.11.2014 07:33 # 0
bormand 11.11.2014 07:42 # +2
http://ideone.com/7CEueK
Анонимус 11.11.2014 14:32 # +1
inkanus-gray 11.11.2014 15:01 # +1
Расшифровка: DB 0BAH + XOR DX,DX = MOV DX, 0D233h. А дальше будет проверка DX на равенство нулю: http://govnokod.ru/13242
Анонимус 11.11.2014 17:53 # +2
TarasB 11.11.2014 19:50 # +2
inkanus-gray 12.11.2014 03:41 # +1
bormand 12.11.2014 07:10 # 0
inkanus-gray 12.11.2014 15:25 # 0
Анонимус 12.11.2014 22:07 # 0
Скажите, Борланд правда думал что именно это боттлнек?
inkanus-gray 12.11.2014 22:10 # +2
Анонимус 12.11.2014 22:12 # +2
Типа "а как же еще"?
bormand 11.11.2014 21:14 # +3
P.S. И ведь оно абсолютно бессмысленно, т.к. сам assign подразумевает последующее чтение с диска и т.п., по сравнению с которым один единственный jmp не был бы заметен.
hack2root 11.11.2014 11:46 # 0
roman-kashitsyn 11.11.2014 11:56 # +1
Dummy00001 11.11.2014 12:56 # +1
другого способа заставить компилятор соптимизировать switch/case через таблицу переходов не существует.
сам никогда не пользовался, но видел что пользуются этой фичей в паре интерпретаторов.
guest 11.11.2014 13:06 # 0
В фортране уже было.
Dummy00001 11.11.2014 13:12 # 0
guest 11.11.2014 15:40 # +1
roman-kashitsyn 11.11.2014 15:48 # +2
Dummy00001 11.11.2014 15:53 # 0
guest 11.11.2014 22:59 # +1
WGH 11.11.2014 15:01 # +4
roman-kashitsyn 11.11.2014 15:31 # +1
Гораздо удобнее же было бы написать что-нибудь вроде Без необходимости переписывать весь код на компиляторо-зависимое говно.
guest 11.11.2014 18:04 # 0
А switch разве не за O(1)?
roman-kashitsyn 11.11.2014 18:09 # 0
Xom94ok 11.11.2014 18:22 # 0
roman-kashitsyn 11.11.2014 18:39 # +1
bormand 11.11.2014 21:18 # 0
someone 12.11.2014 12:28 # 0
inkanus-gray 12.11.2014 15:27 # 0
TarasB 12.11.2014 15:35 # 0
inkanus-gray 12.11.2014 16:42 # 0
TarasB 12.11.2014 17:15 # +1
TarasB 12.11.2014 17:17 # 0
код со страницы 14.
на странице 15 про вычисление адреса:
> Да, строка 7 также не может быть сдвинута. Переход на неё осуществляется из строки 15, и её номер семь вычисляется через длину строковой переменной, в которой хранится картинка шипов. На которых и происходит смерть. Шипы высотой 3 пикселя (строка 38), поэтому позиционирование на шипах ведёт к переходу на 4+3 (строка 15) строку.
inkanus-gray 12.11.2014 20:27 # +1
Радует, что здесь переход к номеру строки, а не к адресу в памяти. Тут хотя бы тяжёлое зависание и крах системы не грозит, в отличие от той же сишки, где повсюду адресная арифметика.
Кстати, в QB была команда CALL ABSOLUTE, которая позволяла прыгнуть на произвольный адрес памяти.
bormand 12.11.2014 20:45 # +1
inkanus-gray 12.11.2014 21:59 # 0
Доки по асму у нас не было (у учителей в шкафу где-то были книжки от него, но нам спрашивать было лень), поэтому мы развлекались, записывая в случайные ячейки памяти случайные числа.
bormand 12.11.2014 22:28 # +1
Я так нашел регистры управления видеочипом и джойстиком и даже разобрался с ними... Ну и полный список команд бейсика вытряс, листая дамп памяти.
Анонимус 12.11.2014 22:45 # +2
guest 13.11.2014 01:46 # +1
bormand 13.11.2014 06:46 # 0
inkanus-gray 13.11.2014 06:49 # +1
Анонимус 12.11.2014 22:18 # +2
Благо, в реальном режиме это можно было сделать.
inkanus-gray 12.11.2014 22:22 # 0
P.S. Оставлю здесь для истории: http://govnokod.ru/13162
Анонимус 12.11.2014 22:28 # +2
Вот тут говорят товарищи что это дескать сильно быстрее и потому вот так.
Но если они это знают, то почему это не может знать компилятор и почему нельзя ввести в си какую-то конструкцию которая выглядела бы как няшечка, а внутри гоутушничала бы по разным адресам.
Qwertiy 12.11.2014 22:29 # 0
Анонимус 12.11.2014 22:41 # +1
В реальном режиме, особенно когда код писался в tiny mode (или как там режим когда один сегмент был) такая практика встречалась куда чаще.
inkanus-gray 12.11.2014 23:05 # 0
Анонимус 12.11.2014 23:16 # +1
Кстати, был еще режим когда сегменты были, а страниц не было (тоесть он protected, но без страниц и свапа соответственно). Кажется, он был в 286, ни одна ОС его не использовала, и он почил в бозе.
bormand 12.11.2014 23:18 # 0
inkanus-gray 12.11.2014 23:25 # 0
Только этот режим тоже не использовался, потому что программа, завязанная на него, не будет работать в виртуальном режиме (из Windows, например).
Анонимус 13.11.2014 01:11 # +2
Но это же какой-то дикий хак был, я даже не уверен что это где-то документировано интелом. Кошернее было переключаца на время программы в протектед мод. Dos4GW жеж!
inkanus-gray 13.11.2014 01:56 # 0
Несмотря на это, в ДОСе слишком долго эксплуатировались программы, использующие оперативку через дикие костыли типа XMS и EMS, позволяющие за пределами первого мегабайта размещать только данные. А некоторые и этого не умели. Ага, 640 к хватит всем.
Анонимус 13.11.2014 09:38 # +2
И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)
История IBM PC это вообще сплошные костыли, чего стоит только Gate A20)
guest 13.11.2014 23:04 # 0
Посчитай, сколько лет переходили со свиньи на семерку, сколько лет добавляли поддержку юникода в программы, когда его уже полностью поддерживала как минимум NT4.
>И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)
Хорошо что я это не застал.
bormand 13.11.2014 23:08 # 0
Переходили? :)
defecate-plusplus 13.11.2014 23:17 # +2
слава путину там хотя бы работают современные браузеры
inkanus-gray 14.11.2014 00:07 # +2
Анонимус 14.11.2014 01:30 # +1
Кстати ничего стращного в древних компах не было. ОС были проще и тупее, всё было понятно, никаких тебе реинсталлов)
Анонимус 12.11.2014 23:28 # 0
Причем в IA-32e (который x64) этот режим и вовсе отключили за ненадобностью. Только страницы, никаких сегментов.
Злые языки вообще говорят что сегменты изобрели чтоб адресовать память с помощью двух регистров (в один не влезало же), но я верю что интел придумал их чтоб программисту удобнее было разделять куски памяти под разные нужды.
bormand 12.11.2014 23:32 # 0
Но ведь это так и было ;)
Анонимус 12.11.2014 23:35 # +1
bormand 12.11.2014 23:23 # +2
https://github.com/bormand/tryos/blob/master/src/bootcode/kernelloader.asm
На страницы и свап мне тогда запала не хватило ;)
Анонимус 12.11.2014 23:30 # 0
да, со страницами там же надо таблицы загружать, page fault обрабатывать итд.
bormand 12.11.2014 23:41 # 0
Эх, давно это было... я еще вижуалку юзал. Этот код изначально то ли 2003 то ли 2005й вижуалкой собирался. А вместо мейкфайла был угрёбищный батник и vcproj для transform'а и kernel'а.
Это уже недавно, когда на гитхаб выкладывал, запилил makefile под vs 2012 да повыкидывал нафиг все sln/vcproj. Под gcc портировать было лень, т.к. transform перепиливать пришлось бы чуть более чем полностью. Да и ненужно это никому, разве что почитать, посмеяться над моей тогдашней наивностью...
Анонимус 13.11.2014 00:59 # 0
А как же менеджились депенденсы? Или каждый раз все модули пересобирались?
Вообще подобные сюрпризы встречаются тут и там.
Например взял я как-то библиотеку lettuce для python. А там процесс сборки и тестирования пострен на шелл скриптах. Очень удобно под виндой запускать!
Хорошо обстоят дела только в дотнете (их sln/proj прекрасно собирается msbuild, прямо с консоли) и наверное в android studio: их скрипты на gradle отлично синкаются с .idea (или как там папка проекта называется). Но там, все таки, депенденсы руками не прописывают же)
Qwertiy 13.11.2014 01:16 # 0
У них там баг есть. Если в в папке солюшена находится папка, имя которой начинается с пробела, и мы на неё ссылаемся. Вижак скомпилирует верно, а msbuild сделает трим. По крайней мере так с 2010й было.
Qwertiy 13.11.2014 01:18 # +1
guest 13.11.2014 01:43 # 0
Например, юзал я одну http библиотеку для питона, обертку для pycurl. Однажды я поставил другую библиотеку, которая обновила первую, и внезапно оказалось, что бинарник pycurl, лежащий на сайте этой библиотеки, скомпилирован без поддержки gzip, а сама библиотека хочет эту поддержку. Т.е. библиотека не фурычит с бинарным модулем, лежащим на ее же сайте и у меня в одно мгновение перестали работать все проги, юзавшие http. Питон на венду срал и будет срать, одно то, что он юникод в консоли до сих пор не поддерживает уже о чем-то должно говорить.
bormand 13.11.2014 06:58 # 0
Сишные проги пересобирались ручками из вижуалки. А асмовские модули компилились быстро и батник пересобирал их целиком.
Анонимус 13.11.2014 09:39 # 0
Фаулер бы Вас проклял!
bormand 13.11.2014 13:36 # 0
Да его и сейчас без студии не собрать. Я не пробовал под mingw, но скорее всего трансформ не отработает.
P.S. А, без запуска студии... Да мне в те дни на это было вообще насрать: как-то собирается - и то хорошо. Студенчество же :)
Анонимус 13.11.2014 16:26 # 0
guest 13.11.2014 23:02 # −4
Пошёл на хуй, выродок.
bormand 13.11.2014 23:09 # 0
Анонимус 14.11.2014 01:48 # 0
wvxvw 14.11.2014 11:35 # +1
bormand 14.11.2014 11:42 # +1
И на него из этой консоли упал кирпич... Да, это всё объясняет.
Анонимус 14.11.2014 01:46 # +3
guest 14.11.2014 11:56 # +2
Нет, это когда балка одним концом закреплена.
wvxvw 14.11.2014 18:00 # +1
(Вообще, само по себе слово "консоль" значит "подставка", т.е. пюпитр тоже своего рода консоль, или канделябр, который на рояль ставят - в том смысле, что он поддерживает что-то чем освещают, например).
1024-- 14.11.2014 18:48 # 0
> с волютами
Учил кто-нибудь экономику, комментарии оставлял в разделе про 1С, а тут вдруг зашёл в C++ и валюты какие-то на колоннах увидел.
"Вот жеж тупые ахретехторы - всю валюту в колонны пустили!"
wvxvw 14.11.2014 19:01 # 0
1024-- 14.11.2014 19:10 # 0
P.S. Вспомнил, как после паскаля вместо else на автомате дописывал "end". Да и после отладки распечатыванием в голову впечатывается writeln/printf/std::cout/console.log.
Qwertiy 13.11.2014 00:46 # 0
Мне кажется, или просто так переписывать код в рантайме вообще не самая лучшая идея?)))
Анонимус 13.11.2014 00:49 # 0
Просто окружение (язык и пр) могут явно НЕ поощрять какие-то вещи, а могут быть к ним индифферентными.
Вот НЕ tiny mode не поощряет, protected mode еще больше НЕ поощряет, а tiny mode индифферентен:)
guest 13.11.2014 01:48 # 0
Qwertiy 13.11.2014 03:22 # 0
roman-kashitsyn 13.11.2014 08:26 # 0
Анонимус 13.11.2014 09:41 # 0
roman-kashitsyn 13.11.2014 10:15 # 0
3.14159265 13.11.2014 13:26 # 0
FFTW - очень хороший пример селф-тюнинга.
guest 13.11.2014 23:02 # 0
inkanus-gray 14.11.2014 13:23 # 0
guest 14.11.2014 15:37 # +2
3.14159265 12.11.2014 15:38 # 0
>И даже в Паскале нет.
Паскаль не показатель. Он алголоподобный.
Бейсик же произошёл от немного другого языка, а в фортране оно изначально было.
inkanus-gray 12.11.2014 22:33 # 0
Кстати, а RustGovno и ClayGovno у нас уже были?
gost 13.11.2014 00:47 # +2
Psionic 14.11.2014 18:04 # 0
inkanus-gray 14.11.2014 20:05 # 0
Анонимус 14.11.2014 20:33 # 0
Просто не всем кажется верным вытарчивать в более высокоуровневые языки столь низкими вещами
---
>> jmp принимать как аргумент не только константы?
Наверное Вы хотели сказаать "не только литерал может быть операндом JMP"
guest 30.05.2017 17:35 # 0