[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2
Автор Сообщение
Михаил Долинский

Темы: 2145
Сообщений: 51645

Мой профиль
Моя конечная цель

Сделать систему, которая станет проверять решения, которые не прошли тестирование,
и (зная, как правильно решить задачу) направлять студента к правильному решению,
указывая на его ошибки.

"Не знаю" нового типа!


Как создавать боты
Как обучать боты
Боты, обучающие программированию
Боты программируют

https://openai.com
https://help.openai.com/en/
https://help.openai.com/en/articles/5722486-how-your-data-is-used-to-improve-model-performance

Для начала нужно научить ИИ решать наши задачи.
Попутно, научившись научить ИИ, может научимся и студентов лучше учить.

Базовый
А. Условное вычисление выражений

Программирование (программа на ассемблере i8086)
ПР. Простейшая
ОС. Обработка строк
1М. Одномерный массив
ЦЧ. Цифры числа

Такие задачи можно найти в папках
"Командные олимпиады - тема лекции - контрольный срез"


Немногочисленные попытки студентов пока привели к неутешительному выводу
ИИ необучаем ассемблеру i8086

Думаю, если его обучили решать С-МПА-задачи
то и ассемблеру обучить возможно.

Надо действовать последовательно от простого к сложному
- объяснить, что всегда байты нужно переводить в слова
- объяснить, как это делать с помощью CBW
- последовательно научить складывать, вычитать, умножать, делить числа с разной размерностью
(вроде бы основная проблема с однооперандным умножением)
- научить сравнивать и решать задачу
Программирование (программа на ассемблере i8086)
ПР. Простейшая
- научить решать задачу
Базовый
А. Условное вычисление выражений

А потом уже переходить к следующим темам возможно в таком порядке
ОС. Обработка строк
1М. Одномерный массив
ЦЧ. Цифры числа


Михаил Долинский:

OpenAI запустила магазин чат-ботов с искусственным интеллектом

Как он будет работать.
Компания OpenAI запустила онлайн-магазин

GPT Store,

где пользователи могут делиться настроенными версиями чат-бота ChatGPT. Магазин доступен пользователям ChatGPT Plus.
Пользователи могут выставлять настроенные чат-боты для различных задач. Например, версию ChatGPT, которая может обучать детей разным предметам или создавать рецепты блюд. Позже компания позволит пользователям зарабатывать деньги на своих творениях — так же, как они могли бы через магазины приложений Apple или Google.
Как и эти магазины приложений, GPT Store OpenAI позволит пользователям видеть самые популярные и трендовые чат-боты в таблице лидеров и искать их по категориям.

По состоянию на 10 января создано 3 миллиона кастомных чат-ботов, говорят в компании.

OpenAI изначально планировала запустить магазин в конце ноября, но отложила запуск на 2024 год из-за перерыва с увольнением Сэма Альтмана.
 

Михаил Долинский

Темы: 2145
Сообщений: 51645

Мой профиль
Написание ассемблерных программ условных арифметических выражений

Файл-препромпт (Пинчуков Матвей, ПРО-21, 11 октября 2024)
Я добавил в файл новые пункты
в результате моей вставки задача 1 прошла с 1 попытки
 

Мне нужна помощь в написании программ для нескольких задач на ассемблере процессора Intel 8086. Используй для этого следующие правила:

1) Программа должна начинаться с jmp begin.

2) Объявление переменных:
a db 0
b dw 0
y dw 0
Где a, b, y - переменные; db, dw - размерность переменных;
db - байт или же 8 бит
dw – слово = 2 байта или же 16 бит
3) После объявления переменных идет begin:.

5) Всегда работать только с 16-битными переменными.

6) Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax
Где x - это 8-битная переменная, а bx - любой другой нужный 16-битный регистр.

7) При выполнении команды вычитания sub, первый операнд должен содержать уменьшаемое, а второй операнд - вычитаемое.

8) Перед делением регистр ax нужно обязательно увеличить с помощью функции cwd

9) Программа должна заканчиваться Ends: jmp Ends ;E.10);E должен прописываться в одной строчке с jmp Ends в метке Ends:

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

Темы: 2145
Сообщений: 51645

Мой профиль


Глеб Тищенко:

Немного доработал файл

Мне нужна помощь в написании программ для нескольких задач на ассемблере процессора Intel 8086. Используй для этого следующие правила:

1) Программа должна начинаться с jmp begin.
2) Объявление переменных:
a db 0
b dw 0
y dw 0
Где a, b, y - переменные; db, dw - размерность переменных;
db - байт или же 8 бит
dw – слово = 2 байта или же 16 бит
3) После объявления переменных идет begin:.
4) Всегда работать только с 16-битными переменными.
5) Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax
Где x - это 8-битная переменная, а bx - любой другой нужный 16-битный регистр.
6) При выполнении команды вычитания sub, первый операнд должен содержать уменьшаемое, а второй операнд - вычитаемое.
7) Перед делением регистр ax нужно обязательно увеличить с помощью функции cwd
8) Функция cwd работает только с регистром ax. Она расширяет 16-битный регистр ax до 32-битного
9) Функция cbw работает только с регистром al. Она расширяет 8-битный регистр al до 16-битного. При расширении значение, которое было в ax заменяется новым значением, поэтому перед расширением старое значение ВСЕГДА необходимо переносить в другой регистр
10) Программа должна заканчиваться Ends: jmp Ends;(тут знак доллара вместо скобки)E

11)команда imul всегда использует регистр ax в качестве множимого в то время как множитель как раз прописывается в самой команде а ответ записывается в регистр ax
(например тебе нужно умножить ax на bx тогда ты прописываешь imul bx)

12)теперь рассмотрим случай когда тебе нужно умножить cx на bx так как imul работает с ax как я уже выше писал. То чтобы умножить cx на bx тебе нужно
с начала значение из регистра cx занести в регистр ax а только после прописать imul bx
(также уточню что ответ также будет в регистре ax)

13) ;(тут знак доллара вместо скобки)E должен прописываться в одной строке с jmp Ends в метке Ends:
По этому чек-листу мне нужно, чтобы ты решал все задачи, которые я попрошу тебя решить в этом диалоге.

14) пример imul bx (тоже самое что ax*bx)! 
Михаил Долинский

Темы: 2145
Сообщений: 51645

Мой профиль


Иван Зеленков:

27-ая задача прошла с первого запроса с изменениями prompt'а из 29-ой [chatgpt.com]
28-ая задача прошла с первого запроса с изменениями prompt'а из 29-ой [chatgpt.com]
29-ая задача прошла с некоторыми корректировками основного prompt'а [chatgpt.com]
30-ая задача прошла с первого запроса [chatgpt.com]

{к 30-ой задаче
A+C*D/(A+B+1) если A=B
A/B-(B*C-D*A)*(A+C) если A>B
(A-2*C/D-B)*(C*B-A-B/D) если A<B
}


{к 29-ой задаче
A/B+C*(B-D/A) если B*A>0
C-B/D-C*(B-D) если B*A<=0
}


prompts:

Мне нужна помощь в написании программ для нескольких задач на ассемблере процессора Intel 8086. Используй для этого следующие правила:

1) Программа должна начинаться с jmp begin.
2) Объявление переменных:
a db 0
b dw 0
y dw 0
Где a, b, y - переменные; db, dw - размерность переменных;
db - байт или же 8 бит
dw – слово = 2 байта или же 16 бит
3) После объявления переменных идет begin:.
4) Всегда работать только с 16-битными переменными.
5) Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax
Где x - это 8-битная переменная, а bx - любой другой нужный 16-битный регистр.
6) При выполнении команды вычитания sub, первый операнд должен содержать уменьшаемое, а второй операнд - вычитаемое.
7) Перед делением регистр ax нужно обязательно увеличить с помощью функции cwd
8) Функция cwd работает только с регистром ax. Она расширяет 16-битный регистр ax до 32-битного
9) Функция cbw работает только с регистром al. Она расширяет 8-битный регистр al до 16-битного. При расширении значение, которое было в ax заменяется новым значением, поэтому перед расширением старое значение ВСЕГДА необходимо переносить в другой регистр
10.1) Программа должна заканчиваться именно так (Ends: jmp Ends; (тут знак доллара вместо текста и скобок)E) то, что в скобках нельзя менять.
10.2) При вычислении значений в ветке для перехода в конец программы не нужно указывать $ (нужно переходить из середины программы в конец так (jmp Ends) )

