М.Двач / Программирование

Этого треда уже нет.
Это копия, сохраненная 5 февраля 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

39 Кб, 360x299

Assembler тредд 09 Дек, 21:30 #600262 В конец треда | Веб

Тред самого трушного языка небыдлокодинга объявляется открытым. И сразу вопрос если тут есть ассемблерщики, почему этот код http://pastebin.com/1n1vnhPt запускается, а этот http://pastebin.com/iTbND3mz нет?

Разница в том что в первом случае вызов главной процедуры идёт до её определения, а во втором случае после. Компилятор masm32.

105 Кб, 450x540

09 Дек, 22:14 #2 #600306

Тащемта, ассемблер говно и нинужен.

09 Дек, 22:24 #3 #600316

>>600262 (OP)
Потому что это тебе не JavaScript. Выпоолнение начинается по start, вызываются GetModuleHandle и GetCommandLine и продолжается дальше. А дальше там тело WinMain, и оно начинает выполняться (а чего ты хотел? чтобы оно магически пропускалось? тогда втыкай jmp). В числе прочего там используется параметр hInst, которого в стеке нихуя нет, потому что в функцию мы вошли, а не вызвали ее, и CreateWindowEx фейлится из-за мусора вместо hInst, и все виснет на цикле обработки сообщений. До вызова WinMain выполнение не доходит.

09 Дек, 23:37 #4 #600383

Но ведь есть разные ассемблеры и часто они вообще не похожи.

Ответы: >>600397, >>602063

09 Дек, 23:53 #5 #600397

>>600383
Все ассемблеры похожи (ну, пока это не какой-нибудь Itanium), отличия в синтаксисе незначительные.

44 Кб, 328x420

1928 Кб, 2272x2362

13 Дек, 01:25 #6 #602063

>>600383
Ассемблер соответствует архетиктуре своего чипа, разные разрядности, разные регистры, разная реализация тех или иных вещей, но по своей сущности и логике какойнибудь z80 asm и masm - это родные братишки. Ассемблер это как набор инструментов, один побогаче другой по проще, но ключи с отвёртками везде одинаковые, и служат для одних и тех-же целей.

14 Дек, 16:17 #7 #603215

>>600262 (OP)
>masm32
eternal zashquar

Ответы: >>603276

14 Дек, 17:34 #8 #603276

>>603215
Что плохого в масм? Каими одобряет.

Ответы: >>603565

14 Дек, 18:14 #9 #603304

Когда я хочу узнать объективное мнение людей о чем-либо, я гуглю "Что-то там говно". Так вот, по запросу "masm говно" гугл не выдал ничего плохого.

Ответы: >>603450

14 Дек, 20:27 #10 #603450

>>603304
>не выдал ничего плохого
Как будто что-то хорошее.

14 Дек, 21:17 #11 #603505

Насколько трудно написать на ассемблере бутлоадер, который при включении компьютера будет писать "Hello world!"?

Ответы: >>603561

14 Дек, 22:02 #12 #603561

>>603505
Около десяти инструкций, пять минут (для новичка час).

14 Дек, 22:06 #13 #603565

>>603276
> Что плохого в масм
Windows-only, assume, addr, ptr, offset, proto, директивы с точечкой, невнятные сообщения об ошибках.

Ответы: >>603594

14 Дек, 22:31 #14 #603594

>>603565
>assume, addr, ptr, offset, proto
А в этом что плохого? Мне сравнить не с чем.
>директивы с точечкой
Да, некрасиво.

Ответы: >>603616

14 Дек, 22:45 #15 #603616

>>603594
Это вкусовщина на самом деле. Например, у fasm гораздо более логичный синтаксис, когда дело касается чтения памяти (он больше похож на синтаксис, используемый в мануалах Intel, и тебе не надо думать, где воткнуть offset, а где addr), но зато у него на всю голову ебнутый макроязык.
assume - это способ скрывать от программиста кодогенерацию, не слишком правильный подход для ассемблера.

Ответы: >>604115

14 Дек, 23:19 #16 #603667

Подпiсался.

15 Дек, 13:14 #17 #604115

