Сборный / Говнокод #27884 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 tuple, (Updated )

Комментарии (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» пишут перед квадратной скобкой.
                Ответить
                  • В строчках 40-48 в первый байт каждого буфера помещается максимальная длина строки, нужная для функции 0ah, следующий байт после вызова функции будет содержать длину введённой строки (-1 байт от размера буфера).

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


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

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

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

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

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

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

                        А если ты не знаешь что такое STDOUT, то там питух ниже пояснил
                        Ответить
                    • Возможно, ещё нужно рассказать о дескрипторах файлов DOS.

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

      Да ладно, я вот из логов на днях выкидывала буковки, чтобы бинарь на 16 байт ужать...
      Ответить
      • а я на днях использовал бинарь на Го на 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.
                      Ответить
                        • не знаю, у 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-здец.
                          Ответить
                            • А потом это всё говно собирают в кучу и заворачивают в докер, чтобы не смердело так люто.

                              Уровни абасракции ростут как грибы.
                              Ответить
                              • и потом у тебя сайтик на джанго ставится 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 тоже не все гладко

              Если хочу поддерживать 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ов.
                                    Ответить
                                    • > Джавашки вон в 2021 «изобрели» struct, который был ещё в Алголе-68! Назвали правда record (привет Паскаль!).

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

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

                                        Гость правильно говорит: оно будет на стеке передаваться как 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

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

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

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

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

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

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

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

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

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

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

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

              настоящие программисты умеют сичтать до двух
              впрочем, некоторые и до 16-ти
              Ответить
              • я до 7и умею.. а также знаю что такое кольца в математике 🙂
                Ответить
        • Смотря что стоит за словом "получать". Если речь о запуске компилятора - одно. Если речь о напидоривании байтов в файл - совсем другое. Второе на практике не нужно, из-за чего можно быть полезным опытным программистом и не знать, какие туда байтики пишутся.
          Ответить
  • Замечание по поводу строк 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 сделает вид, что не заметила отдельную стрелку.
        Ответить
  • у меня есть тамагочи
    я его покормил, он сейчас спит
    Ответить
  • > Len dw ? ; для второго

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8