11)команда imul всегда использует регистр ax в качестве множимого в то время как множитель как раз прописывается в самой команде а ответ записывается в регистр ax
(например тебе нужно умножить ax на bx тогда ты прописываешь imul bx)
11.1) При использовании условных преходов нужно сначала сравнивать с значением из условия
(Например:
cmp ax,0
jle calc_else
)
12)теперь рассмотрим случай когда тебе нужно умножить cx на bx так как imul работает с ax как я уже выше писал. То чтобы умножить cx на bx тебе нужно
с начала значение из регистра cx занести в регистр ax а только после прописать imul bx
(также уточню что ответ также будет в регистре ax)

13) пример imul bx (тоже самое что ax*bx)!
По этому чек-листу мне нужно, чтобы ты решал все задачи, которые я попрошу тебя решить в этом диалоге. 
Михаил Долинский

Темы: 2145
Сообщений: 51645

Мой профиль


Иван Зеленков:

Изменения промпта:
add 14 пункт

Причина:
проблемы с отображением информации в окне с DLAI (неправильный формат)

Дополнение_1:
с этим пунктом (14) форматирование работает не всегда правильно(иногда помогает ускорить переход к "правильному форматированию" обновление страницы)(скорее всего временная проблема с DLAI)

Используемая модель:
Meta-Llama-3-1-70B-Instruct

Дополнение_2:
с логикой решения задач проблем не возникает, за исключением решения некоторых задач(иногда помогает повторный запрос или обновление страницы)

Prompt:

Мне нужна помощь в написании программ для нескольких задач на ассемблере процессора Intel 8086. Используй для этого следующие правила:

1) Программа должна начинаться с jmp begin.
2) Объявление переменных:
a db 0
b dw 0
y dw 0
Где a, b, y - переменные; db, dw - размерность переменных;
db - байт или же 8 бит
dw – слово = 2 байта или же 16 бит
3) После объявления переменных идет begin:.
4) Всегда работать только с 16-битными переменными.
5) Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax
Где x - это 8-битная переменная, а bx - любой другой нужный 16-битный регистр.
6) При выполнении команды вычитания sub, первый операнд должен содержать уменьшаемое, а второй операнд - вычитаемое.
7) Перед делением регистр ax нужно обязательно увеличить с помощью функции cwd
8) Функция cwd работает только с регистром ax. Она расширяет 16-битный регистр ax до 32-битного
9) Функция cbw работает только с регистром al. Она расширяет 8-битный регистр al до 16-битного. При расширении старое значение ВСЕГДА необходимо переносить в другой регистр
10.1) Программа должна заканчиваться именно так (Ends: jmp Ends; (знак доллара)E) то, что в скобках нельзя менять.
10.2) При вычислении значений в ветке для перехода в конец программы НЕ нужно указывать (знак доллара) (нужно переходить из середины программы в конец так (jmp Ends) )

11)команда imul всегда использует регистр ax в качестве множимого в то время как множитель как раз прописывается в самой команде а ответ записывается в регистр ax
(например тебе нужно умножить ax на bx тогда ты прописываешь imul bx)
11.1) При использовании условных преходов нужно сначала сравнивать с значением из условия
(Например:
cmp ax,0
jle calc_else
)
12)теперь рассмотрим случай когда тебе нужно умножить cx на bx так как imul работает с ax как я уже выше писал. То чтобы умножить cx на bx тебе нужно
с начала значение из регистра cx занести в регистр ax а только после прописать imul bx
(также уточню что ответ также будет в регистре ax)

13) пример imul bx (тоже самое что ax*bx)!

14) код нужно выдавать в формате столбика:
(

jmp begin

a db 0
b db 0
c db 0
res db 0

begin:

mov al, a
cbw
mov dx, ax
imul dx
mov si, ax
mov res, al

)

По этому чек-листу мне нужно, чтобы ты решал все задачи, которые я попрошу тебя решить в этом диалоге.


решенные задания:

Дополнение_3:
при решении задачи 17 были проблемы с логикой решения (модель:Meta-Llama-3-1-70B-Instruct)
тот же самый промпт был отправлен в модель Mixtral-8x22b и правильный ответ был получен с первого раза




14.11 13:47 Сам-а17. Задача №17 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Win10 x64 Winter i86
14.11 13:43 Сам-а17. Задача №17 0 / 100 [1]: Ошибка исполнения программы: Integer overflow. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 13:40 Сам-а17. Задача №17 0 / 100 [1]: Не объявлена переменная x. 1.i86 DelTA4 at NIT1 Win10 Winter i86
14.11 13:39 Сам-а17. Задача №17 0 / 100 [1]: Ошибка компиляции (i86): Операнды должны иметь одинаковый размер (строка 16): mov al, a . 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 13:35 Сам-а17. Задача №17 0 / 100 [1]: Ошибка исполнения программы: Integer overflow. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 13:33 Сам-а17. Задача №17 0 / 100 [1]: Ошибка исполнения программы: Integer overflow. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 13:28 Сам-а17. Задача №17 0 / 100 [1]: Ошибка исполнения программы: Integer overflow. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 13:21 Сам-а18. Задача №18 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Winter i86
14.11 13:03 Сам-а18. Задача №18 0 / 100 [1]: Тест не прошел: r hex[2]: 0ffff. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 12:57 Сам-а18. Задача №18 0 / 100 [1]: Ошибка компиляции (i86): Неверная инструкция (строка 55): ends: jmp ends $e;$E. 1.i86 DelTA4 at NIT1 Win10 Winter i86
14.11 12:43 Сам-а19. Задача №19 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT1 Win10 x64 Winter i86
14.11 12:40 Сам-а20. Задача №20 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT1 Win10 x64 Winter i86
14.11 12:18 Сам-а21. Задача №21 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Win10 x64 Winter i86
14.11 12:04 Сам-а22. Задача №22 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Win10 x64 Winter i86
14.11 12:01 Сам-а23. Задача №23 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Win10 x64 Winter i86
14.11 11:58 Сам-а23. Задача №23 0 / 100 [test1]: Ошибка компиляции (i86): Неверная инструкция или неверное описание метки (строка 3): x dw 0 y dw 0 a db 0 c db 0 res dw 0. 1.i86 DelTA4 at NIT1 Win10 Winter i86
14.11 11:56 Сам-а24. Задача №24 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT1 Win10 x64 Winter i86
14.11 11:56 Сам-а24. Задача №24 0 / 100 [test1]: Ошибка компиляции (i86): Неверная инструкция (строка 9): begin: mov ax, x imul y cmp ax, 0 jle calc_else. 1.i86 DelTA4 at NIT0 Win10 Winter i86
14.11 11:36 Сам-а25. Задача №25 100 / 100 Все тесты пройдены (основной + секретный). 1.i86 DelTA4 at NIT0 Winter i86
14.11 11:35 Сам-а25. Задача №25 0 / 100 [test1]: Ошибка компиляции (i86): Неверная инструкция или неверное описание метки (строка 3): x dw 0 y dw 0 a db 0 c db 0 res dw 0.  
Михаил Долинский

Темы: 2145
Сообщений: 51645

Мой профиль


Даниил Нечай:

Иная версия промта, которая учитывает различные аспекты синтаксиса ассемблера.
при помощи данного промта смог решить несколько задач подряд, не прибегая к указанию языковой модели на ее логические ошибки.
использовал Copilot: https://copilot.microsoft.com/
Точнее COPILOT: https://copilot.microsoft.com/chats/7wdks31t477yDQt5oyCRE
Промт был получен вот так: был взят мой прототип промта, который не учитывал множество различных нюансов постороения алгоритма на ассемблере, затем, постоянно указывая на ошибки нейросети, она выходила на правильный путь. После успешного решения одной задачи я просил ее занести мои замечания в промт,и далее продолжить работу.В конце концов, нейросеть смогла решить несколько задачь подряд, что дало мне понять, что мы на правильном пути. Затем я попросил языковую модель заново написать промт, который будет гораздо легче восприниматься , чем мой оригинальный.

### Промт для написания программ на ассемблере для процессора Intel 8086:

1. **Структура программы**:
- Программа должна начинаться с `jmp begin;`
- После этого идет объявление переменных:
```assembly
x db 0
y dw 0
z dw 0
```
Где `x`, `y`, `z` - переменные; `db`, `dw` - размерность переменных:
- `db` - байт (8 бит)
- `dw` - слово (16 бит)

2. **Основная часть программы**:
- После объявления переменных идет `begin:`
- В первую очередь загружаются в регистры самые маленькие переменные.

3. **Используемые команды**:
- Разрешенные команды: `mov`, `sub`, `add`, `imul`, `idiv`, `cbw`, `cwd`, `cmp`
- Комментарии следует писать только в той же строке, что и команда.

4. **Загрузка переменных размерностью байт**:
- Загружаем байтовую переменную строго по шаблону:
```assembly
mov al, x
cbw
mov bx, ax
```
Где `x` - байтовая переменная; `bx` - регистр, в который хотим загрузить переменную.

5. **Вычитание с использованием команды `sub`**:
- Первый операнд — уменьшаемое, второй — вычитаемое.

6. **Использование команды `idiv`**:
- Перед делением нужно увеличить `ax` с помощью `cwd`.
- В `ax` всегда хранится делимое, делитель может быть в любом другом регистре.
- Если у делителя размерность байт, его нужно занести в 16-битный регистр по правилу загрузки байтовых переменных.
- Команды `idiv` и `imul` не могут работать напрямую с числами. Для этого используйте промежуточные переменные.
- Пример:
```assembly
mov ax, var1 ; загружаем переменную var1 в ax
cwd ; расширяем ax до dx:ax
idiv var2 ; делим dx:ax на var2
```

7. **Использование команды `imul`**:
- `imul` принимает только один аргумент и умножает значение в регистре `ax` на аргумент.
- Пример вычисления `a*b`, если `a` - 2 байта, `b` - байт:
```assembly
mov al, b ; предварительно занесли переменную в конкретный регистр al
cbw ; расширяем до ax (ax = b)
mov bx, a ; заносим в bx переменную a
imul bx ; ax = ax * bx или ax = a * b
```

8. **Перевод 8-битных переменных в 16-битные**:
- Всегда переводите 8-битные переменные в 16-битные, если в условии задачи используется 16-битная переменная. Для этого используйте дополнительные переменные для хранения конвертированных значений.
- Пример:
```assembly
mov al, var ; загружаем байтовую переменную
cbw ; расширяем до ax
mov var2, ax ; сохраняем значение в 16-битную переменную
```

9. **Переменные для промежуточных значений**:
- Добавляйте по **четыре** переменные для хранения различных промежуточных значений, чтобы было удобнее обрабатывать выражения.
- Внимательно читайте комментарии около блоков с кодом, которые отвечают за какое-то условие. В них указаны выражения, которые нужно обработать.

10. **Использование регистра для операций**:
- Все операции должны выполняться через регистры. **Ни один из операндов не должен использовать две переменные в качестве аргументов**. Операнды типа `cmp`, `sub`, `mov` и другие должны использовать промежуточные переменные и регистры для выполнения операций.
- Пример корректного использования:
```assembly
mov ax, a_16 ; загружаем переменную a_16 в ax
mov bx, b_16 ; загружаем переменную b_16 в bx
cmp ax, bx ; сравниваем a_16 и b_16
```

11. **Заключительная часть программы**:
- Программа должна заканчиваться:
```assembly
Ends:
jmp Ends ;$E;
```

12. **Примечания**:
- Загрузка данных в регистры происходит без квадратных скобок.
- В командах можно использовать переменную без регистра, если её размерность 2 байта (`dw`).
- Важно **не хранить конвертированные значения в регистрах**. Вместо этого используйте дополнительные переменные для хранения конвертированных значений.

### Пример программы с учетом всех правил:

```assembly
jmp begin

x dw 2
y dw -1
a db 1
c db 3
RES dw 0
a_16 dw 0 ; 16-битная переменная для хранения конвертированного a
c_16 dw 0 ; 16-битная переменная для хранения конвертированного c
temp1 dw 0 ; промежуточная переменная
temp2 dw 0 ; промежуточная переменная
temp3 dw 0 ; промежуточная переменная
temp4 dw 0 ; промежуточная переменная

begin:
mov al, a ; загружаем переменную a в al
cbw ; расширяем al до ax
mov a_16, ax ; сохраняем значение ax в a_16

mov al, c ; загружаем переменную c в al
cbw ; расширяем al до ax
mov c_16, ax ; сохраняем значение ax в c_16

; проверяем условие x * y <= 0
mov ax, x ; загружаем переменную x в ax
imul y ; ax = x * y
cmp ax, 0 ; сравниваем x * y с 0
jle calc_case1 ; если x * y <= 0, переходим к calc_case1

; calc_case2: x/y + c/a - (y*a/x)*c
mov ax, x ; загружаем переменную x в ax
cwd ; расширяем ax до dx:ax
idiv y ; dx:ax / y
mov bx, ax ; сохраняем результат в bx

mov ax, c_16 ; загружаем переменную c_16 в ax
cwd ; расширяем ax до dx:ax
idiv a_16 ; dx:ax / a
add bx, ax ; bx = x/y + c/a

mov ax, y ; загружаем переменную y в ax
imul a_16 ; ax = y * a
cwd ; расширяем ax до dx:ax
idiv x ; dx:ax / x
imul c_16 ; ax = (y * a / x) * c
sub bx, ax ; bx = x/y + c/a - (y*a/x)*c

mov RES, bx ; сохраняем результат в RES
jmp Ends ; завершение программы

calc_case1:
; calc_case1: x/a + c*a - y
mov ax, x ; загружаем переменную x в ax
cwd ; расширяем ax до dx:ax
idiv a_16 ; dx:ax / a
mov bx, ax ; сохраняем результат в bx

mov ax, c_16 ; загружаем переменную c_16 в ax
imul a_16 ; ax = c * a
add bx, ax ; bx = x/a + c*a

mov ax, y ; загружаем переменную y в ax
sub bx, ax ; bx = x/a + c*a - y

mov RES, bx ; сохраняем результат в RES

Ends:
jmp Ends ; завершение программы
```
твоя цель-решить задачи , которые я тебе предоставлю
 
Тимофей Александрович

Темы: 0
Сообщений: 17

Мой профиль
Применение нейросетей для решения задач на i8086

Использовались нейросети Chat-GPT4o-mini, Gemini-2.0-Flash, DeepSeek-V3, Llama-4-Scout-B10, Grok-3, Claude-3.5-Haiku, Mistral-Medium и Perplexity-Sonar;
проверялись на задаче 

Командные олимпиады\Подготовка к контрольному срезу\Контроль\1\а1. Задача №1
https://dl.gsu.by/task.jsp?nid=2428207&cid=1370
Задачу решили Chat-GPT4o-mini, Gemini-2.0-Flash, Grok-3 и Claude-3.5-Haiku.


1. Chat-GPT4o-mini
Справился без проблем.
Решение: https://dl.gsu.by/getmysol.asp?id=13772652

2. Gemini-2.0-Flash
Справился без проблем.
Решение: https://dl.gsu.by/getmysol.asp?id=13772680

3. DeepSeek-V3
Код выглядит правильно, но через компиляторы не прошел по  причине "Внутренняя ошибка WChecker: не удается открыть report.txt".
Решение: https://dl.gsu.by/getmysol.asp?id=13772700

4. Llama-4-Scout-B10
Синтаксически код верен, но не возвращает верный ответ. При указании на ошибки повторяет ошибочный код без изменений.
Решение: https://dl.gsu.by/getmysol.asp?id=13772715

5. Grok-3
Справился без проблем.
Решение: https://dl.gsu.by/getmysol.asp?id=13772730

6. Claude-3.5-Haiku
Справился без проблем.
Решение: https://dl.gsu.by/getmysol.asp?id=13772744

7. Mistral-Medium
Сначала игнорировал размерности, после - часто перестал использовать регистры, в результате вызывая ошибки.
Решение: https://dl.gsu.by/getmysol.asp?id=13772767

8. Perplexity-Sonar
Также пропускает регистры. Чаще всего, если нужно присвоить значение одной переменной другой, вместо использования регистра присваивает его напрямую, вызывая ошибку.
Решение: https://dl.gsu.by/getmysol.asp?id=13772790