>>603616
Самая большая проблема масма - PROTO DWORD DWORD DWORD. Именно из-за этого я с него и съебал.
Единственная проблема макросов в фасме - невозможность написать инлайн макрос. Из-за этого, если ты хочешь сделать что-то вроде mov eax, RGB(255,15,128), то придётся перегружать mov (а так же push и, возможно, что-нибудь ещё).

Ответы: >>604656

15 Дек, 22:13 #18 #604656

>>604115
То есть, в fasm тебя не смущает синтаксис match, необходимость экранировать {}, помнить отличия = от fix, equ и define? Про фундаментальные проблемы я вообще молчу. И про fasmg вместо fasm 2.

Ответы: >>604746

15 Дек, 23:46 #19 #604746

>>604656
>синтаксис match
Обычный препроцессор на стероидах. Чему там смущать-то?
>необходимость экранировать {}
Неприятно, конечно, но пофиг, ибо ты не каждый день пишешь макросы.
>помнить отличия = от fix, equ и define
А что там помнить? equ - препроцессор, = - ассемблер, fix - почти как equ, только приоритет выше и можно всякие штуки переопределять, а дефайном я пользовался один раз, когда переводил сишный хэдер - альт+шифт сэкономили кучу времени.
И это всё всё равно лучше масма.

17 Дек, 18:08 #20 #606019

бамп

0 Кб, 32x32

17 Дек, 18:29 #21 #606082

Сап, /pr/.
Собственно, я начал юзать hiew для того, чтобы что-то попробовать писать на ассемблере, сам комп я трогать не могу, но есть другой, ОЗУ 64мб, процессор 500Мгц с разгоном вышел, вот я его себе в итоге присвоил %делай, шо хош%, сейчас на нём стоит DOS 7 %винда кашляет и умирает%, сейчас думаю что-нибудь пописать, но не знаю, какой лучше ассемблер взять, сразу скажу, что на этом батином компе я могу только браузер юзать для скачивания и прочих простых махинаций, ничего устанавливать и прочее я не могу см. Параграф №5 Получение пизды от бати. Есть Far для текста, CodeView по-моему от паскаля или тубро си остался, хотелось бы попробовать в какие-нибудь простые игры.

Ответы: >>606090

17 Дек, 18:30 #22 #606090

>>606082
Линупс ставь лучше, возможностей больше будет.

Ответы: >>606092

17 Дек, 18:32 #23 #606092

>>606090
Ставил минт, бубунту и паппи, все они дёргались и тыркались, вплоть до всяких разноцветных аналогов БСОДа, изначально на компе стоял 6-й дос, с ним и собирался, Си я пока что тыркать не буду принципиально

Ответы: >>606511

17 Дек, 21:12 #24 #606286

Друзья, поясните нуфагу. Вот код:
CSEG segment
org 100h
Begin:
mov ax,0B800h
mov es,ax
mov di,0
mov al,1
mov ah,31
mov cx,2000

Next_face:
mov es:[di],ax
add di,2
inc cx
jnz Next_face

mov ah,10h
int 16h
int 20h
CSEG ends
end Begin

После выполнения строчки "mov es:[di],ax" в память по соответствующему адресу помещается 01 1F. Это так и должно быть (я так думаю), НО блядь после выполнения следующей строчки (add di,2) память принимает прежнее значение. Что может быть за хуйня? (МАСМ 6.11 Отладчик - АФДПРО)

Ответы: >>606292, >>606300, >>606315, >>622926

17 Дек, 21:17 #25 #606292

>>606286
>2016
>16 бит
>сегментация
ну ты лол.
>НО блядь после выполнения следующей строчки (add di,2) память принимает прежнее значение
потому что к di прибавляется 2 и теперь твой отладчик показывает значение по другому адресу, очевидно же.

Ответы: >>606304

17 Дек, 21:25 #26 #606300

>>606286
Ну так кто-то видеопамять обновляет. Попробуй запретить прерывания, записать в видеопамять, а потом считать. А вобще отлаживать графические приложения жопа.

157 Кб, 957x724

141 Кб, 953x716

17 Дек, 21:30 #27 #606304

>>606292

17 Дек, 21:41 #28 #606315

