Опыт работы с нейронными сетями и простой код на Ассемблере.

Тема в разделе "WASM.BEGINNERS", создана пользователем dcc0, 17 май 2026 в 10:31.

Метки:
  1. dcc0

    dcc0 Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    86
    Решил все-таки посмотреть, как сеть правит и генерерует код.
    Пользовался deepai.org и alice.yandex.ru (Алисой).

    Сразу скажу, что мой код на C обе сети исправили до нерабочего состояния,
    правда, нашли ошибки и всякие уязвимости с прочими ужастностями :)

    Но есть и хорошие новости:
    Последовательность команд bash (для администрирования Linux) сеть генерирует довольно точно.
    Мне понадобилась команда для qemu - пробросить доступ к веб-серверу.
    Главное, правильно составить запрос.

    И вот самое интересное, на мой взгляд: Попросил обе сети сделать следующее, цитирую свой запрос дословно:
    "Напиши программу, которая складывает две цифры из аргументов командной строки и выводит на экран на Ассемблере armv7".

    Обе сети справились. Только код от deepai.org нерабочий. А код от Алисы заработал сразу:

    Код (Text):
    1.     .section .data
    2. msg:    .asciz "Сумма: %d\n"
    3.  
    4.     .section .bss
    5. buf:    .skip 16
    6.  
    7.     .section .text
    8.     .global main
    9.     .type main, %function
    10.  
    11. main:
    12.     push {lr}                     @ Сохраняем lr
    13.     mov r7, #4                    @ sys_write
    14.     mov r0, #1                    @ stdout
    15.     ldr r1, =msg                  @ Адрес сообщения
    16.     mov r2, #10                   @ длина сообщения (можно опустить, если используем printf)
    17.     mov r7, #4                    @ sys_write
    18.     swi 0
    19.  
    20.     @ Получение аргументов командной строки
    21.     @ r0 = argc
    22.     @ r1 = argv
    23.  
    24.     @ Проверка, что argc >= 3
    25.     ldr r2, [sp, #4]              @ argc в стандартных вызовах (зависит от платформы)
    26.     cmp r2, #3
    27.     blt error                    @ Если меньше 3, переходим к ошибке
    28.  
    29.     @ Получение первого аргумента (argv[1])
    30.     ldr r1, [sp, #8]              @ argv
    31.     ldr r1, [r1]                   @ argv[0]
    32.     ldr r1, [r1, #4]               @ argv[1]
    33.  
    34.     @ Получение второго аргумента (argv[2])
    35.     ldr r3, [sp, #8]
    36.     ldr r3, [r3, #8]               @ argv[2]
    37.  
    38.     @ Преобразование argv[1] из строки в число
    39.     bl str2int
    40.     mov r4, r0                     @ число 1 в r4
    41.  
    42.     @ Преобразование argv[2]
    43.     bl str2int
    44.     mov r5, r0                     @ число 2 в r5
    45.  
    46.     @ Складываем
    47.     adds r6, r4, r5
    48.  
    49.     @ Вывод результата (здесь можно использовать printf или sys_write)
    50.     @ Для простоты вызовем printf через системный вызов или используем write с преобразованием числа
    51.  
    52.     @ Вызов printf
    53.     ldr r0, =msg
    54.     mov r1, r6
    55.     bl printf
    56.  
    57.     mov r0, #0
    58.     pop {lr}
    59.     bx lr
    60.  
    61. error:
    62.     @ Обработка ошибки
    63.     ldr r0, =error_msg
    64.     bl printf
    65.     mov r0, #1
    66.     pop {lr}
    67.     bx lr
    68.  
    69. @ Функция преобразования строки в число
    70. str2int:
    71.     push {r4-r7, lr}
    72.     mov r0, #0
    73.     mov r2, #0
    74.  
    75. loop_str2int:
    76.     ldrb r3, [r1, r2]
    77.     cmp r3, #0
    78.     beq end_str2int
    79.     cmp r3, #'0'
    80.     blt end_str2int
    81.     cmp r3, #'9'
    82.     bgt end_str2int
    83.     sub r3, r3, #'0'
    84.     mul r0, r0, #10
    85.     add r0, r0, r3
    86.     add r2, r2, #1
    87.     b loop_str2int
    88.  
    89. end_str2int:
    90.     pop {r4-r7, pc}
    91.  
    92.     .section .data
    93. error_msg: .asciz "Ошибка: недостаточно аргументов\n"


    Код (Text):
    1. asm
    2.  
    3. .text
    4. .global _start
    5.  
    6. _start:
    7.     /* Получить argc из стека (количество аргументов) */
    8.     ldr r0, [sp]          @ argc в r0
    9.  
    10.     /* Проверить, что передано ровно 2 аргумента (всего 3: имя программы + 2 цифры) */
    11.     cmp r0, #3
    12.     bne error_exit
    13.  
    14.     /* Получить указатели на аргументы: argv[1] и argv[2] */
    15.     ldr r1, [sp, #4]    @ argv[0] — имя программы
    16.     ldr r2, [sp, #8]    @ argv[1] — первый аргумент (строка)
    17.     ldr r3, [sp, #12]   @ argv[2] — второй аргумент (строка)
    18.  
    19.     /* Извлечь первую цифру из argv[1] */
    20.     ldrb r4, [r2]       @ загрузить первый символ первого аргумента в r4
    21.     sub r4, r4, #'0'   @ преобразовать ASCII-код цифры в числовое значение
    22.  
    23.     /* Извлечь вторую цифру из argv[2] */
    24.     ldrb r5, [r3]       @ загрузить первый символ второго аргумента в r5
    25.     sub r5, r5, #'0'   @ преобразовать ASCII-код цифры в числовое значение
    26.  
    27.     /* Сложить две цифры */
    28.     add r6, r4, r5    @ r6 = r4 + r5 (результат сложения)
    29.  
    30.     /* Преобразовать результат в ASCII-символ */
    31.     add r6, r6, #'0'  @ преобразовать число в ASCII-код цифры
    32.  
    33.     /* Выделить место на стеке для результата (2 байта: цифра + '\n') */
    34.     sub sp, sp, #2
    35.     strb r6, [sp]       @ сохранить цифру на стеке
    36.     mov r7, #'\n'
    37.     strb r7, [sp, #1]  @ добавить символ новой строки
    38.  
    39.     /* Вывести результат в stdout */
    40.     mov r0, #1          @ file descriptor (stdout)
    41.     mov r1, sp          @ буфер — строка на стеке
    42.     mov r2, #2          @ длина строки (2 байта)
    43.     mov r7, #4          @ системный вызов write
    44.     swi #0              @ вызов ядра
    45.  
    46.     /* Завершить программу с кодом 0 (успех) */
    47.     mov r7, #1          @ системный вызов exit
    48.     mov r0, #0          @ код возврата 0
    49.     swi #0
    50.  
    51. error_exit:
    52.     /* Завершить с ошибкой, если аргументов недостаточно */
    53.     mov r7, #1          @ системный вызов exit
    54.     mov r0, #1          @ код ошибки 1
    55.     swi #0
    56.  
     
  2. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    512
    Это как напиши письмо на деревню дедушке.

    --- --

    Чтобы загнать нс в стойло, сначала прошу сделать код на python.
    Потом прошу развернуть циклы если python-код работает.
    Потом переписать на компилируемые языки учитывая их синтаксис.
    ??????
    PROFIT!!!

    --- --

    Вообще появление ллм очень крутая вещь для погромистов, можно столько нового сделать.
    Пока все другие получают рандомные советы не из жизни. Мы новая элита посоны.
     
    Последнее редактирование: 17 май 2026 в 11:03
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    372
    Нейросетками трудно дорабатывать существующий код из-за недетерминированности выходных данных. Каждый раз нейросетка пишет код по-разному. А доработка существующего кода встречается, наверное, чаще, чем задача по написанию нового кода.
     
    dcc0 нравится это.
  4. dcc0

    dcc0 Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    86
    Тут вся интрига в том, на мой взгляд, что deepai будто бы специализированная сеть для разработчиков, а Алиса все-таки массовая.

    Aoizora, сто плюсов. Так и есть.

    После проверки своего кода на C в итоге воспользовался 2 советами сети из 7 по исправлению кода. И то вручную.
    Оба совета были свзяаны с ошибками (возможные выходы за пределелы цикла).

    P.S. Код в 500 строк (как у меня было) C (ANSI) сеть, как я понял, не исправит правильно автоматически ни при каком раскладе.
    Я писал быстро - лишь бы работало. Сеть сообщила, кстати, на вопрос о сложности и корректнсти кода, что он корректен, запутан и довольно сложен. :) Забавно. Т.е. пока только сетью искать мелкие недочеты во фрагментах кода и генерировать цепочки команд для администрирования?! Риторический вопрос...
     
  5. dcc0

    dcc0 Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    86
    Research,
    Как-то в свое время сам догадался, что можно написать алгоритм на php, потом переписать на стандартный C. Но все равно руками.
    Но разработку сильно облегчает такой подход. Много с более высокого уровня на более низкий уровень переносишь почти механически.
     
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    450
    Что-то вы меня немного запутали. :) Как правильно формулировать промт для генерации ASM-кода ? Просить сначала сгенерировать код на СИ, а потом просить конвертировать его в ASM-код или как ? :)
     
  7. dcc0

    dcc0 Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    86
    Если попытатья ответить трезво, то встает вопрос: хочет ли человек в конечном счёте понимать, как устроен его код? Или нужен только результат?
    Нужны ли реальные навыки программирования или только использование готовых инструментов?

    Но в общем подходов с учётом нейросетей может быть несколько.
    И, если честно, я не знаю, какой лучше.
    Я до последнего момента делал так:
    1) Писал на листе бумаге алгоритм.
    2) Описывал по шагам естественным языком.
    3) Писал код на PHP.
    4) Переписывал на C.

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

    С Ассемблером не знаю. В общем не пишу на нем.
    Но предположу, что - да, вероятно, после C можно по фрагментам переписать что-то на Асме.
    Но тут, конечно, нужен не сумбур, а какой внятный (научный) метод. Определиться, так сказать, с методологией.
     
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    450
    Ответ хороший, добрый, но непонятный и неконкретный. :) Но кое-какую суть я, вроде, уловил. Будем пробовать "методом тыка". :)
     
  9. dcc0

    dcc0 Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    86
    Какой-то конкретный совет давать трудно - делай так или так. Все равно будешь делать по-своему. Может быть, уже есть методы разработки ПО при помощи сетей, во всяком случае частично с их помощью. Значит, и учебники появятся или уже есть.

    P.S.
    Но все равно программирование - это поиск (просто механическое перекладывание кода с языка на язык - это в общем уже и не cовсем программирование. Думаю, понимаешь разницу между сочинением и изложением).
    Где-то надо думать и писать самому, где-то можно использовать готовое.
    Я учился полностью сам (если не считать форумы).
    Опыт программирования у меня достаточно скромный.
    Многое найдено методом проб и ошибок.
    Что-то (приемы и методы) найдено на тех же форумах и т.д..
    Я писал на php и C без фреймворков, без сетей. В редакторах типа nano, vim, gvim, Geany, Notepad++.
    Без всяких IDE. Хорошо это или плохо?! Я не знаю.
    В 2026 по идее на PHP лучше писать, используя IDE и фреймворки (это я так, - для примера, в этом языке и так много шаблонов, паттернов, можно и без нейронных сетей).
    А для C даже не знаю, какие есть IDE под Linux. И сейчас код пишу (хотя уже и не пишу) и правлю в Geany, иногда в nano и vim.
    Не призываю повторять мой опыт. Он в 2026 может быть крайне непродуктивным, но может быть пригодным для самопроверки, на стадии обучения.

    Я так и не стал профессиональным программистом, поэтому трудно что-то советовать. Да и неверным советом вполне можно и навредить...
     
    GRAFik нравится это.
  10. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    450
    dcc0, поставил лайк - за доброту и отзывчивость. Мало от кого, в наше время, дождешься таких ответов и такого внимания. :)