Примечание: во всех диалогах исправлены малейшие недочёты (исправление окончания программы, замена end на halt).
Тимофей Александрович

Темы: 0
Сообщений: 17

Мой профиль
Использовавшийся промпт:
мне нужна твоя помощь с решением задачи на ассемблере i8086.
далее в этом сообщении - краткая теория его использования.

1. **Структура программы**:
- Программа должна начинаться с `jmp begin;`
- После этого идет объявление переменных:
```
x db 0
y dw 0
z dw 0
```
Где `x`, `y`, `z` - переменные; `db`, `dw` - размерность переменных:
- `db` - байт (8 бит)
- `dw` - слово (16 бит)

2. **Основная часть программы**:
- После объявления переменных идет `begin:`
- Все действия над значениями, как правило, происходят в регистрах.
- Регистры также, как и переменные, имеют размерность.
- Размерности значений переменных, которые заносятся в регистры, и самих регистров должны совпадать.
- Инициализировать регистры не нужно.
- В первую очередь загружаются в регистры самые маленькие переменные.

3. **Используемые команды**:
- Разрешенные команды: `mov`, `sub`, `add`, `imul`, `idiv`, `cbw`, `cwd`, `cmp`
- Комментарии следует писать только в той же строке, что и команда.
- Комментарии начинаются с символа `;`.
- При математическом действии с двумя регистрами результат заносится в первый регистр.

4. **Загрузка переменных размерностью байт**:
- Загружаем байтовую переменную строго по шаблону:
```
mov al, x
cbw
mov bx, ax
```
Где `x` - байтовая переменная; `bx` - регистр, в который хотим загрузить переменную.

5. **Вычитание с использованием команды `sub`**:
- Первый операнд — уменьшаемое, второй — вычитаемое.

6. **Использование команды `idiv`**:
- Перед делением нужно увеличить `ax` с помощью `cwd`.
- В `ax` всегда хранится делимое, делитель может быть в любом другом регистре.
- Если у делителя размерность байт, его нужно занести в 16-битный регистр по правилу загрузки байтовых переменных.
- Команды `idiv` и `imul` не могут работать напрямую с числами. Для этого используйте промежуточные переменные.
- Пример:
```
mov ax, var1 ; загружаем переменную var1 в ax
cwd ; расширяем ax до dx:ax
idiv var2 ; делим dx:ax на var2
```

7. **Использование команды `imul`**:
- `imul` принимает только один аргумент и умножает значение в регистре `ax` на аргумент.
- Пример вычисления `a*b`, если `a` - 2 байта, `b` - байт:
```
mov al, b ; предварительно занесли переменную в конкретный регистр al
cbw ; расширяем до ax (ax = b)
mov bx, a ; заносим в bx переменную a
imul bx ; ax = ax * bx или ax = a * b
```

8. **Перевод 8-битных переменных в 16-битные**:
- Всегда переводите 8-битные переменные в 16-битные, если в условии задачи используется 16-битная переменная. Для этого используйте дополнительные переменные для хранения конвертированных значений.
- Пример:
```
mov al, var ; загружаем байтовую переменную
cbw ; расширяем до ax
mov var2, ax ; сохраняем значение в 16-битную переменную
```

9. **Переменные для промежуточных значений**:
- Добавляйте по **четыре** переменные для хранения различных промежуточных значений, чтобы было удобнее обрабатывать выражения.
- Внимательно читайте комментарии около блоков с кодом, которые отвечают за какое-то условие. В них указаны выражения, которые нужно обработать.

10. **Использование регистра для операций**:
- Все операции должны выполняться через регистры. **Ни один из операндов не должен использовать две переменные в качестве аргументов**. Операнды типа `cmp`, `sub`, `mov` и другие должны использовать промежуточные переменные и регистры для выполнения операций.
- Пример корректного использования:
```
mov ax, a_16 ; загружаем переменную a_16 в ax
mov bx, b_16 ; загружаем переменную b_16 в bx
cmp ax, bx ; сравниваем a_16 и b_16
```

11. **Заключительная часть программы**:
- Программа должна заканчиваться:
```
End:
jmp End ;$E;
```

12. **Примечания**:
- Загрузка данных в регистры происходит без квадратных скобок.
- В командах можно использовать переменную без регистра, если её размерность 2 байта (`dw`).
- Важно **не хранить конвертированные значения в регистрах**. Вместо этого используйте дополнительные переменные для хранения конвертированных значений.

### Пример программы с учетом всех правил:

jmp begin

x dw 2
y dw -1
a db 1
c db 3
RES dw 0
a_16 dw 0 ; 16-битная переменная для хранения конвертированного a
c_16 dw 0 ; 16-битная переменная для хранения конвертированного c
temp1 dw 0 ; промежуточная переменная
temp2 dw 0 ; промежуточная переменная
temp3 dw 0 ; промежуточная переменная
temp4 dw 0 ; промежуточная переменная

begin:
mov al, a ; загружаем переменную a в al
cbw ; расширяем al до ax
mov a_16, ax ; сохраняем значение ax в a_16

mov al, c ; загружаем переменную c в al
cbw ; расширяем al до ax
mov c_16, ax ; сохраняем значение ax в c_16

; проверяем условие x * y <= 0
mov ax, x ; загружаем переменную x в ax
imul y ; ax = x * y
cmp ax, 0 ; сравниваем x * y с 0
jle calc_case1 ; если x * y <= 0, переходим к calc_case1

; calc_case2: x/y + c/a - (y*a/x)*c
mov ax, x ; загружаем переменную x в ax
cwd ; расширяем ax до dx:ax
idiv y ; dx:ax / y
mov bx, ax ; сохраняем результат в bx

mov ax, c_16 ; загружаем переменную c_16 в ax
cwd ; расширяем ax до dx:ax
idiv a_16 ; dx:ax / a
add bx, ax ; bx = x/y + c/a

mov ax, y ; загружаем переменную y в ax
imul a_16 ; ax = y * a
cwd ; расширяем ax до dx:ax
idiv x ; dx:ax / x
imul c_16 ; ax = (y * a / x) * c
sub bx, ax ; bx = x/y + c/a - (y*a/x)*c

mov RES, bx ; сохраняем результат в RES
jmp Ends ; завершение программы

calc_case1:
; calc_case1: x/a + c*a - y
mov ax, x ; загружаем переменную x в ax
cwd ; расширяем ax до dx:ax
idiv a_16 ; dx:ax / a
mov bx, ax ; сохраняем результат в bx

mov ax, c_16 ; загружаем переменную c_16 в ax
imul a_16 ; ax = c * a
add bx, ax ; bx = x/a + c*a

mov ax, y ; загружаем переменную y в ax
sub bx, ax ; bx = x/a + c*a - y

mov RES, bx ; сохраняем результат в RES

End:
jmp End ; завершение программы
```

твоя цель - решить следующую задачу в этом диалоге.
 
Константин Лысенко

Темы: 0
Сообщений: 14

Мой профиль
Ссылка на задачу: https://dl.gsu.by/task.jsp?nid=2503317&cid=1410
Для решения данной задачи использовался DeepSeek V3.2:
https://chat.deepseek.com/
```
a DW 4
b DW 6
c DB 8
d DB 3
RES DW 0

; Проверяем условие a = 4
MOV AX, [a]
CMP AX, 4
JE case_equal ; Если a = 4, переходим к первой ветке

; --- Ветка a <> 4: RES = (a + b - sign(c*d)) / a ---

; Вычисляем c*d
MOV AL, [c] ; AL = c
MOV BL, [d] ; BL = d
IMUL BL ; AX = c*d (байт * байт = слово)

; Определяем sign(c*d)
CMP AX, 0
JG positive ; Если > 0, sign = 1
JL negative ; Если < 0, sign = -1

; Если = 0, sign = 0
MOV CX, 0
JMP calc_sum

positive:
MOV CX, 1
JMP calc_sum

negative:
MOV CX, -1

calc_sum:
; Вычисляем a + b - sign(c*d)
MOV AX, [a] ; AX = a
ADD AX, [b] ; AX = a + b
SUB AX, CX ; AX = a + b - sign(c*d)