>>606286
Без отладчика запускать пробовал? На другой странице запускать пробовал? В AFDPro куча багов была, наверняка это один из них - читает память после того, как сам туда насрал.

17 Дек, 22:09 #29 #606335

То чувство, когда по вопросам понимаешь, какую книжку по асму сейчас наяривает анон.

18 Дек, 01:28 #30 #606511

>>606092
Очевидный Knoppix попробуй.

Ответы: >>606754

18 Дек, 08:34 #31 #606568

>>600262 (OP)
Поясните за ассемблер?
Для чего его юзают какие-то крупные предприятия и корпорации?
Т.е., если я его выучу и пойду на работу, что я на нём буду писать? И насколько он сложный в освоении?

181 Кб, 1914x1020

18 Дек, 10:39 #32 #606624

Ассемблера я не знаю. но хочу научится выполнять простейшие правки в чужих программах в связке ollydbg + idapro + hex-rays
Например там нашел в псевдокоде функцию и мне надо чтобы она всегда выводила положительный результат, как это все осуществлятся, везде гайды 2005-2008 года, а есть что-то поновее?

Ответы: >>606634

18 Дек, 11:07 #33 #606634

>>606624
1) Выделяешь в псевдокоде нужную строчку, нажимаешь Tab.
2) Смотришь на ассемблерный код и думаешь, что конкретно нужно поменять.
3) Смотришь в левом нижнем углу окошка с кодом файловый оффсет.
4) Любым ассемблером генерируешь код (можно встроенным в OllyDBG, можно масм, можно осилить format binary и virtual at в fasm).
5) ...
6) Патчишь.

Ответы: >>606639

129 Кб, 1920x1023

18 Дек, 11:20 #34 #606639

>>606634
Если начать с менее сложного, правильно ли будет написать простенькую программу для проверки пароля и вывода фразы и на ней для начала потренироваться. Дабы попробовать сделать чтобы пароль не проверялся. Или надо с еще проще примера начать?

Ответы: >>606642

18 Дек, 11:25 #35 #606642

>>606639
Норм. Алсо, для мелочи можно править прямо в ольке (по пробелу вроде ассемблер), потом правой кнопкой, Copy to executable -> All modifications, потом правой кнопкой по открывшемуся окну, Save file.

Ответы: >>606646

11 Кб, 377x295

18 Дек, 11:35 #36 #606646

>>606642
Вот всех этих мелочей как раз не хватало, куда и что нажимать, в гайдах все пишут так, как будто пишут для уже все знающих. Спасибо тебе анон. Поставил для себя первую задачу, приравнять две переменные

Ответы: >>606758

18 Дек, 14:50 #37 #606754

>>606511
Вау, спасибо)

18 Дек, 14:54 #38 #606758

>>606646
Лучше возьми какой-то компилятор вроде TCC, чтобы куча мусора и ненужные отпимизации не мешали анализировать дизасм-дрисню.

18 Дек, 20:11 #39 #606948

Ял считаюл, чтол самыйл отсосныйл ассемблерл это %GNU %asm. Дискасс.

Ответы: >>607043, >>607045

18 Дек, 23:03 #40 #607043

>>606948
Ноу дискас.

18 Дек, 23:06 #41 #607045

>>606948
mov qword ptr [tvoi_roteshnik], hui

Ответы: >>607092

19 Дек, 00:26 #42 #607092

>>607045
>qword
Ммм, какой большой.

19 Дек, 22:14 #43 #607745

Перед выполнением LEAVE у меня было такое состояние регистров и стека:
ESP = 0012FFAC
EBP = 0012FFB4

Стек:
0012FFAC 0000000F
0012FFB0 00000007
0012FFB4 0012FFF0
0012FFB8 0040100C

После выполнения регистры стали равны:
ESP = 0012FFB8
EBP = 0012FFF0

Почему ESP стал именно таким, если leave аналогична инструкциям mov esp, ebp и pop ebp?

19 Дек, 23:08 #44 #607768

mov esp, ebp:
-> ESP = EBP = 0012FFB4
pop ebp:
-> EBP = [0012FFB4] = 0012FFF0
-> ESP = ESP + 4 = 0012FFB4 + 4 = 0012FFB8
Что не так-то?

