реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> программа для i8086, поможете написать курсовую?
vvs157
сообщение Sep 2 2010, 17:51
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(@Ark @ Sep 2 2010, 18:28) *
Прикладной программе, работающей под ОС, лезть на прямую к "железу" практически всегда
некорректно.
100% DOS'овских программ, работающих по прерываниям с СОМ-портом обращались напрямую с железом. Старое железо без FIFO под ДОСом в поопросном режиме на скорости больше 2400 пропускало байты из-за обращениям к диску. Весь софт, который использовал LPT не по прямому назначению работал напрямую с регистрами. Практически все ДОСовские САПР'ы имели свои драйверы графических плат для ускорения прорисовки сложной графики.

Цитата(VslavX @ Sep 2 2010, 17:42) *
Судя по всему осталось недолго. У меня недавно умерла последняя программа в формате .com (транслятор локальных меток) - не заработала под Windows 7
DOSBox ( http://dosbox.com ) Вас спасет. Работает даже под Линуксом
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 2 2010, 18:31
Сообщение #47





Guests






Цитата
100% DOS'овских программ, работающих по прерываниям с СОМ-портом обращались напрямую с железом...

Я же Вам говорю - не 100%. Когда-то специально писал для заказчиков программы для работы с компортом
через BIOS, зная что эксплуатировать их будут долго, а переписывать - никто не будет... Уже и DOS давно
отвалилась, и железный COM давно поменяли на USB-переходник, а местами, вообще, сэмулировали через
эзернет и/или интернет... А программки эти до сих пор периодически используют, потому как им все эти
новшества глубоко "по барабану". wink.gif
Go to the top of the page
 
+Quote Post
VslavX
сообщение Sep 2 2010, 20:50
Сообщение #48


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(vvs157 @ Sep 2 2010, 20:51) *
DOSBox ( http://dosbox.com ) Вас спасет. Работает даже под Линуксом

DOSBox спасает только когда мы с дитенком на нем древний Duna Blaster гоняем (игрулина такая очень старая и коварная, вдвоем играть можно). А упомянутая мной программка это препроцессор исходных текстов, запускается gmake-ом на 8 ядрах, после него разные компиляторы, да вывод всего этого фильтруется перловским скриптом да кидается в MSVC для навигации по ошибкам. Может быть и можно этот колхоз как-то через DOSBox пропустить, только проще оказалось эту последнюю утилиту под Win32 переписать.
Go to the top of the page
 
+Quote Post
vvs157
сообщение Sep 2 2010, 21:02
Сообщение #49


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(@Ark @ Sep 2 2010, 22:31) *
Когда-то специально писал для заказчиков программы для работы с компортом
через BIOS
Это крайне редкое явление (практически уникальное - ни одна коммерческая программа так не делала) в мире ДОС програм для СОМ порта.
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 4 2010, 07:35
Сообщение #50


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



можно поинтересоваться, как последовательно ввести введенные цифры в ОЗУ и вычислить значение введенного числа
(т.е допустим, вводим число 435, для компьютера это последовательность из 4, 3, 5. как дать процессору понять чтобы он
допустим, 5 умножил на 1, 3 на 10, 4 на 100, сложил бы их и т.о., вычислил бы введенное число.)
или я не совсем понимаю, что мне нужно сделать?
CODE

;По запросу программы пользователь вводит с клавиатуры
;последовательность целых трехзначных положительных десятичных чисел,
;разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
;Программа выводит эти же числа на экран в порядке возрастания величины числа,
;причем в шестнадцатеричной системе счисления.
;======================================================================
.model small ;определили модель памяти как small
.stack 128 ;выделели под программу 128 байт памяти
.data ;объявили сегмент данных
;mess db 'Hi man!$' ;определили переменную типа databyte размером 1 байт
next db '', 0Dh, 0Ah, '$' ;определили переменную типа databyte размером 1 байт
mess db 'vvedite chisla?', 0Dh, 0Ah, '$' ;определили переменную типа databyte размером 1 байт
endpr db 'end program', 0Dh, 0Ah, '$'
;db 0Dh,0Ah,24h
.code ;объявили сегмент кода
main:
;следующими двумя строками мы связываем адрес сегмента данных с его реальным расположением в памяти.
;Это связано с тем, что сегмент кода и сегмент данных расположены по одному и тому же
;адресу в памяти при инициализации программы.
mov ax,@data
mov ds,ax
;следующие три строки кода выводят на экран надпись "'vvedite chisla?"
lea dx,mess
mov ah,09h
int 21h
;================================
in_out:
mov ah,0 ; Ожидаем нажатия и
int 16h ; читаем код клавиши
mov bl,al ; Сохраняем код
mov ah,0eh ; Выводим символ
int 10h ; на экран
cmp bl,' ' ; Если не нажата клавиша
je space ; пробел, повторяем ввод
cmp bl,13 ; это клавиша ENTER?
je enter ; если нажата кнопке ENTER, перейти в подпрограмму ENT
:если не нажаты клавиши пробела и ентера, предполагаем что нажаты
;цифры, и последовательно сохраняем их (наверно, в ОЗУ?)
jmp in_out
;================================
;по нажатию пробел нужно последовательно извлечь все введенные
;цифры и вычислить значение введенного числа в десятичном виде
space:
lea dx,next;перевод на следующую строку
mov ah,09h
int 21h
lea dx,next;перевод на следующую строку
mov ah,09h
int 21h
jmp in_out
;================================
;по нажатию ентера вычислять числа в порядке возрастания,
;преобразовывать их в 16-ричные и выводить
enter:
lea dx,next;перевод на следующую строку
mov ah,09h
int 21h
lea dx,endpr;вместо ендпрограмм должен быть вывод чисел
mov ah,09h
int 21h
jmp in_out
;================================
;собственно последние две строчки корректно завершают программу
mov ax,4c00h
int 21h
end main


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 4 2010, 09:09
Сообщение #51


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



после сравнений с клавишами ентер и пробел, вставил:
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-разрядным микроконтроллерам.

Сообщение отредактировал skef - Sep 4 2010, 10:07


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 4 2010, 11:37
Сообщение #52





Guests






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

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

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

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

P.S. Кстати, коды для завершения программы Вы вставили, но управление на них нигде не передается,
даже метки нет...
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 4 2010, 13:30
Сообщение #53


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



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


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 5 2010, 08:28
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В вашем коде есть что то итальянское - очень на спагетти похож wink.gif Добавление 2го куска кода сделало это все похожим на пиццу со спагетти smile.gif
Не надо так делать.

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

Да, прежде всего напишите алгоритм, что и как должно делаться (можно просто на русском языке). Попытки сочинить алгоритм на ходу (в процессе написания программы) ни к чему хорошему не приведут
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 5 2010, 13:55
Сообщение #55


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



алгоритм работы программы я себе вполне ясно представляю. но с этим ассемблером у меня проблемы.
в первом куске кода все вроде бы нормально
(то, что вместо call и ret у меня система jmpов ничего преступного не означает - прога работает как запланировано),
второй кусок я пока удалил, не до него сейчас, надо запустить пока хотя бы в десятичном виде
пока думаю, как организовать массив (в примерах ничего не понятно. как его инициализировать,
как заносить в него числа и как к ним потом обращаться)


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 6 2010, 07:34
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Изложите алгоритм
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 6 2010, 08:22
Сообщение #57


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



1) программа стартует. выводит надпись "введите числа?"
2) пользователь вводит строку. нажимает пробел
(записывает вводимые числа в массив А)
3) при вводе пробела программа переводит число в строку
(перебираем массив A, умножаем элементы массивы на
соответвующие коэффициенты (10,100,1000 и т.д.), суммируем
получаем значение введенного числа, заносим в массив Б)
4) перевод курсора на следующую строку, ожидание сл.строки
(аналогично п.3)
5) пользователь вводит все числа, нажимает ентер.
(начинается сортировка массива Б по возрастанию
и вывод элементов массива)
6) завершение работы программы


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 6 2010, 08:33
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Это не совсем алгоритм - это описание работы программы с точки зрения пользователя. Но для начала и так сойдет.
Вопросы:
1) По пробелу программа ДЕЙСТВИТЕЛЬНО должна переводить строку? Или все же вводить все в одну строку?
2) Что должна делать программа, если пользователь ввел не число и не пробел?
3) Нужна ли возможность редактировать строку в процессе ввода?

Реализация - напишите реализацию алгоритма на каком нибудь псевдо языке, потом переводите его в ассемблер
Go to the top of the page
 
+Quote Post
skef
сообщение Sep 6 2010, 08:39
Сообщение #59


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



1) не должна. можно вводить в одну строку.
2) ничего не делать, ждать слудующего символа.
3) нет, не нужна.

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


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 6 2010, 14:32
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(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

Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016