; Делим на a
CWD ; Расширяем AX в DX:AX для деления
MOV BX, [a] ; BX = a
IDIV BX ; AX = (a + b - sign(c*d)) / a
MOV [RES], AX ; Сохраняем результат
JMP end_program

case_equal:
; --- Ветка a = 4: RES = c/a + b/d - a*c ---

; Вычисляем c/a
MOV AL, [c] ; AL = c
CBW ; AX = c (расширяем до слова)
CWD ; DX:AX = c (расширяем для деления)
MOV BX, [a] ; BX = a
IDIV BX ; AX = c/a
MOV [RES], AX ; RES = c/a

; Вычисляем b/d
MOV AX, [b] ; AX = b
CWD ; DX:AX = b (расширяем для деления)
MOV BL, [d] ; BL = d
MOV BH, 0 ; BX = d (расширяем до слова)
IDIV BX ; AX = b/d
ADD [RES], AX ; RES = c/a + b/d

; Вычисляем a*c
MOV AX, [a] ; AX = a
MOV BL, [c] ; BL = c
MOV BH, 0 ; BX = c (расширяем до слова)
IMUL BX ; AX = a*c
SUB [RES], AX ; RES = c/a + b/d - a*c

end_program:
```
Константин Лысенко

Темы: 0
Сообщений: 14

Мой профиль
Ссылка на задачу: https://dl.gsu.by/task.jsp?nid=2503317&cid=1410
[/url]
Искусственный интеллект, встроенный в сайт, не решает данную задачу.
Для решения задачи использовался DeepSeek R1 и препромпт, предлагаемый сайтом.
Решение, предлагаемое ИИ на сайте DL:
```
assembly
jmp begin

a dw 4
b dw 6
c db 8
d db 3
RES dw 0
a_16 dw 0
c_16 dw 0
d_16 dw 0
b_16 dw 0
temp1 dw 0
temp2 dw 0
temp3 dw 0
temp4 dw 0
sign dw 0

begin:

mov al, a  ; Загрузка переменных в 16-битные регистры
cbw
mov a_16, ax

mov al, b
cbw
mov b_16, ax

mov al, c
cbw
mov c_16, ax

mov al, d
cbw
mov d_16, ax


mov ax, a_16  ; Проверка условия a == 4
cmp ax, 4
je case_a4
jmp case_not4

case_a4:
mov ax, c_16  ; Вычисление RES = c/a + b/d - a*c
cwd           ; c/a
idiv a_16
mov temp1, ax


mov ax, b_16  ; b/d
cwd
idiv d_16
mov temp2, ax


mov ax, temp1  ; temp1 + temp2
add ax, temp2
mov temp3, ax


mov ax, a_16  ; a*c
imul c_16
mov temp4, ax

; temp3 - temp4
mov ax, temp3
sub ax, temp4
mov RES, ax
jmp End

case_not4:  ; Вычисление RES = (a + b - sign(c*d)) / a
mov al, c   ; c*d
cbw
imul d_16
mov temp1, ax


mov ax, temp1  ; sign(c*d)
cmp ax, 0
je sign_zero
jg sign_pos
jge sign_neg

sign_pos:
mov sign, 1
jmp sign_end

sign_zero:
mov sign, 0
jmp sign_end

sign_neg:
mov sign, -1

sign_end:   ; a + b - sign
mov ax, a_16
add ax, b_16
sub ax, sign
             
cwd        ; деление на a
idiv a_16
mov RES, ax

End:
jmp End

Кирилл Басюль

Темы: 0
Сообщений: 43

Мой профиль
Задача - https://dl.gsu.by/task.jsp?nid=2504559&cid=1410


DeepSeekR1 - решил задачу

Llama31Tulu3_405B - ошибка API. Видимо API токен устарел

MetaLlama3170B_Instruct - решил задачу

Qwen_32B - ошибка API. Видимо API токен устарел

Gptoss120b - Решил спустя 3 промпта при условии что пришлось подправлять в конец jmp end;$E. было jmp end$e






Универсальный промпт который использовался:
вот пример программ на asm86:
1:
<code>
JMP BEGIN
IN_STR DB 'ABCDEAA'
RES DW 0

BEGIN:
    ; подсчет длины строки
    LEA BX,IN_STR
    MOV CX,0
    MOV BP,0
    DEC BX
    MOV AL,'#'
LEN: INC BX
    INC CX
    CMP AL,[BX]
    JNE LEN

    ; цикл подсчета гласных
    DEC CX
    JZ FIN
    DEC BX
CIKL: MOV AL,[BX]
    CMP AL,'A'
    JE INCA
    CMP AL,'O'
    JE INCA
    CMP AL,'E'
    JE INCA
    CMP AL,'I'
    JE INCA
    CMP AL,'U'
    JE INCA
    DEC BX
    LOOP CIKL
    JMP FIN
INCA: INC BP
    DEC BX
    JMP CIKL
FIN: MOV RES,BP

HALT: JMP 0
<code>


Пример решения 2:
<code>
jmp begin
a	dw 4
b	dw 2
c	db -1
d	db 2
res	dw 0

begin:
	mov al,	-1
	cbw
	imul c
	cmp b, ax
	jne vetka



	mov ax,	-1
	imul a
	imul b	 ;ax=-a*b
	mov bx, ax ;bx = -a*b

	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ;ax = c*d

	sub bx, ax ;bx = -a*b-c*d
	mov ax, 0

	mov ax, a    ;ax =a
	cwd
	mov cx, ax     ;cx = ax
	mov al, c
	cbw	       ;ax = c
	mov sp, ax
	mov ax, cx
	idiv sp ;ax = ax/sp = a/c
	add bx, ax ;bx = -a*b-c*d+a/c
	mov ax, b
	cwd
	mov sp, ax
	mov al,	d
	cbw
	mov cx, ax
	mov ax, sp
	idiv cx ;ax = b/d
	add bx, ax ;-a*b-c*d+a/c+b/d
	mov res, bx
	jmp halt

vetka:
	mov ax, a
	add ax,b ;ax = a+b
	imul a	  ;else fix here
	imul b	  ;ax = (a+b)*a*b
	mov bx, ax  ;bx = ax
	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ; ax=c*d
	imul bx ; ax = (a+b)*a*b*c*d
	cwd
	mov cx, ax  ;cx = ax
	mov al, c
	cbw
	mov bx, ax; bx= ax = c
	mov al,	d
	cbw
	sub bx, ax; bx = ax = c-d
	mov ax, cx
	idiv bx
	mov res, ax
	jmp halt

halt:
	jmp halt;$E
<code>


Пример решения 3:
<code>
	jmp begin
a	dw 4
b	dw 2
c	db -10
d	db 3
res	dw 0
begin:
	mov ax, a
	cmp ax,	-2
	jle vetka
	cmp ax,	5
	jge vetka

	mov ax,a
	imul b
	imul b
	mov bx,	ax
	mov al,	c
	cbw
	imul ax
	mov cx ,ax  ;cx	= c^2
	mov al,c
	cbw
	imul cx ;ax = c^3
	imul bx
	mov cx, ax ;cx=a*b^2*c^3    ;norm

	mov bx, b  ;2chapter
	mov al, c
	cbw
	imul ax
	imul bx	  ;ax = b*c^2
	mov bx, 0
	mov bx, ax
	mov al, d
	cbw
	imul ax
	mov sp, ax;sp = d^2
	mov al, d
	cbw
	imul sp ;ax = d^3
	mov sp,	ax
	mov ax, bx
	imul sp		;ax = b*c^2*d^3
	add cx, ax ;cx = a*b^2*c^3+b*c^2*d^3 ;norm

	mov ax, a
	imul a
	imul a
	idiv b
	cwd
	idiv b
	cwd
	mov bx, ax
	mov al, c
	cbw
	mov sp, ax
	mov ax, bx
	idiv sp
	sub cx, ax
	mov res, cx
	jmp ends

vetka:
	mov bx, a
	add bx, b
	mov al, c
	imul d
	add bx, ax  ;bx = (a+b+c*d)
	mov ax, 0
	mov ax, bx ; ax = (a+b+c*d)
	mov bx, 0
	mov bx, a
	sub bx, b
	mov cx, ax   ;cx = a+b+c*d
	mov al, c
	imul d
	sub bx, ax
	mov ax, cx
	cwd
	idiv bx
	mov res, ax
	jmp ends