Ответы: >>607769

19 Дек, 23:11 #45 #607769

>>607768
Понял.

Ответы: >>607773

19 Дек, 23:14 #46 #607773

>>607769
Разобрался в том, что загружается из стека, но почему после mov esp, ebp в esp не то, что я ожидал увидеть, я не понял.

Если регистры
ESP = 0012FFAC
EBP = 0012FFB4

То после mov esp, ebp они должны быть равны. Почему это не так?

Ответы: >>607822

20 Дек, 01:00 #47 #607822

>>607773
Так потом POP модифицирует и EBP, и ESP. Напиши вместо leave инструкции mov и pop и посмотри сам.

Ответы: >>607833

20 Дек, 01:15 #48 #607833

>>607822
Каким образом pop модифицирует оба регистра? Они разве связаны? Регистр ebp ведь не должен влиять на esp, если я явно не прописал копирование значений. Мы его используем, когда надо скакать по стеку, не влияя на esp.

Что-то я туго соображаю, не выспался и часто ловлю себя на мысли, что долго неподвижно смотрю в одну точку.

Ответы: >>607851

20 Дек, 01:37 #49 #607851

>>607833
pop reg - это:
reg = [esp]
esp += 4.

Ответы: >>607857

20 Дек, 01:45 #50 #607857

>>607851
>esp += 4
Блять, действительно, упустил это из виду.

102 Кб, 1477x641

03 Янв, 23:49 #51 #618141

\t

Блядь, я просто не понимаю, что происходит.

Что это за вычисления? Нахуй они нужны?
Может мне кто-нибудь объяснить?

Мы ранее посчитали урон, который должен нанести персонаж.
В v0 мы считываем какое-то значение, в данном случае нулевое. В v1 кладётся наш посчитанный урон.
К нулю, находящемуся в v0, мы прибавляем сотню и перемножаем результат с v1.
0x64 * 0x3 = 0x12C или 300.
Эти три сотни мы умножем на волшебное число 0x51EB851F, получая в данном случае 0x6000000054. Нижние 32 бита результата игнорируем, а верхние (то есть, в данном случае, 0x60) шифтим вправо на 5, получая обратно наше число 3, которое и сохраняем как посчитанный нанесённый урон.
Помимо этого мы ещё делаем шифт числа 0x12C на 0x1F, то есть 31. Что это? Проверка знака?
Я не знаю, тут отрицательных чисел не встречал, в итоге результат всегда нулевой. Мы потом вычитаем этот результат из трех, но 3 минус 0 = 3.

В итоге тут куча операций над числом 3, после которых она остаётся числом три. Нахуя? ЧТо это за проверка, что она значит? Схема работает при любых числах, 5 даст нам в итоге 5 после шифтов и умножений, а десять даст десять. Что-то пойдет по-другому, если вдруг какое-то из чисел будет отрицательным?

Ассемблер-кун, выручай.

Ответы: >>618143, >>618180

03 Янв, 23:49 #52 #618143

>>618141
В общем, я погуглил.
Оказывается, это что-то связанное с оптимизацией, а вычисления связанные с 0x51EB851F сюда добавлены компилятором.
Но толком не понял.

04 Янв, 00:26 #53 #618180

>>618141
> 0x51EB851F
Деление дорогое, заменяется умножением. Гугли multiplicative inverse или вот это посмотри: http://web.archive.org/web/20050220011705/http://wasm.ru/baixado.php?mode=tool&id=203

0 Кб, 244x19

04 Янв, 01:41 #54 #618259

Почему mult FFFFFFA0, 51EB851F дало пикрелейтед?

Windows калькулятор не согласен.

Ответы: >>618263

04 Янв, 01:44 #55 #618263

>>618259
Вопрос снят, я мудак, FFFFFFA0 же знаковое.

04 Янв, 23:00 #56 #618807

Как данные попадают с диска в оперативную память?

Разобрал нужную мне функцию в экзешнике игры для PS1. Задумал переписать её. Понял, что она слишком велика и сложна, так что проще подменить результат вычислений. Места мало, так что без серьезных изменений оригинального кода ничего не сделаешь. Решил просто воткнуть jal, который уведет к выполнению моего кода.

