Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: программа для i8086
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
skef
после сравнений с клавишами ентер и пробел, вставил:
CODE

;Ввод числа в виде строки
MOV AH,0AH ;в AH номер функции
LEA DX,BUF ;DS:DX адрес буфера для ввода
INT 21H

;Перевод строки в число, результат в DI
MOV DI,0
LEA BX,BUF+1 ;в BX адрес второго элемента буфера
MOV CX,[BX] ;в CX количество введенных символов
XOR CH,CH
MOV SI,1 ;в SI множитель
MET:
PUSH SI ;сохраняем SI (множитель) в стеке
MOV SI,CX ;в SI помещаем номер текущего символа
MOV AX,[BX+SI];в AX помещаем текущий символ
XOR AH,AH
POP SI ;извлекаем множитель (SI)из стека
SUB AX,30H ;получаем из символа (AX) цифру
MUL SI ;умножаем цифру (AX)на множитель (SI)
ADD DI,AX ;складываем с результирующим числом
MOV AX,SI ;помещаем множитель (SI) в AX
MOV DX,10
MUL DX ;увеличиваем множитель (AX) в 10 раз
MOV SI,AX ;перемещаем множитель (AX) азад в SI
LOOP MET;переходим к предыдущему символу

и перед мейном buf db 05,00,05 dup (' ') ;буфер ввода
теперь думаю, как их соеденить,
нужно ли перед входом в эту "часть программы" сохранять значения регистров (в стеке)?
и при нажатии спейса надо будет обнулять еще много чего...

устал от ассемблера. осталась всего неделя. проникнулся уважение к 8-разрядным микроконтроллерам.
@Ark
Могу Вам дать несколько рекомендаций чисто по написанию программ на Asm.
Не пишите сразу много кода - иначе найти то, что работает не так, как Вы думаете, будет сложно.
Пишите небольшими порциями, добавляя их программу, и после этого каждый раз компилируя
и проверяя как это работает.

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

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

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

P.S. Кстати, коды для завершения программы Вы вставили, но управление на них нигде не передается,
даже метки нет...
skef
я так и делал. до вставки вычисления числа программа выводила введенные символы, при нажатии
пробела делала одно, при нажатии ентера - другое. если не нажато не то, не другое - третье
(это "скелет" программы) к тому же это не много кода, это что осталось после удаления всего лишнего.
но пока сложности с вычислением введенного числа. вставки чужого кода на асме это ужас.
выход после ентера пока не реализован, но по написании программы там будет вывод значений и выход.
XVR
В вашем коде есть что то итальянское - очень на спагетти похож wink.gif Добавление 2го куска кода сделало это все похожим на пиццу со спагетти smile.gif
Не надо так делать.

Разбейте вашу программу на логические куски и закодируйте ее в виде последовательности вызовов (в виде call ...). Определитесь что и как вы будете передавать каждой подпрограмме. Потом начинайте писать отдельные подпрограммы (они тоже могут вызывать другие подпрограммы)

Да, прежде всего напишите алгоритм, что и как должно делаться (можно просто на русском языке). Попытки сочинить алгоритм на ходу (в процессе написания программы) ни к чему хорошему не приведут
skef
алгоритм работы программы я себе вполне ясно представляю. но с этим ассемблером у меня проблемы.
в первом куске кода все вроде бы нормально
(то, что вместо call и ret у меня система jmpов ничего преступного не означает - прога работает как запланировано),
второй кусок я пока удалил, не до него сейчас, надо запустить пока хотя бы в десятичном виде
пока думаю, как организовать массив (в примерах ничего не понятно. как его инициализировать,
как заносить в него числа и как к ним потом обращаться)
XVR
Цитата(skef @ Sep 5 2010, 17:55) *
алгоритм работы программы я себе вполне ясно представляю. но с этим ассемблером у меня проблемы.
в первом куске кода все вроде бы нормально
(то, что вместо call и ret у меня система jmpов ничего преступного не означает - прога работает как запланировано),
Оно никак не работает - данные никуда не заносятся, а это и есть основная работа этой части программы.
Пока у вас с алгоритмом обстоит на уровне -
- Хочу построить автомобиль, уже все есть (руль и колеса), остались некоторые мелочи. Вот только с отверткой и гаечным ключом проблемы - не знаю с какой стороны за них браться.