ends:
	jmp ends;$E
<code>

уточнения: 
1. Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax

2. Программа должна заканчиваться Ends: jmp Ends;(тут знак доллара вместо скобки)E


Важное уточнение, что asm86 не поддерживает запись вида регистр + const. запись MOV WORD PTR [RES+2], DX будет некорректна.


Вот условие задачи:




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


______________________
my profile
Кирилл Басюль

Темы: 0
Сообщений: 43

Мой профиль
Задача -
https://dl.gsu.by/task.jsp?nid=2504560&cid=1410



DeepSeekR1(на dl) - не решил

DeepSeekR1(на оф. сайте) - решил с 3 промпта. ошибки в процесса: [1]: Ошибка исполнения программы: Division by zero и [1]: Тест не прошел: Размерность переменной res должна быть 1 байт.

MetaLlama3170B - не может решить задачу. при загрузке тестов тот не подправляет ошибку

Gptoss120b - решил после двух правок



Промпт:


вот пример программ на asm86:
1:
<code>
JMP BEGIN
IN_STR DB 'ABCDEAA'
RES DW 0

BEGIN:
    ; подсчет длины строки
    LEA BX,IN_STR
    MOV CX,0
    MOV BP,0
    DEC BX
    MOV AL,'#'
LEN: INC BX
    INC CX
    CMP AL,[BX]
    JNE LEN

    ; цикл подсчета гласных
    DEC CX
    JZ FIN
    DEC BX
CIKL: MOV AL,[BX]
    CMP AL,'A'
    JE INCA
    CMP AL,'O'
    JE INCA
    CMP AL,'E'
    JE INCA
    CMP AL,'I'
    JE INCA
    CMP AL,'U'
    JE INCA
    DEC BX
    LOOP CIKL
    JMP FIN
INCA: INC BP
    DEC BX
    JMP CIKL
FIN: MOV RES,BP

HALT: JMP 0
<code>


Пример решения 2:
<code>
jmp begin
a	dw 4
b	dw 2
c	db -1
d	db 2
res	dw 0

begin:
	mov al,	-1
	cbw
	imul c
	cmp b, ax
	jne vetka



	mov ax,	-1
	imul a
	imul b	 ;ax=-a*b
	mov bx, ax ;bx = -a*b

	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ;ax = c*d

	sub bx, ax ;bx = -a*b-c*d
	mov ax, 0

	mov ax, a    ;ax =a
	cwd
	mov cx, ax     ;cx = ax
	mov al, c
	cbw	       ;ax = c
	mov sp, ax
	mov ax, cx
	idiv sp ;ax = ax/sp = a/c
	add bx, ax ;bx = -a*b-c*d+a/c
	mov ax, b
	cwd
	mov sp, ax
	mov al,	d
	cbw
	mov cx, ax
	mov ax, sp
	idiv cx ;ax = b/d
	add bx, ax ;-a*b-c*d+a/c+b/d
	mov res, bx
	jmp halt

vetka:
	mov ax, a
	add ax,b ;ax = a+b
	imul a	  ;else fix here
	imul b	  ;ax = (a+b)*a*b
	mov bx, ax  ;bx = ax
	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ; ax=c*d
	imul bx ; ax = (a+b)*a*b*c*d
	cwd
	mov cx, ax  ;cx = ax
	mov al, c
	cbw
	mov bx, ax; bx= ax = c
	mov al,	d
	cbw
	sub bx, ax; bx = ax = c-d
	mov ax, cx
	idiv bx
	mov res, ax
	jmp halt

halt:
	jmp halt;$E
<code>


Пример решения 3:
<code>
	jmp begin
a	dw 4
b	dw 2
c	db -10
d	db 3
res	dw 0
begin:
	mov ax, a
	cmp ax,	-2
	jle vetka
	cmp ax,	5
	jge vetka

	mov ax,a
	imul b
	imul b
	mov bx,	ax
	mov al,	c
	cbw
	imul ax
	mov cx ,ax  ;cx	= c^2
	mov al,c
	cbw
	imul cx ;ax = c^3
	imul bx
	mov cx, ax ;cx=a*b^2*c^3    ;norm

	mov bx, b  ;2chapter
	mov al, c
	cbw
	imul ax
	imul bx	  ;ax = b*c^2
	mov bx, 0
	mov bx, ax
	mov al, d
	cbw
	imul ax
	mov sp, ax;sp = d^2
	mov al, d
	cbw
	imul sp ;ax = d^3
	mov sp,	ax
	mov ax, bx
	imul sp		;ax = b*c^2*d^3
	add cx, ax ;cx = a*b^2*c^3+b*c^2*d^3 ;norm

	mov ax, a
	imul a
	imul a
	idiv b
	cwd
	idiv b
	cwd
	mov bx, ax
	mov al, c
	cbw
	mov sp, ax
	mov ax, bx
	idiv sp
	sub cx, ax
	mov res, cx
	jmp ends

vetka:
	mov bx, a
	add bx, b
	mov al, c
	imul d
	add bx, ax  ;bx = (a+b+c*d)
	mov ax, 0
	mov ax, bx ; ax = (a+b+c*d)
	mov bx, 0
	mov bx, a
	sub bx, b
	mov cx, ax   ;cx = a+b+c*d
	mov al, c
	imul d
	sub bx, ax
	mov ax, cx
	cwd
	idiv bx
	mov res, ax
	jmp ends

ends:
	jmp ends;$E
<code>

уточнения: 
1. Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax

2. Программа должна заканчиваться Ends: jmp Ends;(тут знак доллара вместо скобки)E


Важное уточнение, что asm86 не поддерживает запись вида регистр + const. запись MOV WORD PTR [RES+2], DX будет некорректна.


Вот условие задачи:

Дан вектор размерности n=10. Найти остаток от деления суммы всех положительных элементов на сумму всех модулей отрицательных элементов вектора. Все переменные - байтовые.

Формат ввода
x: -4 -6 0 -10 3 7 3 6 0 -5
Формат вывода
res: 19


входные данные: x
выходные: res





______________________
my profile
Кирилл Басюль

Темы: 0
Сообщений: 43

Мой профиль
Задача -
https://dl.gsu.by/task.jsp?nid=2504561&cid=1410




DeepSeekR1 - не смог решить при первых 7 попытках. далее я начал чат сначала но переделал промпт. В результате она решила задачу.
Как это работает? Дело в том что нейросеть работает просто дополняющий себя Т9. Историю переписки она не помнит, поэтому в каждое ваше новое сообщение добавляются все старые сообщения от нейросети и от вас, в результате создается иллюзия памяти. Пересоздание чата уменьшает вероятность ошибок










Промпт:

вот пример программ на asm86:
1:
<code>
JMP BEGIN
IN_STR DB 'ABCDEAA'
RES DW 0

BEGIN:
    ; подсчет длины строки
    LEA BX,IN_STR
    MOV CX,0
    MOV BP,0
    DEC BX
    MOV AL,'#'
LEN: INC BX
    INC CX
    CMP AL,[BX]
    JNE LEN

    ; цикл подсчета гласных
    DEC CX
    JZ FIN
    DEC BX
CIKL: MOV AL,[BX]
    CMP AL,'A'
    JE INCA
    CMP AL,'O'
    JE INCA
    CMP AL,'E'
    JE INCA
    CMP AL,'I'
    JE INCA
    CMP AL,'U'
    JE INCA
    DEC BX
    LOOP CIKL
    JMP FIN
INCA: INC BP
    DEC BX
    JMP CIKL
FIN: MOV RES,BP

HALT: JMP 0
<code>


Пример решения 2:
<code>
jmp begin
a	dw 4
b	dw 2
c	db -1
d	db 2
res	dw 0

begin:
	mov al,	-1
	cbw
	imul c
	cmp b, ax
	jne vetka



	mov ax,	-1
	imul a
	imul b	 ;ax=-a*b
	mov bx, ax ;bx = -a*b

	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ;ax = c*d

	sub bx, ax ;bx = -a*b-c*d
	mov ax, 0

	mov ax, a    ;ax =a
	cwd
	mov cx, ax     ;cx = ax
	mov al, c
	cbw	       ;ax = c
	mov sp, ax
	mov ax, cx
	idiv sp ;ax = ax/sp = a/c
	add bx, ax ;bx = -a*b-c*d+a/c
	mov ax, b
	cwd
	mov sp, ax
	mov al,	d
	cbw
	mov cx, ax
	mov ax, sp
	idiv cx ;ax = b/d
	add bx, ax ;-a*b-c*d+a/c+b/d
	mov res, bx
	jmp halt

