- 1
- 2
- 3
- 4
void print_line(char *s){
for(int i = 0; i < strlen(s); i++) putchar(s[i]);
putchar('\n');
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−3
void print_line(char *s){
for(int i = 0; i < strlen(s); i++) putchar(s[i]);
putchar('\n');
}
Почему C работает медленнее чем JavaScript ?
Цикл for в Си не кэширует условия (в отличие от Паскаля, например, где границы индекса определяются один раз), поэтому будет вызывать strlen на каждой итерации.
Итого сложность получится O(n²).
Вот такой вариант быстрее:
Но именно это и позволяет досовскую программу запустить в окне (если бы это было не так, она бы пачкала своим выводом окна).
А даже если бы и вызвал, то в регистр сегментов надо загрузить адрес такой структуры где сказано что это сегмент 16битного кода, иначе процессор не сможет выполнить код биоса, ну тупо может быть invalid opcode.
А судя по "asm (" и "movw " (AT&T syntax) речь идет о каком-то unix-like.
Так что режим там сто пудово защищенный 32х битный.
Может быть это Xenix: там 16бит, но все равно защищенный (просто без виртуальной памяти)
Теперь норм.
> movb $4, %eax сработает?
Ты хочешь в 32-битный регистр положить 8-битное число? Серьёзно? Или пиши movd, чтобы кокококонстанта была 32-битной, или используй movs/movz, расширяющие число (но они умеют расширять только в два раза: 8 бит до 16, 16 до 32, 32 до 64 и так далее).
Можно, кокококонечно, написать movb $4, %al и получить в трёх старших октетах мусор.
ой я дурак-дурак, конечно я хотел movd это же дабл ворд на интеле.
А можно положидь туда нуль а потом положить в нижнюю половинку (al), но это конечно говнецо
хих, прикольно, я давно на асме не писал
• movl $, %eax займёт 5 байт.
• xor eax, eax + mov al, 4 (пишу в синтаксисе «Интела») займёт 2 + 2 = 4 байта (ещё и во флаги насрёт).
• lea eax, [4] займёт 6 байт (когда в квадратных скобках смещение без регистра, нужна 32-битная константа).
• Можно исхитриться и написать lea eax, [eax + 4], тогда она займёт 3 байта (смещение может быть 8-битным или 32-битным), но нужно обнулить eax (самый короткий способ сделать это займёт 2 байта). Итого xor eax, eax + lea eax, [eax + 4] займут 5 байт.
• Погуглил про movsx и movzx (давно ими не пользовался). Оказывается, можно 8 бит расширить сразу до 32, но работают они только с регистрами или с памятью.
Тогда mov al, 4 + movzx eax, ax займут 2 + 2 = 4 байта.
mov al, 4 + cbw + cwde займут 4 байта.
Сначала эти мелкие инструкции засрут декодер, а потом ещё и выстроятся в очередь друг за другом.
WSL тоже не будет
Лососисис тунцов
Real x86-64 Linux may or may not handle int 0x80 even in 64-bit process. That depends CONFIG_IA32_EMULATION of kernel config.
WSL is not.
https://github.com/Microsoft/WSL/issues/3107
верно?
У меня от дебага виндового «Heaven's Gate» до сих пор ночные кошмары.
Неужели даже просто до O(n) с неважно какой константой оптимизация не доводит?
"Pascal": O(1). "C": O(n).
2. Кэширование границ итератора цикла "for".
"Pascal": есть. "C": нет, цикл реализован как обычный while.
Фу, середина - это всё ещё та же трудоёмкость. Квадратичное говно!
В оптимизированных версиях putchar '\0' ставят сразу в самое начало, и for (... strlen ...) даёт O(1), когда питушарское кэширование длины - O(n).
Почему квадратичное? N×log(N)
И правда, Си предоставляет кучу способов прострелить себе колено.
А ты юзай её правильно и всё будет норм.
Многие олдскульные функции из сишной либы тоже и на глобалки завязаны и строки портят.
Ниже петху про break написал.
https://govnokod.ru/4300#comment547526
–— А можно перепрограммировать контроллер 13-го прерывания?
Друг пытается понять, чего же от него хотят и что это за загадочный контроллер. Выдохнув, отвечает:
—– Ну, допустим, можно. А тебе это зачем нужно?
–— Винт отформатировать хочу! На низком уровне!
Вот на флопаре он работал, но можно было и без биоса обойтись: обычный format.com это делал (и высокоуровневое и низкоуровневое), иначе как бы им можно было сменить размер дискеты?
В BIOS'ах конца 90-х была функция «Low Level Format», но на самом деле это была файка: она фактически тупо записывала нули во все логические блоки, т. е. это высокоуровневое форматирование, но без файловой системы.
На флопаре format.com выполнял не совсем низкоуровневое форматирование. Он не мог отформатировать сбойные дискеты или дискеты, которые до этого были неправильно отформатированы.
Настоящее низкоуровневое форматирование дискет выполняла программа «FDA» –— «floppy drive analyzer». Она умела читать межсекторные промежутки, записывать любые заголовки физических секторов. С помощью неё можно было отформатировать дискету не только для «IBM PC», но и для «ДВК», «Агата» –— вот этого всего зоопарка чудовищ. Вот эта программа могла творить чудеса.
Судя по каким баграм от иногда возникающей потери данных, так оно и есть.