Изложите алгоритм
skef
1) программа стартует. выводит надпись "введите числа?"
2) пользователь вводит строку. нажимает пробел
(записывает вводимые числа в массив А)
3) при вводе пробела программа переводит число в строку
(перебираем массив A, умножаем элементы массивы на
соответвующие коэффициенты (10,100,1000 и т.д.), суммируем
получаем значение введенного числа, заносим в массив Б)
4) перевод курсора на следующую строку, ожидание сл.строки
(аналогично п.3)
5) пользователь вводит все числа, нажимает ентер.
(начинается сортировка массива Б по возрастанию
и вывод элементов массива)
6) завершение работы программы
XVR
Это не совсем алгоритм - это описание работы программы с точки зрения пользователя. Но для начала и так сойдет.
Вопросы:
1) По пробелу программа ДЕЙСТВИТЕЛЬНО должна переводить строку? Или все же вводить все в одну строку?
2) Что должна делать программа, если пользователь ввел не число и не пробел?
3) Нужна ли возможность редактировать строку в процессе ввода?

Реализация - напишите реализацию алгоритма на каком нибудь псевдо языке, потом переводите его в ассемблер
skef
1) не должна. можно вводить в одну строку.
2) ничего не делать, ждать слудующего символа.
3) нет, не нужна.

что тактое псевдоязык, и зачем на нем писать, если потом все-равно придется писать на ассме - и опять те же проблемы встанут.
XVR
Цитата(skef @ Sep 6 2010, 12:39) *
1) не должна. можно вводить в одну строку.
В таком случае можно воспользоваться функцией DOS'а (как в вашем 2м куске кода) - она введет всю строку сама

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

Например:
Код
Ввести строку (0A int 21h)
dst_index = 0
цикл
пропустить до цифры
если конец строки - выйти из цикла
прочесть цифры
записать в dst[dst_index]
увеличить dst_index
повторить
отсортировать dst[0 до dst_index-1]
цикл по i от 0 до dst_index-1
напечатать в hex dst[i]
повторить
exit

пропустить до цифры:
цикл
если достигнут конец массива с символами - выйти с флагом 'конец строки'
если текущий символ цифра - выйти
пропустить текущий символ
повторить

прочесть цифры:
ret = 0
цикл
если достигнут конец массива с символами - выйти из цикла
если текущий символ не цифра - выйти из цикла
ret = ret * 10 + (<текущий символ> - <код цифры '0'>)
пропустить текущий символ
повторить
вернуть ret
В каких регистрах и флагах что расположить (а так же реализацию сортировки и вывода) оставляю в качестве упражнения laughing.gif

Hlad
Вставлю свои пять копеек
а). По поводу DOS/BIOS - если не пользоваться недокументированными функциями DOS - то никаких глюков не будет. BIOS действительно более гибок, но топикстартеру не нужны такие возможности, как вывод текста в произвольном месте произвольным цветом буква и фона. Так что прерывание 21h рулит smile.gif
б). Есть такая книжка, Зубков "Программирование на языке Ассемблера" - почитайте, в интернете в куче мест валяется в виде CHM-файла, там куча примеров.
в). Насчет ввести строку - по мне, исходя из постановки задачи, гораздо эффективнее читать побуквенно. То есть -
1. Запуск. Сброс используемых регистров, вывод приветственных надписей
2. Вызов функции 01h 21-го прерывания/ Здесь читается символ с клавиатуры. С эхом (то есть он появится на экране)
3. Если символ - цифра, то умножаем значение CX на 10 (на первом шаге там должен быть ноль) и прибавляем нашу цифру. Как символ в цифру превратить - писать? Если символ - пробел, то пишем в СХ 0, и переходим к шагу 5. Если символ - CR, то переходим к шагу 6
4. Переходим к шагу 2
5. Сюда мы попадаем, если прочитан пробел. Заносим число из CX в массив. Обнуляем СХ и переходим к шагу 2.
6. Сюда мы попадаем, если нажат Enter. Сортируем массив.
7. Переводим числа в 16-ричную систему (там довольно просто)
8. Выводим на экран
9. Бежим обмывать отметку.

АНТОН КОЗЛОВ
Можно для 86-го процессора все на борланд-паскале компилировать. Ассемблерные вставки есть. Для i-7188 и rtu186 лучше не найти. Кстати, турбо-паскаль 5.5 на русском языке.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.