vetka:
	mov ax, a
	add ax,b ;ax = a+b
	imul a	  ;else fix here
	imul b	  ;ax = (a+b)*a*b
	mov bx, ax  ;bx = ax
	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ; ax=c*d
	imul bx ; ax = (a+b)*a*b*c*d
	cwd
	mov cx, ax  ;cx = ax
	mov al, c
	cbw
	mov bx, ax; bx= ax = c
	mov al,	d
	cbw
	sub bx, ax; bx = ax = c-d
	mov ax, cx
	idiv bx
	mov res, ax
	jmp halt

halt:
	jmp halt;$E
<code>


Пример решения 3:
<code>
	jmp begin
a	dw 4
b	dw 2
c	db -10
d	db 3
res	dw 0
begin:
	mov ax, a
	cmp ax,	-2
	jle vetka
	cmp ax,	5
	jge vetka

	mov ax,a
	imul b
	imul b
	mov bx,	ax
	mov al,	c
	cbw
	imul ax
	mov cx ,ax  ;cx	= c^2
	mov al,c
	cbw
	imul cx ;ax = c^3
	imul bx
	mov cx, ax ;cx=a*b^2*c^3    ;norm

	mov bx, b  ;2chapter
	mov al, c
	cbw
	imul ax
	imul bx	  ;ax = b*c^2
	mov bx, 0
	mov bx, ax
	mov al, d
	cbw
	imul ax
	mov sp, ax;sp = d^2
	mov al, d
	cbw
	imul sp ;ax = d^3
	mov sp,	ax
	mov ax, bx
	imul sp		;ax = b*c^2*d^3
	add cx, ax ;cx = a*b^2*c^3+b*c^2*d^3 ;norm

	mov ax, a
	imul a
	imul a
	idiv b
	cwd
	idiv b
	cwd
	mov bx, ax
	mov al, c
	cbw
	mov sp, ax
	mov ax, bx
	idiv sp
	sub cx, ax
	mov res, cx
	jmp ends

vetka:
	mov bx, a
	add bx, b
	mov al, c
	imul d
	add bx, ax  ;bx = (a+b+c*d)
	mov ax, 0
	mov ax, bx ; ax = (a+b+c*d)
	mov bx, 0
	mov bx, a
	sub bx, b
	mov cx, ax   ;cx = a+b+c*d
	mov al, c
	imul d
	sub bx, ax
	mov ax, cx
	cwd
	idiv bx
	mov res, ax
	jmp ends

ends:
	jmp ends;$E
<code>

уточнения: 
1. Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax

2. Программа должна заканчиваться Ends: jmp Ends;$E





Синтаксис и команды:

Используется синтаксис Intel x86 ассемблера

Поддерживаются стандартные команды: MOV, ADD, SUB, MUL, DIV, CMP, JMP, Jcc (условные переходы), LOOP и т.д.

Работа с регистрами: AX, BX, CX, DX, SI, DI, BP, SP

Сегментные регистры: CS, DS, ES, SS

Особенности синтаксиса:

ВАЖНО: Обращение к переменным БЕЗ квадратных скобок

Правильно: mov ax, variable

Неправильно: mov ax, [variable]

Для записи в переменную: mov variable, ax

Нет поддержки сложной адресации (регистр + константа)

Нельзя: MOV WORD PTR [RES+2], DX

Индексация массивов ограничена

Размерности данных:

Поддерживаются байтовые (DB) и словные (DW) переменные

Для работы с 8-битными переменными в 16-битных операциях:

text
mov al, byte_var
cbw               ; расширяем AL до AX
mov bx, ax        ; теперь можно использовать в 16-битных операциях
Для деления 16-битных чисел требуется обнулить DX: mov dx, 0 перед div

Организация программы:

Программа начинается с jmp begin для пропуска области данных

Область данных объявляется до кода

Программа должна заканчиваться меткой завершения:

text
finish:
    jmp finish ;$E
Ограничения и особенности
Арифметические операции:

Умножение: mul для беззнакового, imul для знакового

Деление: div для беззнакового, idiv для знакового

При делении 16-битного числа делимое должно быть в DX:AX

Перед делением нужно обнулить DX: mov dx, 0

Работа со стеком:

Поддерживаются PUSH и POP

Стек используется для временного хранения значений

Условные переходы:

Поддерживаются стандартные условия: JE, JNE, JG, JL, JGE, JLE, JA, JB и т.д.

Для знаковых сравнений используйте: JG, JL, JGE, JLE

Для беззнаковых сравнений используйте: JA, JB, JAE, JBE

Циклы:

Команда LOOP использует CX как счетчик

LOOP уменьшает CX на 1 и переходит если CX ? 0

Практические примеры паттернов
1. Извлечение цифр из числа:

text
mov ax, number
mov bx, 10
mov dx, 0
div bx          ; DX = последняя цифра, AX = остаток
2. Проверка на четность:

text
test al, 1      ; проверяем младший бит
jz even         ; если 0 - четное
; нечетное
3. Формирование числа из цифр:

text
mov res, 0
; для каждой цифры:
mov ax, res
mov bx, 10
mul bx          ; res * 10
add ax, digit   ; + новая цифра
mov res, ax
4. Работа с байтовыми переменными в 16-битных операциях:

text
mov al, byte_var
cbw            ; расширяем AL до AX
; теперь AX можно использовать в 16-битных операциях
Распространенные ошибки
Использование квадратных скобок для доступа к переменным

Забыть обнулить DX перед делением

Путать знаковые и беззнаковые операции сравнения и деления

Не учитывать ограничения на адресацию (регистр+константа)

Неправильное расширение 8-битных значений до 16-битных

Структура корректной программы
text
jmp begin

; Область данных
var1 dw 1234
var2 db 10
result dw 0

begin:
    ; Код программы
    mov ax, var1
    ; ... обработка ...
    mov result, ax
    
finish:
    jmp finish ;$E
Тестирование
Программа должна проходить все тестовые случаи

Учитывать пограничные значения

Проверять корректность работы с разными размерами данных

Обеспечивать корректное завершение программы




Важное уточнение, что asm86 не поддерживает запись вида регистр + const. запись MOV WORD PTR [RES+2], DX будет некорректна.


Вот условие задачи:





Из целого четырёхзначного числа a получить новое, состоящее из нечётных цифр числа а. Числа задаются в десятичной системе.

Название	Размерность	Тип
a
res	16
16	вход
выход

Пример:
На входе
a: 1234
На выходе
res: 13


______________________
my profile
Кирилл Басюль

Темы: 0
Сообщений: 43

Мой профиль
Задача - https://dl.gsu.by/task.jsp?nid=2503417&cid=1410


ChatGPT 5.2 - решил с первого раза

DeepSeekR1 - Не успевает решить за 25 секунд(ограничение dl.ai)

MetaLlama3170B - не смогла решить за 1 промпт Решил только 1 тест

Mixtral8x22b - не решил за 1 промпт Решил только 1 тест





Промпт:

вот пример программ на asm86:
1:
<code>
JMP BEGIN
IN_STR DB 'ABCDEAA'
RES DW 0

BEGIN:
    ; подсчет длины строки
    LEA BX,IN_STR
    MOV CX,0
    MOV BP,0
    DEC BX
    MOV AL,'#'
LEN: INC BX
    INC CX
    CMP AL,[BX]
    JNE LEN

    ; цикл подсчета гласных
    DEC CX
    JZ FIN
    DEC BX
CIKL: MOV AL,[BX]
    CMP AL,'A'
    JE INCA
    CMP AL,'O'
    JE INCA
    CMP AL,'E'
    JE INCA
    CMP AL,'I'
    JE INCA
    CMP AL,'U'
    JE INCA
    DEC BX
    LOOP CIKL
    JMP FIN
INCA: INC BP
    DEC BX
    JMP CIKL
FIN: MOV RES,BP

HALT: JMP 0
<code>