Но тут проблема. Я не знаю, где разместить свои инструкции. Да, в дебагере можно положить их куда угодно, а потом прыгнуть на адрес и всё будет ок. Но мне нужно добавить инструкции так, что я просто запускал образ в эмуляторе или диск на консоли и всё работало.

Потом я внезапно понял, что мипсовый ассемблер не имеет инструкций для работы с данными на диске, он может только перемещать данные между регистрами и ram. Как тогда данные попадают в ram?

Я внезапно понял, насколько я мало знаю об архитектуре. В той же сишечке, на которой писалась игра, есть возможности работы с файлами, но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?

Ответы: >>618834, >>618841

04 Янв, 23:40 #57 #618834

>>618807
> ассемблер не имеет инструкций для работы с данными на диске
Зато есть контроллер, который можно выебать в порты, чтобы он прочитал данные с диска. Но как и везде, есть стандартная библиотека, которая просит ОС, которая просит драйвера прочитать данные. Тут цепочка немного короче, но, в общем, то же самое.

1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
2) Во встроенной документации no$psx есть описание железа, его можно проглядеть для ознакомления.

Ответы: >>618908

04 Янв, 23:48 #58 #618841

>>618807
>но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?
Там наверно вызовы ОСа(или ее огрызга, хз что там у мыловарни), с возвратом дескриптора открытого файла и оперативкой уже заполненой им.

Ответы: >>618850

05 Янв, 00:05 #59 #618850

>>618841
Школьник, мыловарня - это не про обсуждаемую консоль.

05 Янв, 02:10 #60 #618908

>>618834
>1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
А что делать потом?

Мне хуёво, мне нужен напарник.

06 Янв, 23:39 #61 #620453

lhu $v0, 0xB8($s0)
nop
subu $v0, $s5
sh $v0, 0xB8($s0)
sll $v0, 16
bgtz $v0, Post_HP_Calc

Объясните мне тайный смысл.
Мы загрузили значение в регистр v0, вычли из него значение регистра s5, положила результат туда, откуда взяли.
Затем сделали шифт влево на 16 бит. Насколько я понял, таким образом мы патемся симулировать 16-битную переменную. Если шестнадцатый бит (знак) равен 1, то после шифта мы получим отрицательное значение, так что условие сработает.
Всё верно?

Ответы: >>620455

06 Янв, 23:40 #62 #620455

>>620453
>так что условие не сработает
Фикс. Бранч же >0.

3 Кб, 534x74

08 Янв, 20:30 #63 #621830

Это такое "оптмизированное умножение на 100"?

09 Янв, 20:56 #64 #622453

У меня лаба по ассемблеру.
Что это за пиздец? Как понять это говно?
Почему так всё непонятно? Какие байты, блять. Регистры нахуй.

Как сделать цикл while?

Ответы: >>622455

09 Янв, 20:59 #65 #622455

>>622453
Помню, в начале нулевых даже некоторые херки угорали по асму и успешно прогали на нем графоний, а сейчас погромистам асм уже не под силу лол.

Ответы: >>622459

09 Янв, 21:02 #66 #622459

>>622455
Серьезно, я не понимаю как эти байты могут содержать какую-то логику. Как понять это?

Ответы: >>622465

09 Янв, 21:06 #67 #622465

>>622459
Ты как цикл while сделать с помощью goto и if понимаешь?

yoba_begin:
if (yoba) goto yoba_end;
//do something
goto yoba_begin
yoba_end:

Далее, вместо goto у тебя jmp, вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка.

Ответы: >>622475

09 Янв, 21:10 #68 #622475

>>622465
> вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка
Почему это будет работать?
Я примерно представляю, что есть адреса, можно по ним прыгать и что-то писать. Но как тут логика реализуется? Какая-то магия
Лаба на масме, если что

Ответы: >>622477

09 Янв, 21:12 #69 #622477

>>622475
Команда cmp (compare) установит флаг в результате своей работы. Далее команда je (jump-if-equal) сделает goto в зависимости от установленного флага. Вот и все. Ты знаешь как сделать if, как сделать goto, вперед. точнее, нужно еще понять, как делать рекурсию с помощью call/ret и push ebp/mov ebp, esp, но для начала пойми это.

