|
программа для i8086, поможете написать курсовую? |
|
|
|
 |
Ответов
(1 - 61)
|
Sep 1 2010, 09:34
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата на ассемблере. TASM+TLINK
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Sep 1 2010, 10:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (skef @ Sep 1 2010, 12:09)  на ассемблере. Ну тогда действительно tasm/tasm32 3.1 - для реалмодовых самое то. Естественно tlink/tlink32 ему в комплект. QUOTE но пока не понимаю как в нем работать. Книжечку в библиотеке взять, хелпы к борладу почитать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Guest_@Ark_*
|
Sep 1 2010, 10:50
|
Guests

|
Цитата нифига не понятно. Может лучше готовый курсовик поискать?
|
|
|
|
|
Sep 2 2010, 08:20
|

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

|
как отображать то, что я набираю с клавиатуры? и еще необходимо проверять, не введен ли пробел пытался делать это так: int 16h ; Читаем код нажатой клавиши, результат в ax mov al,ax ;пересылаем ax в al============здесь компилятор сообщает об ошибке int 29h ; Выводим al cmp ax, ' ' ; введенный символ - пробел? jz main ;если да, уйти на мейн
Сообщение отредактировал skef - Sep 2 2010, 08:21
--------------------
на любой элемент найдется мощность, которая его сожжет.
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 08:58
|
Guests

|
...
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 09:13
|
Guests

|
... in_out: mov ah,0 ; Ожидаем нажатия и int 16h ; читаем код клавиши mov bl,al ; Сохраняем код mov ah,0eh ; Выводим символ int 10h ; на экран cmp bl,' ' ; Если не нажата клавиша jne in_out ; пробел, повторяем ввод ...
|
|
|
|
|
Sep 2 2010, 09:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (skef @ Sep 2 2010, 10:38)  а так получится? int 16h ; Читаем код нажатой клавиши А Вы уверены, что именно читаете? а AH что? А Вы уверены, что клавиша вообще нажата? QUOTE mov bl,al ;пересылаем из al в bl mov ax,bx ;пересылаем из bx в ax Совершенно нелепые действия. QUOTE int 29h ; Выводим ax AX? Да ну? QUOTE cmp ax, ' ' ;нажатая кнопка - ПРОБЕЛ? Круто, но что у Вас в AX? В в AH скорее всего мусор, но по любому AX не 0x20 Вообще-то все это почти хаотичный набор букв
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 10:08
|
Guests

|
Цитата Вообще-то все это почти хаотичный набор букв zltigo, ну что Вы издеваетесь над бедным студентом.  Он сам не понимает, что пишет. И вряд ли поймет при таком подходе к делу. Сразу предлагал ему поискать готовый курсовик...
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 10:55
|
Guests

|
Цитата мне надо написать с 0 и до работующего по заданию. Вы даже задание не огласили... А ввод-вывод я Вам написал в сообщении №21. Пользуйтесь.
|
|
|
|
|
Sep 2 2010, 11:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (@Ark @ Sep 2 2010, 12:08)  zltigo, ну что Вы издеваетесь над бедным студентом. Слегка раззадорить - да, издеваться - нет. Задание, конечно, получить надо, но вообще-то скорее всего там банальщина к ASM имеющая 10-е отношение - несколько BIOS/DOS вызовов  . QUOTE (dimka76 @ Sep 2 2010, 13:03)  MASM посмотрите Не стоит - TASM таки солиднее, а в IDEAL mode, действительно близок к идеалу.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 12:22
|
Guests

|
Цитата Также очень внимательно посмотрите описание ДОС'овских прерываний, что через что передается и получается. На самом деле, досовские функции для этой задачи нафиг не нужны, кроме одной - для корректного выхода из программы. Для завершения программы поставьте в конце две инструкции: mov ax,4c00h ; Установка кода фунции и кода выхода из программы int 21h ; Завершение работы программы и выход в DOS и на этом про DOS можно забыть. Для ввода/вывода лучше пользоваться функциями BIOS, как показно в приведенном мною выше примере. Ну а обработку данных, я думаю, студент сам в состоянии осилить, если говорит что писАл на ассемблерах...
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 13:06
|
Guests