Пример решения 2:
<code>
jmp begin
a	dw 4
b	dw 2
c	db -1
d	db 2
res	dw 0

begin:
	mov al,	-1
	cbw
	imul c
	cmp b, ax
	jne vetka



	mov ax,	-1
	imul a
	imul b	 ;ax=-a*b
	mov bx, ax ;bx = -a*b

	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ;ax = c*d

	sub bx, ax ;bx = -a*b-c*d
	mov ax, 0

	mov ax, a    ;ax =a
	cwd
	mov cx, ax     ;cx = ax
	mov al, c
	cbw	       ;ax = c
	mov sp, ax
	mov ax, cx
	idiv sp ;ax = ax/sp = a/c
	add bx, ax ;bx = -a*b-c*d+a/c
	mov ax, b
	cwd
	mov sp, ax
	mov al,	d
	cbw
	mov cx, ax
	mov ax, sp
	idiv cx ;ax = b/d
	add bx, ax ;-a*b-c*d+a/c+b/d
	mov res, bx
	jmp halt

vetka:
	mov ax, a
	add ax,b ;ax = a+b
	imul a	  ;else fix here
	imul b	  ;ax = (a+b)*a*b
	mov bx, ax  ;bx = ax
	mov al, c
	cbw
	mov cx, ax
	mov al, d
	cbw
	imul cx ; ax=c*d
	imul bx ; ax = (a+b)*a*b*c*d
	cwd
	mov cx, ax  ;cx = ax
	mov al, c
	cbw
	mov bx, ax; bx= ax = c
	mov al,	d
	cbw
	sub bx, ax; bx = ax = c-d
	mov ax, cx
	idiv bx
	mov res, ax
	jmp halt

halt:
	jmp halt;$E
<code>


Пример решения 3:
<code>
	jmp begin
a	dw 4
b	dw 2
c	db -10
d	db 3
res	dw 0
begin:
	mov ax, a
	cmp ax,	-2
	jle vetka
	cmp ax,	5
	jge vetka

	mov ax,a
	imul b
	imul b
	mov bx,	ax
	mov al,	c
	cbw
	imul ax
	mov cx ,ax  ;cx	= c^2
	mov al,c
	cbw
	imul cx ;ax = c^3
	imul bx
	mov cx, ax ;cx=a*b^2*c^3    ;norm

	mov bx, b  ;2chapter
	mov al, c
	cbw
	imul ax
	imul bx	  ;ax = b*c^2
	mov bx, 0
	mov bx, ax
	mov al, d
	cbw
	imul ax
	mov sp, ax;sp = d^2
	mov al, d
	cbw
	imul sp ;ax = d^3
	mov sp,	ax
	mov ax, bx
	imul sp		;ax = b*c^2*d^3
	add cx, ax ;cx = a*b^2*c^3+b*c^2*d^3 ;norm

	mov ax, a
	imul a
	imul a
	idiv b
	cwd
	idiv b
	cwd
	mov bx, ax
	mov al, c
	cbw
	mov sp, ax
	mov ax, bx
	idiv sp
	sub cx, ax
	mov res, cx
	jmp ends

vetka:
	mov bx, a
	add bx, b
	mov al, c
	imul d
	add bx, ax  ;bx = (a+b+c*d)
	mov ax, 0
	mov ax, bx ; ax = (a+b+c*d)
	mov bx, 0
	mov bx, a
	sub bx, b
	mov cx, ax   ;cx = a+b+c*d
	mov al, c
	imul d
	sub bx, ax
	mov ax, cx
	cwd
	idiv bx
	mov res, ax
	jmp ends

ends:
	jmp ends;$E
<code>

уточнения: 
1. Для работы с 8-битными переменными надо загрузить их в 16-битный регистр по принципу:
mov al, x
cbw
mov bx, ax

2. Программа должна заканчиваться Ends: jmp Ends;$E





Синтаксис и команды:

Используется синтаксис Intel x86 ассемблера

Поддерживаются стандартные команды: MOV, ADD, SUB, MUL, DIV, CMP, JMP, Jcc (условные переходы), LOOP и т.д.

Работа с регистрами: AX, BX, CX, DX, SI, DI, BP, SP

Сегментные регистры: CS, DS, ES, SS

Особенности синтаксиса:

ВАЖНО: Обращение к переменным БЕЗ квадратных скобок

Правильно: mov ax, variable

Неправильно: mov ax, [variable]

Для записи в переменную: mov variable, ax

Нет поддержки сложной адресации (регистр + константа)

Нельзя: MOV WORD PTR [RES+2], DX

Индексация массивов ограничена

Размерности данных:

Поддерживаются байтовые (DB) и словные (DW) переменные

Для работы с 8-битными переменными в 16-битных операциях:

text
mov al, byte_var
cbw               ; расширяем AL до AX
mov bx, ax        ; теперь можно использовать в 16-битных операциях
Для деления 16-битных чисел требуется обнулить DX: mov dx, 0 перед div

Организация программы:

Программа начинается с jmp begin для пропуска области данных

Область данных объявляется до кода

Программа должна заканчиваться меткой завершения:

text
finish:
    jmp finish ;$E
Ограничения и особенности
Арифметические операции:

Умножение: mul для беззнакового, imul для знакового

Деление: div для беззнакового, idiv для знакового

При делении 16-битного числа делимое должно быть в DX:AX

Перед делением нужно обнулить DX: mov dx, 0

Работа со стеком:

Поддерживаются PUSH и POP

Стек используется для временного хранения значений

Условные переходы:

Поддерживаются стандартные условия: JE, JNE, JG, JL, JGE, JLE, JA, JB и т.д.

Для знаковых сравнений используйте: JG, JL, JGE, JLE

Для беззнаковых сравнений используйте: JA, JB, JAE, JBE

Циклы:

Команда LOOP использует CX как счетчик

LOOP уменьшает CX на 1 и переходит если CX ? 0

Практические примеры паттернов
1. Извлечение цифр из числа:

text
mov ax, number
mov bx, 10
mov dx, 0
div bx          ; DX = последняя цифра, AX = остаток
2. Проверка на четность:

text
test al, 1      ; проверяем младший бит
jz even         ; если 0 - четное
; нечетное
3. Формирование числа из цифр:

text
mov res, 0
; для каждой цифры:
mov ax, res
mov bx, 10
mul bx          ; res * 10
add ax, digit   ; + новая цифра
mov res, ax
4. Работа с байтовыми переменными в 16-битных операциях:

text
mov al, byte_var
cbw            ; расширяем AL до AX
; теперь AX можно использовать в 16-битных операциях
Распространенные ошибки
Использование квадратных скобок для доступа к переменным

Забыть обнулить DX перед делением

Путать знаковые и беззнаковые операции сравнения и деления

Не учитывать ограничения на адресацию (регистр+константа)

Неправильное расширение 8-битных значений до 16-битных

Структура корректной программы
text
jmp begin

; Область данных
var1 dw 1234
var2 db 10
result dw 0

begin:
    ; Код программы
    mov ax, var1
    ; ... обработка ...
    mov result, ax
    
finish:
    jmp finish ;$E
Тестирование
Программа должна проходить все тестовые случаи

Учитывать пограничные значения

Проверять корректность работы с разными размерами данных

Обеспечивать корректное завершение программы




Важное уточнение, что asm86 не поддерживает запись вида регистр + const. запись MOV WORD PTR [RES+2], DX будет некорректна.


Вот условие задачи:

Дано 16-битное число n > 0. Удалить из его десятичного представления все нули и результат поместить в 16-битную переменную z.





______________________
my profile
Кирилл Басюль

Темы: 0
Сообщений: 43

Мой профиль
Задача - https://dl.gsu.by/task.jsp?nid=2503411&cid=1410


ChatGPT 5.2 - решил с первого раза. Модель очень прокачалась и сейчас явно лучше DeepSeek

DeepSeekR1 - не решил с первого промпта

Рекомендую для будущей системы "не знаю" использовать GPT 5.2 api. Модель очень мощная и в моих случаях она почти с первого раза может написать сложные системы. Так же она сама предусматривает ошибки и, в отличии от DeepSeek, исследует github, документацию и прочее в реальном времени

Промпт не отличается от прошлого
______________________
my profile
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2
Time:0,065