|
|
  |
программа для i8086, поможете написать курсовую? |
|
|
|
Sep 2 2010, 17:51
|
Профессионал
    
Группа: Свой
Сообщений: 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 ) Вас спасет. Работает даже под Линуксом
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 18:31
|
Guests

|
Цитата 100% DOS'овских программ, работающих по прерываниям с СОМ-портом обращались напрямую с железом... Я же Вам говорю - не 100%. Когда-то специально писал для заказчиков программы для работы с компортом через BIOS, зная что эксплуатировать их будут долго, а переписывать - никто не будет... Уже и DOS давно отвалилась, и железный COM давно поменяли на USB-переходник, а местами, вообще, сэмулировали через эзернет и/или интернет... А программки эти до сих пор периодически используют, потому как им все эти новшества глубоко "по барабану".
|
|
|
|
|
Sep 4 2010, 07:35
|

Частый гость
 
Группа: Участник
Сообщений: 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
--------------------
на любой элемент найдется мощность, которая его сожжет.
|
|
|
|
|
Sep 4 2010, 09:09
|

Частый гость
 
Группа: Участник
Сообщений: 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
--------------------
на любой элемент найдется мощность, которая его сожжет.
|
|
|
|
Guest_@Ark_*
|
Sep 4 2010, 11:37
|
Guests

|
Могу Вам дать несколько рекомендаций чисто по написанию программ на Asm. Не пишите сразу много кода - иначе найти то, что работает не так, как Вы думаете, будет сложно. Пишите небольшими порциями, добавляя их программу, и после этого каждый раз компилируя и проверяя как это работает.
В данном случае, можно начать с ввода-вывода на экран. Первоначально программа должна просто вводить символы и корректно выводить их на экран, и все. По клавише Enter - пока должно происходить завершение программы и выход из нее. Следующим шагом добавляете сохранение символов в буфере в процессе ввода. После завершения ввода нужно вывести его содержимое на экран, чтобы проверить все ли сделано правильно. Далее можно добавить обработку введенных символов из буфера, его преобразование и вывод уже в шестнадцатеричной форме. Сделайте все пока только для одного числа. Далее переходите к выделению и обработке уже трех чисел. Далее добавляете сравнение и сортировку по возрастанию...
После добавления каждой порции кода, нужно также добавлять дополнительный отладочный вывод на экран промежуточных результатов. Обязательно компилировать и смотреть как это работает. Тогда будете видеть, все ли сделано правильно.
Не переходите к следующему шагу добавления очередной порции кода, пока не добьетесь того, чтобы программа заработала именно так, как Вы задумали, и у Вас было бы полное понимание как это работает. Если возникли какие-то сомнения в правильности - нужно вернуться на шаг или на два назад, на сколько нужно.
P.S. Кстати, коды для завершения программы Вы вставили, но управление на них нигде не передается, даже метки нет...
|
|
|
|
|
Sep 6 2010, 07:34
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(skef @ Sep 5 2010, 17:55)  алгоритм работы программы я себе вполне ясно представляю. но с этим ассемблером у меня проблемы. в первом куске кода все вроде бы нормально (то, что вместо call и ret у меня система jmpов ничего преступного не означает - прога работает как запланировано), Оно никак не работает - данные никуда не заносятся, а это и есть основная работа этой части программы. Пока у вас с алгоритмом обстоит на уровне - - Хочу построить автомобиль, уже все есть (руль и колеса), остались некоторые мелочи. Вот только с отверткой и гаечным ключом проблемы - не знаю с какой стороны за них браться. Изложите алгоритм
|
|
|
|
|
Sep 6 2010, 14:32
|
Гуру
     
Группа: Свой
Сообщений: 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 В каких регистрах и флагах что расположить (а так же реализацию сортировки и вывода) оставляю в качестве упражнения
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|