|
Цитата Сможете обосновать? DOS, также предоставляет функции ввода-вывода на терминал. Студенту рекомендую с ними познакомиться. Но, насколько я смутно помню из своего немалого опыта, геморроя с ними всегда было больше, чем удобства. Впрочем, как говориться, на любителя. Основной недостаток этих функций - недостаточная гибкость. Не все можно через них ввести и вывести, так как это нужно, в отличие от функций BIOS.
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 13:25
|
Guests

|
Цитата А насколько я помню, ДОС обеспечивал как раз комфортную прослойку и минимизировал количество глюков как раз при вводе-выводе. Спорное утверждение. Понятие о комфортности, видимо, у нас с вами несколько различаются... Цитата Могу ошибаться, но программы, написанные без использования прерываний BIOS работают без глюков под виндой и сегодня. Видимо, в виду своей большей универсальности в приложении к операционкам фирмы Microsoft. Программы, корректно написанные под DOS, нормально и без глюков работают со всей линейкой DOS-Windows. У меня одна такая до сих пор используется. Кроме функций DOS, которые используются только для обращения к файловой системе, в ней используются обращения к функциям BIOS: для ввода/вывода на экран, для работы с COM-портом, для работы с сиcтемным таймером, и так далее... Все это работает нормально и без единого глюка на всей линейке операционных систем от DOS 3.0 до Windows Vista включительно.
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 13:41
|
Guests

|
Цитата Поопросный режим работы с СОМ-портом - очень ненадежно. Зависит от используемого протокола,... и используемого программиста.
|
|
|
|
|
Sep 2 2010, 13:55
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Цитата(@Ark @ Sep 2 2010, 17:25)  Программы, корректно написанные под DOS, нормально и без глюков работают со всей линейкой DOS-Windows. Свежо придание. Куча программ очень хорошо и исправно работала под досом. Соответственно, корректно были написаны. Под виндой не работают или работают с серьезными глюками. С точки зрения видны, они, конечно, написаны некорректно. Так вот возвращаясь к понятию «комфорта». Под комфортом я как раз и имел в виду легкость, с которой достигалась эта корректность. Да и зачем тут спорить, не понимаю.
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 14:04
|
Guests

|
Цитата Да и зачем тут спорить, не понимаю. Видимо, не только понятия комфорта, но и корректности написания у нас с вами не совпадают. Вот достал сейчас давно забытый Нортон Коммандер. Запустил. Замечательно работает из под XP. И ни каких проблем. Потому, что корректно написан.
|
|
|
|
|
Sep 2 2010, 14:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
А вы откройте, например, Norton Disk Editor. «Приложение произвело попытку прямого доступа к жесткому диску, что недопустимо. При работе приложения возможны ошибки. ...» Видимо, написан дураками. Это только маленький пример. Можно много привести. Демки разные с низкоуровневым вводом-выводом. Винда либо не позвляет, либо умирает. Иногда все здорово, когда корректно «попроще» написано. У нас с вами, действительно, не совпадают понятия. Все люди разные, ничего страшного в этом не вижу.
|
|
|
|
Guest_@Ark_*
|
Sep 2 2010, 14:28
|
Guests

|
Цитата У нас с вами, действительно, не совпадают понятия. Прикладной программе, работающей под ОС, лезть на прямую к "железу" практически всегда некорректно. Если только речь не идет о специальных утилитах для тестирования. Работать же через официально предоставленные интерфейсы - как DOS, так и BIOS - всегда корректно. Все "кривые" досовские программы давно померли, а корректные - успешно дожили до висты. Если у Вас свои представления о корректности, то я в этом не виноват.
|
|
|
|
|
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 В каких регистрах и флагах что расположить (а так же реализацию сортировки и вывода) оставляю в качестве упражнения
|
|
|
|
|
Sep 15 2010, 15:03
|
Группа: Новичок
Сообщений: 8
Регистрация: 10-09-10
Пользователь №: 59 413

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