Ответы: >>622479

09 Янв, 21:12 #70 #622478

И да, ассемблер заменит имена этих меток на реальные адреса памяти. Так что язык ассемблера - это еще не совсем машинные коды, но близко.

09 Янв, 21:13 #71 #622479

>>622477
Как же сложно всё тут, пиздец
Спасибо за консультацию, сейчас попробую что-то сделать

Ответы: >>622667, >>622710

10 Янв, 02:34 #72 #622667

>>622479
Ты просто аутист.

Ответы: >>622668

10 Янв, 02:40 #73 #622668

>>622667
>Ты просто аутист
Что ты понимаешь под словом "аутист"? Дай определение этого термина.

10 Янв, 03:53 #74 #622710

>>622479
Если понять на самом деле сложно, поиграть в Human Resource Inc.

10 Янв, 05:03 #75 #622744

Зачем оптимизируюая компиляция в mips превращает умножение на 0.75 в умножение на 300 с последующим делением на 400 (через умножение на магическое число и битовый сдвиг)?

Это занимает кучу операций. 5 на само умножение на 300d, затем умножение на магическое число, затем вытягивание результата умножение из регистра hi, затем битовый сдвиг вправо на 7.
Это 8 операций.
Вместо этого можно было умножить число на 3 через (( x << 1 ) + x), а затем разделить на четыре через (x >> 2). Вышло бы три операции против 8, да ещё и без mult.

Ответы: >>622755, >>622930

10 Янв, 05:21 #76 #622755

>>622744
Потому что такой частный случай не завезли, очевидно же.

Ответы: >>622769

10 Янв, 06:01 #77 #622769

>>622755
Операция деления, представляемая как деление на 2^n - частный случай?

10 Янв, 14:37 #78 #622926

>>606286
Такс-такс-такс, кто-то узнал про Калашникова!

10 Янв, 14:57 #79 #622930

>>622744
Там могли быть две операции. Целочисленное умножение и деление. Оптимизатор соптимизировал как мог, объединить не осилил.

Ответы: >>623042

10 Янв, 18:25 #80 #623042

>>622930
Ну, целочисленное умножение само по себе заняло бы две операции (умножить и вытащить результат из hi/lo в нормальный регистр), с делением то же самое. Итого уже 4 операции, не учитывая медлительность самих mult и div.

Ответы: >>623169

10 Янв, 20:56 #81 #623169

>>623042
Даже на x86 компиляторы часто стараются избавиться от div (и иногда от mul). Мне кажется, там в исходнике так и было n × 300 ÷ 400.

12 Янв, 08:23 #82 #623848

Какой сишный код может сгенерировать подобную мипсовую инструкцию?
andi $v0, FFFF

В некоторых случаях and используется естесственным образом, например, когда нужно проверить принадлежность конкретного бита заданному числу. Но иногда эта инструкция просто завершает функцию или следует сразу после неё. При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.

Может, это что-то вроде этого?

int32 function(arguments)
{
int32 a;
a = 0;
return a;
}

main()
{
int16 b;
b = (int16)(function(arguments));
}

Ответы: >>623950, >>624171

12 Янв, 12:32 #83 #623950

>>623848
>При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.
Если $v0 это 32-битное, а функция возвращает short - плевать компилятор хотел на твои допущения

12 Янв, 12:57 #84 #623978

репост
Парни, выручайте, срочно.
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры строку символов на русском языке, подсчитать количество гласных букв во введенной строке и вывести соответствующую информацию на экран.
Может у кого-то похожая уже есть.
Заранее спасибо.

Ответы: >>624003

12 Янв, 13:18 #85 #624003

>>623978
Не благодари. http://pastebin.com/VDskkSHm

12 Янв, 16:26 #86 #624171

>>623848
Да, это именно каст к short. Во-первых компилятор тупой, а во-вторых, даже если он не тупой и мог бы понять, что function всегда возвращает <= 0xffff, на момент генерации кода main у него могло не быть никакой информации о function, кроме прототипа.

Тред утонул или удален.
Это копия, сохраненная 5 февраля 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion