1. Assembler / Говнокод #27884

    −8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    .MODEL small ;отводим под стек и под данные по 64Кб код занимает 1 сегмент, данные и стек обьеденены в одну группу
    .STACK 100h ;отмечаем начало сегмента стека
    .DATA ;отмечаем начало сегмента данных
     
    _STDOUT_ equ 1 ; из синтаксического описания видно, что с помощью equ идентификатору 
    ;можно ставить в соответствие как числовые выражения, так и текстовые строки, 
        ;а псевдооператор “=” может использоваться только с числовыми выражениями;
    vivod db 0Dh, 0Ah, '$' ; $-кон. стр.
     
    String db 82 dup(?); выделение памяти для строки 
    PosLen db 14 dup(?); выделение памяти для строки (числа)
    Pos dw ? ; память для первого числа
    Len dw ? ; для второго
     
    .CODE ;отмечаем начало сегмента кодов
    preob proc ; процедура преобразования из строки в число
    xor ax, ax
    mov bx, ax
    mov cx, 10 ; для реализации цикла
    _repeat:
    mov bl, [si] ; помещаем в bl символ строки
    inc si ; в si переходим к ячейке следующего символа
    sub bl, '0'; преобразуем ASCII код в число
    jb _break ; если SF = 1 то выходим из процедуры(указывает, что между числами стоит пробел, числовой код пробела меньше числового кода нуля)
    cmp bl, 9 ; сравниваем, если число больше 9 - то это символ - идём на выход
    ja _break
    mul cx
    add ax, bx ;прибавляет в регистр ax нужное число
    jmp _repeat
    _break:
    ret ; возврат в в главный код
    preob endp
     
    main PROC
    ;инициализация сегментного регистра ds адресом сегмента данных
    mov ax, @data
    mov ds, ax
     
    ;ввод строки
    mov [String], byte ptr 80
    mov ah, 0Ah
    lea dx, [String]
    int 21h
     
    ;ввод строки чисел
    mov al,10 ; перенос строки
    int 29h ; быстрый вывод символов на экр(экон байт)
    mov [PosLen], byte ptr 14
    mov ah, 0Ah
     
    lea dx, [PosLen]
    int 21h
     
    ;преобразование строки в первое число
    lea si, [PosLen+2]
    call preob
    mov [Pos], ax
    call preob
    mov [Len], ax
     
    mov al,10 ; перенос строки
    int 29h ; быстрый вывод символов на экр(экон байт)
    mov ah, 40h ;номер функции помещается в ah
    mov bx, _STDOUT_ ;в bx хранится дескриптор стандартного выходного потока
    mov cx, [Len] ; кол-во выводимых символов
    lea dx, [String+1] ; адрес буфера вывода
    add dx, [Pos] ; берем 1 сим. и добавляем число, чтобы перейти к нужному нам символу
    int 21h 
     
    ;завершение программы
    xor ax,ax
    int 16h
    mov ax,4c00h
    int 21h
    MAIN ENDP
    END MAIN

    Помогите разобраться в коде, понять логику
    Задание: Ввести с клавиатуры строку и строку из двух чисел. Первое число ука- зывает начало подстроки для ввода на экран, второе количество символов из пер- вой строки, которое необходимо вывести на экран.

    Запостил: tuple, 20 Декабря 2021

    Комментарии (200) RSS

    • напиши на С потом покажи принт дампа..
      Ответить
    • > Помогите понять логику

      Чтобы понять логику, рекомендую первый том Software Foundations.
      Ответить
      • не, в пизду, за один вечер я это не прочитаю
        Ответить
        • @JIoJIe4Ka, сможешь помочь студенту?
          Ответить
          • Это не студент, а наш препод по ASMу: Владимир Игнатьевич Бройлер.

            Видимо, хочет заготовить нашей группе страшную задачку на ASMе...
            Ответить
            • Он потерял второй листочек с описанием логики программы, и пытаеться его восстановить
              Ответить
              • Нет, он потерял исходный код на сишке. ТЕПЕРЬ он препод по ASMу, на лабе будем восстанавливать этот код, потому что там было что-то смешное, что он хотел запостить на говнокод.

                Типа...

                «if dic[i].in() { std::cout << dic[i].out }», что означает примерно следующее:

                «Если хуй внутри, скажи, чтоб вытащил»
                Ответить
    • Давай помогу
      Какая строчка вызывает у тебя затруднения?
      Ответить
      • как происходит преобразование строки в числа?
        Ответить
        • Для каждлого из символа в строке вычитается '0'.

          ASCII код ноля -- 48.
          Единицы -- 49.
          итд

          То есть чтобы превратить '8' в 8, надо из кода '8' (56) вычесть код '0' -- 48
          https://ru.wikipedia.org/wiki/ASCII
          Ответить
          • ага, понятно, спасибо
            правильно ли я понимаю, что в 28 строке мы в ax заносим это число?
            И для чего нам нужна 27 строчка кода?
            Ответить
            • 27 строчка нужна, если число многозначное. Нам же нужно набор цифр собрать в одно число, которое хранится не в десятичной системе, а в двоичной.
              Ответить
            • --> "mov cx, 10 ; для реализации цикла" т.е. переход на следующую цифру в числе
              ax = 5,
              ax * cx = 50
              ax + 3 = 53
              ax * cx = 530
              ax + 1 = 531
              Ответить
            • Умножает текущее число в ax (результат конверсии) на cx (в котором лежит 10)

              Пример: ввели 279; в ах сейчас лежит 27, в bx мы только что конвертировали '9' в 9.
              mul cx ; ax - 27 → 270
              add ax, bx ; ах 270 → 279

              Говнокод образовательный, блин.
              Ответить
              • Добавлю: нужно изучить схему Горнера для вычисления значения многочлена, чтобы совсем стало понятно.
                Ответить
                • Ты что, ма-те-ма-тик?
                  Ответить
                  • Дяденька, я ненастоящий программист. А книжку по ассемблеру я на помойке нашёл.
                    Ответить
                • > схему Горнера
                  > чтобы совсем стало понятно
                  Не факт, что это добавит понимания.
                  Я кучу раз делал парсинг/стрингификацию чисел, но от схемы Горнера знал только название. Может, разок слышал во вводной лекции по матану про оптимизацию для квадратного уравнения, где x выносили из первых двух членов.
                  Сейчас прочитал в первый раз жизни про схему Горнера, осознал, что число - это частный случай полинома с x=10.
                  Но это делает вещи понятнее только для математика. Как в том анекдоте, "чтобы представить 4-мерный куб, просто представь N-мерный, а затем прими N=4".
                  Ответить
            • нам недостаточно просто складывать числа, нам нужно двигаться на разряд

              52 это не 5 +2, это 5 умножить на 10 плюс два, верно?

              cx у нас это 10 (см 19 строку)

              mul cx умножает cx значение в регистре ax, результат помещается обратно в ax

              иными словами, это умножение на десять, такой вот десятичный "сдвиг"
              Ответить
              • спасибо
                почему в 10 строке для строчки мы выделяем 82 памяти, а потом когда происходит ввод строки в 40 строчке кода, там 80?
                Ответить
                • В строчках 40 и 48 написана какая-то глупость. По идее там должен быть просто ноль, чтобы почистить буфер.

                  Всё правильно написано, буфер в формате паскалевской строки. Только обычно «byte ptr» пишут перед квадратной скобкой.
                  Ответить
                  • так почему там 80, а не 82?
                    Ответить
                    • По невнимательности.
                      Ответить
                    • В строчках 40-48 в первый байт каждого буфера помещается максимальная длина строки, нужная для функции 0ah, следующий байт после вызова функции будет содержать длину введённой строки (-1 байт от размера буфера).

                      Т.е. там должно быть не 80, а 81
                      Ответить
                  • > обычно «byte ptr» пишут перед квадратной скобкой.
                    Приведение типов сработало
                    Ответить
                    • Поскольку у mov типы обоих аргументов одинаковые, ассемблер сам выберет правильную перегрузку вне завимости от того, слева или справа указан модификатор ptr.
                      Ответить
                    • > byte ptr

                      Именно поэтому я за movb
                      Ответить
                      • эйтиэндтишный юниксоижный питушок забрел на винтеловскую поляну


                        в школе твой синтаксис не учат
                        Ответить
                        • Ну ок, тогда как в nasm'е тупо byte без ptr.
                          Ответить
                          • Наверное можно вообще без byte ptr, стринги через db же объявлены
                            Ответить
                • В 40-й строчке должно быть число, которое не больше размера буфера. Меньше можно, тогда просто последние байты буфера останутся незадействованными («хвостик»).
                  Ответить
                  • окей, понятно, спасибо
                    можете объяснить что происходит с 61 по 68 строку, пожалуйста?
                    Ответить
                    • ты знаешь что такое софтварное прерывание?

                      Это такой способ вызвать функцию. А аргументы ей обычно передают через регистры.

                      например кладем в al 10, а потом вызываем
                      http://biosprog.narod.ru/real/dos/int29.htm

                      а чтобы узнать, что такое 10, мы заглянем в таблицу ASCII
                      Ответить
                      • хорошо, это 61 строка, а потом что происходит?
                        Ответить
                        • потом мы дергаем прерывание

                          потом готовимся к вызову прервания 21h, которое в ah принимает номер фуркции

                          Дальше тебе нужно почитать что это за функция такая -- 40h
                          http://www.codenet.ru/progr/dos/dos_0067.php

                          А если ты не знаешь что такое STDOUT, то там питух ниже пояснил
                          Ответить
                          • вы лучшие, спасибо
                            Ответить
                            • Не за что.

                              Если захочешь копнуть глубже, то ASM в лёгкой и увлекательной форме описан у Ирвина
                              https://vk.com/wall-51126445_18046
                              Ответить
                      • Возможно, ещё нужно рассказать о дескрипторах файлов DOS.

                        Дескриптор — это номер открытого файла во внутренней таблице открытых файлов. Некоторые потоки ввода-вывода имеют фиксированные номера на момент старта программы (их предварительно открывает сам ДОС без нашей просьбы). Это дескриптор номер 0 — стандартный ввод, номер 1 — стандартный вывод, номер 2 — стандартный вывод служебных сообщений (он не перенаправляется знаком «больше» в командной строке, в отличие от дескриптора 1). Здесь мы выводим в _STDOUT_, который равен 1.
                        Ответить
                        • Ну теперь ты еще должен рассказать, зачем это сделано.
                          Про пайпы давай. Про редиректы.
                          Ответить
                        • Про хэндлы наверное все и так знают...
                          Ответить
    • call proeb
      Ответить
    • > быстрый вывод символов на экр(экон байт)
      Они экономят байт. Байт, сука, они экономят. Ёбаный байт. Экономят. В 2021.
      Ответить
      • Это же реальный режим, там еще 20й век
        Ответить
      • > на экр(экон байт)
        Они даже в комментариях экономят байты!
        Ответить
        • На самом деле хуй-ня какая-то, экон байт, но при этом model small вмест tiny
          Ответить
      • > байт

        Да ладно, я вот из логов на днях выкидывала буковки, чтобы бинарь на 16 байт ужать...
        Ответить
        • brmnd т прнсл?
          Ответить
        • а я на днях использовал бинарь на Го на 80 мегабайт. Такой же скрипт на питоне весил бы сотню кило. Но правда без рантайма
          Ответить
          • В нестрипнутом виде он поди гигабайт?
            Ответить
          • В Go разве нельзя делать бинарь без рантайма (чтобы этот рантайм подхватывался из системы)?
            Ответить
            • Это сложно и надо думать о совместимости и версиях... А го не об этом.

              Так что я думаю нет.
              Ответить
              • случайно ёбнул минус вместо жирного свиного плюса (((
                Ответить
                • Похуй. Хотя мне на мгновение показалось, что у нас тут завелись гоферы...
                  Ответить
                  • > надо думать о совместимости и версиях... А го не об этом

                    А вот вступлюсь за гоферов.
                    Портабельные бинари это кстати не так и плохо. Даже не знаю что хуже.

                    В Йаже/С№ вон линковки нет. Просто скидывают оттраслированные .class в zip jar.

                    Правда если нельзя сделать shared executable тоже gовно.

                    Зато хорошо показывает оверинжинирные дутые рантаймы у современных средств разработки.
                    Ответить
                    • Интересно вот сколько эта херь линкуется...
                      Ответить
                    • В C# GAC например есть. Не то что бы я хорошо понимал вообще в линкерах и нормальных языках, но подозреваю что у шарпов есть практически все, просто иногда это не очень хорошо стыкуется с выбранной парадигмой языка.
                      Ответить
                      • GAC это просто глобальное хранилище сборок, как /lib в прыще или system32 в винде

                        туда тоже надо покласть свою dllку, но только неподписанные (не стронг) туда вроде не кладутся
                        Ответить
                      • Просто вот недавний пример с йажей. Нашли уязвимость в log4j, выпустили патч (это все знают).

                        Люди подымают версию log4j. Код компилируется, всё нормально как и со старой версией.

                        А вот при запуске лезут ошибки в рантайме.

                        И такое периодически бывает, т.к. нет стадии линковки.

                        Это общая проблема. Я уже писал раньше

                        https://govnokod.ru/26961#comment576303

                        > Вместо линкера в мире лалок принято ебошить: http://c.d.n/pitux.latest.js. А потом эпично ломаться, когда latest меняет api.
                        Ответить
                        • Кстати, а в log4net эту дыру не портанули?
                          Ответить
                          • не знаю, у ms миллион лет свой API длялогинга, log4net не нужен

                            у жавы тоже есть JULI, но уже успели насрать slf4j и log4j
                            Ответить
                            • > у жавы тоже есть JULI, но уже успели насрать slf4j и log4j

                              Меня всегда это удивляло обилие этой питушни. slf4j это вроде обёртка или декоратор.

                              Зачем? Зачем?
                              Ответить
                              • Потому что уже успели насрать log4j прежде, чем завезли джули

                                Потому что есть такое правило:

                                Если в стандартной библиотеке языка нету какого-то готового решения, то через три года использования у тебя будет сорок четыре не совместимых с друг другом решения, и это уже навсегда
                                Ответить
                    • У меня девопс знакомый на Го перешел с питона, чтобы его какие-то тулы запускались на голых VPSках где вообще ничего нет, и не ебаться там с версией питона, библиотек, установкой их, итд.

                      А что бинарь весит 80 мегабайт и не шарит страницы кода в памяти (он же не шарит?) так это похуй в 2021-м году, когда у тебя двадцать VPSок по 100 баксов каждая
                      Ответить
                      • > знакомый на Го перешел с питона, чтобы его какие-то тулы запускались на голых VPSках где вообще ничего нет
                        > не ебаться там с версией питона, библиотек, установкой их, итд.

                        Какой docker )))
                        Ответить
                        • Докер собирать все таки дольше.

                          ну вот тебе нужна тула чтобы собрать какую-то инфу с VPSки, и послать ее на нужный сервер. Докеровский имадж с питоном это оверголова малость

                          Ах да, го вроде еще кроссплатформенное

                          то есть он и на рабочей машине запускает ее, и на сервере
                          Ответить
                          • Даже и не спорю.

                            > Докеровский имадж с питоном это оверголова малость

                            Согласен. Выше написал что портабельные бинари это не так плохо.

                            Сам попадал в ситуацию когда нужно сначала apt/dnf install <тут дохуя>

                            Потом pip3 install. Потом оказывается что коду нужен новый meson (блять!).

                            А питон 3.6 из репы уже не поддерживается уже новым meson (гандоны ебаные!). Ставишь новый питон. Окей, поставил.

                            Потом ещё нужно какой-то pytorch, а ему нужна conda (БЛЯТЬ НАХУЯ ВЫ НАПЛОДИЛИ НЕСКОЛЬКО ПАКЕТНЫХ МИНЕТЖЕРОВ), итд.

                            Мудаки и говно. Говно и мудаки. Мудаки в говне. Говно на мудаках. Py-здец.
                            Ответить
                            • >(БЛЯТЬ НАХУЯ ВЫ НАПЛОДИЛИ
                              https://ahmed-nafies.medium.com/pip-pipenv-poetry-or-conda-7d2398adbac9
                              Ответить
                              • А потом это всё говно собирают в кучу и заворачивают в докер, чтобы не смердело так люто.

                                Уровни абасракции ростут как грибы.
                                Ответить
                                • и потом у тебя сайтик на джанго ставится 10 минут и занимает кучу места, потому что его докерфайл занаследован от убунты какой-нить
                                  Ответить
                                  • > потому что его докерфайл занаследован от убунты какой-нить

                                    Вот-вот. А goвнюк со своими 150 мегабайтами натива ещё посмеётся над питухами.

                                    Мало того что нужно ставить 50 метровый докер. Так ещё и гиговый образ с ненужной убунтой.
                                    Ответить
                • Кстати вот интересно, а libc для сисколлов они из системы берут? Или всё вшито?
                  Ответить
                  • https://stackoverflow.com/questions/41720090/

                    However, on some platforms under certain circumstances the C runtime library gets dynamically linked in. In particular, this was the case with Go versions < 1.5 on Linux when DNS resolution was used: the runtime depended on the platform's libc implementation to handle such resolution. In 1.5 this has been reworked.

                    Another possible case is (IIRC) Solaris which provides no stable way to access the kernel's syscalls directly and requires routing these calls through the platform's libc.
                    Ответить
                    • Я эту каккшку уже кушал. Мне пришлось мюслю брать, чтобы с глибсёй не линковаться статически

                      Кстати, у тебя ведь тоже мюсля, если ты ембедщик?
                      Ответить
                      • Вангую, что у него в контроллерах нет никакой стандартной либы.

                        Что там от неё останется то? memset да memcpy? Ну ладно, printf.
                        Ответить
                        • тоись он даже не под Занятую Коробочку программирует а еще ниже?
                          фу
                          Ответить
                          • Бизибокс -- это уже для навороченных армов с DRAM и кешами...

                            А в контроллерах их, как правило, нет. Хотя какой-то небольшой его обрезок можно засунуть, если делать нечего...
                            Ответить
                          • Вот представь себе, у тебя есть хуевина с сенсорным говноэкранчиком, на котором кнопочки для регулировки какого-то говна (температуры или скорости вращения какой-то хрени, или еще чего-то подобного) и экранчик еще выводит какую-то там инфу, типа какая там сейчас температура в такой-то хрени, сколько времени какая-то там микроволновка еще будет тебе готовить такую-то срань, или например какой у тебя пульс, если это какой-то фитнес-трекер, или еще некую срань выводит. Нахуя там какой-то "бизибокс"?
                            Ответить
                            • Чтобы запустить в нём программу на го и течь. Или вообще электрон, раз дисплей сенсорный.
                              Ответить
                            • ну а нахуя люди софтварные роутеры на убунте делают, например?

                              чтобы универсально и абстрактно всё
                              Ответить
                              • Ну ты сравнил роутер и контроллер...
                                Ответить
                                • ну это пример ненужной хуйни.

                                  Вот например софтварный роутер микрота занимает 128 мегабайт на HDD, а сколько займет сервер убунту?

                                  тем не менее, ставят
                                  Ответить
                                  • Твоя убунта на контроллерных задачах сольётся. Впрочем, как и любые прыщи.
                                    Ответить
                      • > Кстати, у тебя ведь тоже мюсля, если ты ембедщик?

                        musl завязан на ядро Linux, а у меня в контроллерах нет никакого Linux. Я https://www.sourceware.org/newlib/ как-то использовал
                        Ответить
                        • бионик еще есть..
                          Ответить
                          • Bionic тоже на ядро Linux завязан, а у меня ядра Linux нет в контроллерах. Не, оттуда конечно можно выковырять реалиацию memcpy, memset, sprintf и еще некоторого говна, и как-то это адаптировать, но нахуя? Есть специальные готовые библиотеки языка Си для работы без ОС (или для работы с ОС уровня FreeRTOS)
                            Ответить
                    • Какое goвно )))

                      > Using cgo which is a layer to interface Go code with foreign C code. Using cgo makes your Go program depend on the C runtime

                      > The cgo documentation says that cgo is enabled by default for native builds. So, it looks like one has to set CGO_ENABLED=0 to make sure that there is no a dependency on C runtime

                      Очередная «йаже-как-сишка» едет на всём ворованном.

                      Сделали стометровый бинарь, вроде без зависимостей.

                      Со всем что было заявлено обосрались. Говорили без зависимостей, а ему надо libc.

                      Опять собрали худшее из всех миров: бинарник циклопичный, зато зависимости есть.
                      Ответить
                      • ну блядь glibc такое говно, что с ним нельзя без боли в жопе статически слинковаться

                        В винде правда тоже нельзя вот прямо со всем, но с CRT можно
                        Все равно останутся всякие user32 и gdi32 (виртуальные, бо сейчас minwin) но они на любой винде есть (кроме WinPE вроде, джае на Core) а вот libc на alpine может и не быть
                        Ответить
                        • В WinPE всё есть. Это же просто готовая Винда, только в режиме инсталлятора.
                          Ответить
                          • там другая подсистема же? или я путаю? ли я могу PE с импортом advapi, user32, kernel32 и gdi запустить?
                            Ответить
                            • WinPE — это pre-install environment или есть омоним?

                              Если первое, то да, можешь запустить. Единственное, может не хватить каких-то служб или какой-то хрени в реестре.
                              Ответить
                            • PE это обычный win32, на zw была только рекавери консоль, которая относительно недолго просуществовала
                              Ответить
                            • Я, кстати, пользовался Windows XPE (это пародия на WinPE на базе XP, но только с explorer.exe, а не с cmd.exe в качестве оболочки) как рабочей системой, скопировав её с компакт-диска на жёсткий.

                              http://www.oszone.net/3201/
                              Ответить
                      • > на всём ворованном

                        А что делать, если официальное апи у ядра идёт только с кучей нинужной хуйни от сишки в нагрузку?

                        Сишники всё в кучу смешали, а остальным теперь страдать.
                        Ответить
                        • Да, было бы классно чтобы API называлось
                          "linux.h" и было бы описано в терминах c89 и вызовов сисколов
                          Ответить
                          • > linux.h

                            Ну вот ты опять сишку тащишь...

                            В виде xml'ки с сисколлами, версиями в которых они появились и регистрами. Кому надо хедер -- сгенерит по этому описанию. Под любой язык.
                            Ответить
                            • типа как в DOSе было?:)

                              ну ок, да, так было бы лучше.
                              Ответить
                            • Кстати если бы виндовые сисколы так описывались (А не в терминах хедеров сишки в SDK) то возможно Дельфи бы не умер, и стертор бы не стал педофилом
                              Ответить
                              • Ну вот мне в вулкане понравилось -- есть соглашение о вызове, есть xml'ка.

                                А дальше генери себе хоть сишку хоть кресты хоть паскаль хоть джаву.

                                И не надо парсить сраные хедера.
                                Ответить
                                • Вообще идея не нова: были дефинишены COM (IDL), корбы, WSDL..

                                  WinMD еще есть
                                  Ответить
                                  • Они слишком абстрактные и тяжелые ;(
                                    Ответить
                                    • ну кросс-платформенные зато..

                                      сишный API зато не зависит от архитектуры. На MIPS и на x86 же могут быть РАЗНЫЕ сисколы на прыщах, не?
                                      Ответить
                                      • Могут. Они даже на х86 и х64 разные.

                                        На сишке просто костыли воткнуты для эмуляции недостающих.
                                        Ответить
                                        • ну вообще это можно было бы указать в описании сискола

                                          было бы грубо говоря
                                          generate_delphi_api --source=linux_x64.syscalls.txt > linux.pas
                                          Ответить
                                      • З.Ы. Из-за этой разницы между нумерацией сисколлов на х86 и х64 какая-то песочница, емнип, криво настраивала seccomp и обсиралась.
                                        Ответить
                                        • ну тоесть она считала что тебе нельзя систкол 44 а на самом деле он был 38?

                                          Вообще классический юникс апи (а прыщи все таки наследуют юникс) это сишка. Так что всё равно получилось бы как с Win32: формально было бы можно сделать много разных API, а по сути всем было бы похуй на всё, кроме сишного.
                                          Ответить
                                • а я скомпилил себе WebGPU и мне теперь нахуй не нада ваша XML
                                  Ответить
                  • собери да позырь список импортов
                    Ответить
            • вы перепутали с CLR (((
              Ответить
              • С CLR тоже не все гладко

                Если хочу поддерживать Win 8.1, то мне надо ставить свежий .NET небось?
                Ну как с CRT
                Ответить
                • Вот что такое CLR/.NET

                  This calls for a story. At the Fog Creek New Year’s Eve party, we wanted a bunch of computer screens in the main room to display a countdown until midnight. Michael wrote an application to do this in C# with WinForms in about 60 seconds. It’s a great development environment.

                  My job was getting countdown.exe to run on three computers. Sounds easy.

                  Nope. Double click the EXE, and I got a ridiculously user-hostile error message about mscoree.dll or something, followed by a gratuitous dump of my path. No mention of the fact that the problem was simply that the .NET runtime was not installed. Luckily I’m a programmer and I figured that must be the problem.

                  How do you install the runtime? The “easiest” way is through Windows Update. But Windows Update really wanted me to get all the critical updates first before I installed the runtime. That’s reasonable, right? Two of the “critical” updates were a Windows service pack and a new version of Internet Explorer, both of which required a reboot.

                  All told, for each computer I needed to run this little .NET application on, I had to download something like 70 or 80 MB (good thing we have a fast net connection) and reboot three or four times. And this is at a software company! I know how long it took, because the first time it started downloading, I put Office Space on the big screen TV, and by the time the movie was over, the installation process was almost finished. Every ten minutes during the movie I had to jump up, go to each computer, and hit OK to some stupid dialog box.
                  Ответить
                  • Вроде уже CLR умеет собираться статически под винду, и зависеть только от WinAPI
                    Файк показывал

                    МС услышал комплейны своего бывшего сотрудника Спольски
                    Ответить
                    • Покажите и мне. Ибо я видел только неофициальную third-party путишню.
                      Ответить
                      • Publishing your app as self-contained produces a platform-specific executable. The output publishing folder contains all components of the app, including the .NET libraries and target runtime. The app is isolated from other .NET apps and doesn't use a locally installed shared runtime. The user of your app isn't required to download and install .NET.


                        вроде вот про это шла речь
                        https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-self-contained

                        ну ок, может не один экхзешник, а еще парочка .dll, но они идут в пакете
                        не надо их ставить врунчую через windows update
                        Ответить
                        • Disadvantages

                          Requires pre-installing the runtime
                          Your app can run only if the version of .NET your app targets is already installed on the host system. You can configure roll-forward behavior for the app to either require a specific version of .NET or allow a newer version of .NET. For more information, see framework-dependent apps roll forward.

                          .NET may change
                          It's possible for the .NET runtime and libraries to be updated on the machine where the app is run. In rare cases, this may change the behavior of your app if you use the .NET libraries, which most apps do. You can configure how your app uses newer versions of .NET.


                          Серьёзно? Да все проблемы либцов и го просто меркнут на фоне такого позорища.

                          >собираться статически под винду, и зависеть только от WinAPI
                          > require a specific version of .NET
                          Ответить
                          • ты читаешь Publish framework-dependent


                            а ты почитай Publish self-contained
                            Ответить
                            • Пардон, не туда глянул.

                              >The executable binary is produced for the specified target platform.
                              > Publishing for Linux or macOS, a word_reader file is created.

                              На словах звучит годно. Если есть кроссбилды даже на другие ОСи.
                              Но как мы знаем по Йаже: write once, debug everywhere.
                              Ответить
                              • ну про кроссплатформенность это особая тема

                                если ты веб сайт написал то наверное он кросс-платформенный, а если командлайн тулу то уже сложнее, а если там P/INvoke или ComInterop, то всё

                                в целом же по идее получается один большой бинарь как в го, но ты можешь выбирать: например самому обновлять версии .net и перевыпускать приложение, или переложить это на сисадмина
                                Ответить
                                • Забавно как людиобезьяны с нуля переизобретают линковку, которой лет 60 уже.

                                  Но самое смешное что похоже они паковали весь .NET, а потом поняли что ненужные куски можно выкидывать.

                                  > Tip: IL trimming can further reduce the size of your deployment.
                                  > https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/trim-self-contained
                                  > Depending on the complexity of the application, only a subset of the framework assemblies are referenced
                                  > and a subset of the code within each assembly is required to run the application.
                                  > The unused parts of the libraries are unnecessary and can be trimmed from the packaged application.

                                  Какой strip )))

                                  Not invented here во все поля.
                                  Ответить
                                  • ну это как джсеры изобрели три шейкер, который примерно 2% возможностей линкера сишного имеет, только памяти требует в цпу в 200 раз больше


                                    а вот питонисты еще до этого не дошли, я вроде бы не могу отказаться от богатой стандартной либы
                                    Ответить
                                    • > ну это как джсеры изобрели три шейкер, который примерно 2% возможностей линкера сишного имеет

                                      Ух ты, да неужели. А можно пужулуста ссылку?

                                      Я думал они до идеи линкера лет эдак через 5 дойдут.

                                      Вообще мне нравится как лалки переизобретают технологии 50-60 летней давности.

                                      Джавашки вон в 2021 «изобрели» struct, который был ещё в Алголе-68! Назвали правда record (привет Паскаль!).

                                      https://govnokod.ru/27041
                                      > Java Records Sep 11, 2021
                                      > A Record is a special form of class in Java. It was released in Java 16, after being introduced as a preview feature in Java 14.

                                      Может лет через 10 додумаются стырыть disjoint union, который появился в том же Алголе. И pattern matching из MLов.
                                      Ответить
                                      • https://github.com/FortAwesome/Font-Awesome/issues/13233
                                        Ответить
                                      • > Джавашки вон в 2021 «изобрели» struct, который был ещё в Алголе-68! Назвали правда record (привет Паскаль!).

                                        Это даже все еще не struct, лол, просто упакованный геттер-бойлеплейт с генерацией внятных хэшкодов
                                        Ответить
                                        • да нет, это реально говно с валью семантикой вроде, иначе чем это лучше ломбоковских поделок?
                                          Ответить
                                        • > Это даже все еще не struct, лол, просто упакованный геттер-бойлеплейт с генерацией внятных хэшкодов

                                          Не это именно что struct. Там же всю объектный оверхед выпилили.
                                          Например нет возможности написать synchronized на value типе, как это делалось на объекте.

                                          Гость правильно говорит: оно будет на стеке передаваться как value-type.
                                          Ответить
                                          • да нет же

                                            https://stackoverflow.com/a/63365195
                                            https://godbolt.org/z/YebesEeax

                                            вы переоцениваете джаву

                                            > Гость правильно говорит: оно будет на стеке передаваться как value-type.

                                            по тем же правилам, что и обычные классы
                                            Ответить
                                    • > джсеры изобрели три шейкер, который примерно 2% возможностей линкера сишного имеет

                                      Оу, ши. Я только сейчас узнал что в Йажу года 4 назад тоже подвезли линкер.

                                      https://openjdk.java.net/jeps/282

                                      Updated 2017/05/19 02:01

                                      Create a tool that can assemble and optimize a set of modules and their dependencies into a custom run-time image as defined in JEP 220.


                                      JEP 261 defines link time as an optional phase between the phases of compile time (the javac command) and run-time (the java run-time launcher). Link time requires a linking tool that will assemble and optimize a set of modules and their transitive dependencies to create a run-time image or executable.

                                      Link time is an opportunity to do whole-world optimizations that are otherwise difficult at compile time or costly at run-time. An example would be to optimize a computation when all its inputs become constant (i.e., not unknown). A follow-up optimization would be to remove code that is no longer reachable.

                                      Description

                                      A basic invocation of the linker tool, jlink, is:

                                      $ jlink --module-path <modulepath> --add-modules <modules> --limit-modules <modules> --output <path>
                                      Ответить
                                      • это не линкер, это что-то уровня баш-скрипта, который копирует директорию jdk, попутно фильтруя классы модулей

                                        на выходе вы реально получите даже не зип-архив, в просто копию jdk с вырезанными модулями и вставленным пользовательским кодом
                                        Ответить
                                  • как ты поймешь какой код выкинуть если ты юзаешь рефлексию?
                                    Ответить
                          • Некрософт это херомантийный случай too big to fail, поэтому на поддерживаемых виндах будет работает, а на неподдерживаемых - только Deer Hunter 3.
                            Ответить
                        • > ну ок, может не один экхзешник, а еще парочка .dll, но они идут в пакете

                          с PublishSingleFile или как-то так - вполне один
                          там есть проблема с тем, что какие-то вещи он в этом случае может распаковывать в /tmp (вместо того, чтобы читать прямо из файла), но вроде над этим активно работали
                          Ответить
              • Файк, собери пожалоуйста self-contained или как ты там делал .net приложение с вбандленным .net?

                покажем Пи депенденси вокером или dumpbinом что оно ни от чего не завиист кроме винды
                Ответить
            • В том и смысл что НЕ нужно его делать


              ты качаеш один файл и течечешь
              Ответить
              • Это и в сишке можно, если статически всю хуйню слинковать. Но конечно есть отличная от 0 вероятность, что кто-то запустит твою статически слинкованную с каким-то там glibc хуйню на ядре, с которым эта статически слинкованая glibc несовместима. https://unix.stackexchange.com/a/430462

                Намертво вкомпиленый в программу на Go рантайм кстати тоже может быть несовместим с каким-то там ядром.
                Ответить
                • Хуй ты глибцы статически влинкуешь. Недавно гест6 кидал статью о проблемах с этим.
                  Ответить
                  • $ cat hello.c 
                    #include <stdio.h>
                    
                    int main()
                    {
                      printf("Hello World\n");
                      return 0;
                    }
                    $ gcc hello.c -o hello
                    $ ldd hello
                    	linux-vdso.so.1 (0x00007fff2b5f9000)
                    	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa0ecccf000)
                    	/lib64/ld-linux-x86-64.so.2 (0x00007fa0ecee9000)
                    $ gcc -static hello.c -o hello_st
                    $ ldd hello_st 
                    	not a dynamic executable
                    $ ./hello_st 
                    Hello World

                    С хелловордом проблем нет
                    Ответить
                    • 1. собери .soшку со своим кодом и слинкуй ее статически с glibc
                      2. https://stackoverflow.com/questions/2725255/create-statically-linked-binary-that-uses-getaddrinfo
                      Ответить
                      • Он сейчас скажет, что у него в хеллоуворде контроллерах никаких getaddrinfo нет.
                        Ответить
                        • ну а нахуя тогда libc? чтобы memcpy?
                          так он его сам напишет, и сделает свою либсю
                          может даже с printf
                          Ответить
                          • > сам напишет

                            Самое сложное тут -- уломать конпелятор, чтобы он не выражал твой memcpy через твой memcpy.
                            Ответить
                • да, можно саснуть, и с DNSом тоже.
                  Алсо, нельзя вроде по GPL это делать

                  Именно потому статически линковаться лучше с мюслей
                  Ответить
    • полный дебилизм при наличии C учить ASM
      Ответить
      • полный дебилизм учить программистов и не рассказать им про асм
        Ответить
        • полный дебилизм учить ASM и не рассказать им про байт коды.... и редактировании exe в текстовом редакторе
          Ответить
          • асм и есть мнемоники для байткодов плюс немного макросахара
            Ответить
            • C это и есть мнемоники для асм плюс немного макросахара
              Ответить
              • >C это и есть мнемоники для асм
                нет

                Опкоды легко транслируются в асм
                а си -- нет

                потому что си это компиляция, а не трансляция
                Ответить
                • > потому что си это компиляция, а не трансляция
                  Компиляция это и есть частный случай трансляции.

                  Просто асм почти один в один отображается в опкоды, а Си —– нет.
                  Ответить
                • > а си -- нет

                  А что там сложного? Сложно сделать оптимизацию не поломав семантику. А дословную сишку легко запилить и она будет очень близка к асму.
                  Ответить
                  • Близка не != один-в-один же
                    Ответить
                    • Да считай один в один мапается. Как у макроассемблеров с поддержкой функций и структур.
                      Ответить
                      • как это может быть, когда ты напрмиер конвенции вызовов не знаешь, или размеров int
                        Ответить
                        • Для конкретной платформы я знаю и соглашение и размеры.

                          И если нет оптимизатора, то каждая сишная конструкция раскрывается в очень простой набор опкодов и не цепляется за остальные.

                          Именно поэтому няшная и считается "кроссплатформенным асмом".
                          Ответить
                          • Для конкретной платформы и версии JVM я тоже в теории знаю во что JIT раскроет мой AbstractFactoryProviderBuilder.

                            Но я согласен с тем, что сишка оперирует максимально близкими к реальной аппаратуре понятиями: структуры из заранее известного количества байт и массивы этих структур (с поправкой на выравнивание)
                            Ответить
      • Зависит от специальности. Если в будущем придётся писать прошивки для микроконтроллеров или создавать свои компиляторы в нативный код, то знание ассемблера не помешает.
        Ответить
        • нахуй не нада... я пишу не зная асма от слова совсем.. точнее последний асм который я помню это i486
          Ответить
          • > пишу не зная асма

            Причём пишешь конпелятор )))
            Ответить
            • Он читер, использует ллвм
              Ответить
              • все люди читеры - используют Windows 11 :) или Ubuntu или FreeBSD
                Ответить
                • Не понимаю, зачем они нужны. На них даже Blood не роботает
                  Ответить
          • Легко говорить, что знание асма не нужно, когда уже какой-то асм знаешь.
            Ответить
            • Чёрт, какой-то замкнутый круг.
              То есть ассемблер помогает программисту незаметно как руткит, который завладел сознанием?
              Или легко говорить, когда знаешь и нелегко говорить, когда не знаешь, ведь только тот, кто знает ассемблер, может ответственно заявлять, что он нафиг не нужен?

              P.S. Хотел возразить, что я не знаю ассемблер, и он нафиг не нужен, но вспомнил, что в вузе для какого-то микро-ко-ко-контроллера что-то на нём писал, да и какую-то свою питушню с исполнением кодов вроде эмулятора процессора, осуществляющего вычисления со стеком, писал. И теперь мне легко говорить, что знание асма не нужно.
              Ответить
      • Хотя про реальный режим DOS сейчас рассказывать уже не так интересно. Можно было бы рассказать, как получать бинарники для Linux и Windows.
        Ответить
        • >> как получать бинарники для Linux и Windows.
          это что за высшие недоступные знания инопланетных цивилизаций?
          Ответить
          • Всё кажется высшим знанием инопланетных цивилизаций, когда делаешь в первый раз.

            Первоклашки делить числа не умеют, например.
            Ответить
            • А я вообще только до трёх считать умею
              Ответить
              • многовато

                настоящие программисты умеют сичтать до двух
                впрочем, некоторые и до 16-ти
                Ответить
                • я до 7и умею.. а также знаю что такое кольца в математике :)
                  Ответить
          • Смотря что стоит за словом "получать". Если речь о запуске компилятора - одно. Если речь о напидоривании байтов в файл - совсем другое. Второе на практике не нужно, из-за чего можно быть полезным опытным программистом и не знать, какие туда байтики пишутся.
            Ответить
        • Деда, деда, а чому адресация в параграфах?
          Ответить
      • Полный дебилизм учить TASM при наличии fasm
        Ответить
    • Замечание по поводу строк 71-72. Я рекомендую вместо функции 0 прерывания 16h использовать функцию 10h. Функция 0 не реагирует на клавиши, которые отсутствуют на 88-клавишной клавиатуре, например, на F11, F12, клавиши цифрового блока и т. д.
      Ответить
      • На заметку обладателям клавиатур последних моделей?
        Ответить
        • Прикинь, в 1985-м году появились ультрасовременные клавиатуры, на которых после F10 ещё есть клавиши. Они ещё правый Ctrl и правый Alt отличают от левого. И стрелочки отдельные есть, не в цифровом блоке.
          Ответить
          • До чего техника шагнула...
            Ответить
          • А потом пришли ноуты и всё пропало.
            Ответить
            • Ничего не пропало. У них совместимая клавиатура. Разве что бывают нестандартные дополнительные клавиши, да клавиша Fn, которая скан-кодов не генерирует, а аппаратно переключает назначение совместно с ней нажатой клавиши.

              Ну и часть клавишей на ноутбуках может отсутствовать. На некоторых могут отсутствовать Pause, Print Screen, Scroll Lock, правые клавиши-модификаторы.
              Ответить
              • > Ну и часть клавишей на ноутбуках может отсутствовать.

                REISUB хуй сделаешь -_-
                Ответить
            • что пропало? 8042 пропало?

              оно было еще до самой HID, и там еще эмулилось
              Ответить
      • А если нажать стрелку, то это будет как одно нажатие или как два?
        Ответить
        • Сама клавиатура при нажатии стрелки в цифровом блоке высирает один скан-код, при нажатии отдельной стрелки высирает два скан-кода: e0h и код стрелки. Аппаратно это два нажатия.

          BIOS считает это одним нажатием. Код стрелки будет в AH, а в AL будет ноль для цифрового блока и 0Eh для отдельной стрелки (в случае функции 10h).

          Функция 0h сделает вид, что не заметила отдельную стрелку.
          Ответить
          • У меня в USB HID нет никаких E0.
            Ответить
            • BIOS или CSM бывают с мумуляцией PC-клавиатуры.

              Ну и NTVDM и DOSBOX её мумулируют.
              Ответить
              • У меня в контроллерах нет никакого BIOS или CSM, поэтому я за контроллеры
                Ответить
    • у меня есть тамагочи
      я его покормил, он сейчас спит
      Ответить
    • > Len dw ? ; для второго

      Лень ему блять ты посмотри на него
      Ответить
    • Никто тебе не поможет понять, только САМ гоняй по отладчику )))
      Ответить
    • Не проще ли воспользоваться Hex Rays или Ghidra и лупиться уже в нормальный псевдокот?
      Ответить

    Добавить комментарий