Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: программа для i8086
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
skef
в каких программах (компиляторах) можно написать программу для процессора i8086?
zltigo
QUOTE (skef @ Sep 1 2010, 11:49) *
в каких программах (компиляторах) можно написать программу для процессора i8086?

Если Cи, то полагаю, оптимален Watcom. Ну, или любой борлондячий.
skef
на ассемблере.
нашел какой-то TASM и турбо дебаггер от борланд, но пока не понимаю как в нем работать.
Andron_
в блокноте)

а потом по табличке в машинные коды перевести :D
skripach
Цитата
на ассемблере.

TASM+TLINK
vvs157
Цитата(skef @ Sep 1 2010, 13:09) *
на ассемблере.
нашел какой-то TASM и турбо дебаггер от борланд, но пока не понимаю как в нем работать.
TASM - это консольный ассемблер, без интерфейса. Натравливаете его на файл - он его и компиллирует в .OBJ. Чтобы получить бинарный файл - нужен еще и линкер. TD - это только отладчик. Если нужна среда разработки - то ищите старый ДОСовский C или С++ от Борлада.
zltigo
QUOTE (skef @ Sep 1 2010, 12:09) *
на ассемблере.

Ну тогда действительно tasm/tasm32 3.1 - для реалмодовых самое то. Естественно tlink/tlink32 ему в комплект.
QUOTE
но пока не понимаю как в нем работать.

Книжечку в библиотеке взять, хелпы к борладу почитать.
skef
нифига не понятно.
в папке tasm.exe, tlink.exe, td.exe.
как в турбо дебаггере файл создать?
или как скормить ему .асм - файл?
@Ark
Цитата
нифига не понятно.

Может лучше готовый курсовик поискать?
x736C
Дебагеру скармливаются исполняемые файлы. Сперва необходимо скомпилировать и скомпоновать линкером.
Из коммандной строки. Например так:
c:\tasm\bin\tasm32 hellow.asm
c:\tasm\bin\tlink hellow.obj /t
MrYuran
TASM FAQ
Ну и вообще, смелее используйте поисковики
skef
cheers.gif
Спасибо! Началось что-то получаться!
Deka
А ещё есть неплохой сайт WASM
zltigo
QUOTE (Deka @ Sep 1 2010, 20:59) *
А ещё есть неплохой сайт WASM

Это несколько из другой оперы - protected mode и winapi. Тут на банальном 8086 учебная задача поставлена.
skef
laughing.gif
как отображать то, что я набираю с клавиатуры?
и еще необходимо проверять, не введен ли пробел
пытался делать это так:

int 16h ; Читаем код нажатой клавиши, результат в ax
mov al,ax ;пересылаем ax в al============здесь компилятор сообщает об ошибке
int 29h ; Выводим al
cmp ax, ' ' ; введенный символ - пробел?
jz main ;если да, уйти на мейн
Sergei_Ilchenko
>> mov al,ax ;пересылаем ax в al============здесь компилятор сообщает об ошибке

ax - регистр 16-ти битовый и "состоящий" из ah и al - 8-ми битовых регистров.

пытаетесь в 8 бит записать 16...
skef
а так получится?
int 16h ; Читаем код нажатой клавиши
mov bl,al ;пересылаем из al в bl
mov ax,bx ;пересылаем из bx в ax
int 29h ; Выводим ax
cmp ax, ' ' ;нажатая кнопка - ПРОБЕЛ?
jz main

программа откомпилировалась. однако при запуске выдала не то, что я набирал, а два десятка нулей и собственно все.
AHTOXA
Перед вызовом int 16h надо занести 0 в AH.
@Ark
...
skef
теперь нули не показал. просто после введенного символа выдал окошко с сообщением:

С: \ WINDO WS\system32\cmd. exe
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 10 02 Для завершения работы приложения нажмите кнопку "Закрыть".
@Ark
...
in_out: mov ah,0 ; Ожидаем нажатия и
int 16h ; читаем код клавиши
mov bl,al ; Сохраняем код
mov ah,0eh ; Выводим символ
int 10h ; на экран
cmp bl,' ' ; Если не нажата клавиша
jne in_out ; пробел, повторяем ввод
...
zltigo
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
Вообще-то все это почти хаотичный набор букв sad.gif
@Ark
Цитата
Вообще-то все это почти хаотичный набор букв

zltigo, ну что Вы издеваетесь над бедным студентом. smile.gif Он сам не понимает, что пишет.
И вряд ли поймет при таком подходе к делу. Сразу предлагал ему поискать готовый курсовик...
skef
нашел несколько готовых курсовых. но это все не то. а защищать как же?
мне надо написать с 0 и до работующего по заданию.
по поводу асемблера - приходилось под микроконтроллеры (avr), но с i8086 я не знаком.
@Ark
Цитата
мне надо написать с 0 и до работующего по заданию.

Вы даже задание не огласили...
А ввод-вывод я Вам написал в сообщении №21.
Пользуйтесь.
dimka76
Цитата(skef @ Sep 1 2010, 13:09) *
на ассемблере.
нашел какой-то TASM и турбо дебаггер от борланд, но пока не понимаю как в нем работать.


MASM посмотрите
zltigo
QUOTE (@Ark @ Sep 2 2010, 12:08) *
zltigo, ну что Вы издеваетесь над бедным студентом.

Слегка раззадорить - да, издеваться - нет. Задание, конечно, получить надо, но вообще-то скорее всего там банальщина к ASM имеющая 10-е отношение - несколько BIOS/DOS вызовов sad.gif.

QUOTE (dimka76 @ Sep 2 2010, 13:03) *
MASM посмотрите

Не стоит - TASM таки солиднее, а в IDEAL mode, действительно близок к идеалу.

skef
По запросу программы пользователь вводит с клавиатуры
последовательность целых трехзначных положительных десятичных чисел,
разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит эти же числа на экран в порядке возрастания величины числа,
причем в шестнадцатеричной системе счисления.

и вот как я это собирался сделать:
программа выводит текст введите числа
пользователь вводит числа, они отображаются, преобразуются в шестнадцатиричную форму.
по пробелу они запоминаются (массив). далее пользователь нажимает <Enter>,
и программа вычисляет наименьшее из массива.
далее это число удаляется из массива и вычислятся следующее число.
т.о. выводся в порядке возрастания.
MrYuran
Цитата(skef @ Sep 2 2010, 14:50) *
по поводу асемблера - приходилось под микроконтроллеры (avr), но с i8086 я не знаком.

Ну так для начала хотя бы систему команд надо глянуть, чтобы не копировать регистр сам в себя
VslavX
Цитата(zltigo @ Sep 2 2010, 14:08) *
Не стоит - TASM таки солиднее, а в IDEAL mode, действительно близок к идеалу.

TASM-то солиднее, но TASM умер. Только недавно пришлось переписывать TASM-овый код на MASM - у заказчика объектник не линковался MSVC 2005 - он только COFF кушает, OMF - все, окончательно помер sad.gif. И ничего - ML 8.0 очень даже нормально - со времен 5.0 (современник TASM 3.1) он сильно прибавил , даже с локальными метками разобраться малой кровью получилось. Что хотел сказать-то: изучить TASM приятней, а MASM (ML) - полезней smile.gif.
zltigo
QUOTE (VslavX @ Sep 2 2010, 13:34) *
TASM-то солиднее, но TASM умер.

Ну в данном случае речь идет явно таком-же мертвом "задании" sad.gif. Для написания чего-либо реального на ASM, естественно логичнее пользоваться тем
поддерживается сегодня.


vvs157
Цитата(skef @ Sep 2 2010, 14:50) *
приходилось под микроконтроллеры (avr), но с i8086 я не знаком.
Настоятельно советую очень внимательно ознакомится с синтаксисом классического ассемблера 8086. Обнаружите существенные отличия в идеологии по сравнению с 8-ми битными контроллерами. Также очень внимательно посмотрите описание ДОС'овских прерываний, что через что передается и получается. Не забудьте, что есть еще сегментные регистры.
@Ark
Цитата
Также очень внимательно посмотрите описание ДОС'овских прерываний, что через что передается и получается.

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

mov ax,4c00h ; Установка кода фунции и кода выхода из программы
int 21h ; Завершение работы программы и выход в DOS

и на этом про DOS можно забыть.

Для ввода/вывода лучше пользоваться функциями BIOS, как показно в приведенном мною выше примере.
Ну а обработку данных, я думаю, студент сам в состоянии осилить, если говорит что писАл на ассемблерах...
x736C
Цитата(@Ark @ Sep 2 2010, 16:22) *
Для ввода/вывода лучше пользоваться функциями BIOS

Сможете обосновать?
@Ark
Цитата
Сможете обосновать?

DOS, также предоставляет функции ввода-вывода на терминал. Студенту рекомендую с ними познакомиться.
Но, насколько я смутно помню из своего немалого опыта, геморроя с ними всегда было больше, чем удобства.
Впрочем, как говориться, на любителя. Основной недостаток этих функций - недостаточная гибкость. Не все
можно через них ввести и вывести, так как это нужно, в отличие от функций BIOS.
x736C
А насколько я помню, ДОС обеспечивал как раз комфортную прослойку и минимизировал количество глюков как раз при вводе-выводе.
Могу ошибаться, но программы, написанные без использования прерываний BIOS работают без глюков под виндой и сегодня. Видимо, в виду своей большей универсальности в приложении к операционкам фирмы Microsoft.

В любом случае, новичку порекомендовал бы ограничиться ДОС`ом. Хотя для такого примитива разницы не вижу.
@Ark
Цитата
А насколько я помню, ДОС обеспечивал как раз комфортную прослойку и минимизировал количество глюков как раз при вводе-выводе.

Спорное утверждение. Понятие о комфортности, видимо, у нас с вами несколько различаются...
Цитата
Могу ошибаться, но программы, написанные без использования прерываний BIOS работают без глюков под виндой и сегодня. Видимо, в виду своей большей универсальности в приложении к операционкам фирмы Microsoft.

Программы, корректно написанные под DOS, нормально и без глюков работают со всей линейкой DOS-Windows.
У меня одна такая до сих пор используется. Кроме функций DOS, которые используются только для обращения к
файловой системе, в ней используются обращения к функциям BIOS: для ввода/вывода на экран, для работы
с COM-портом, для работы с сиcтемным таймером, и так далее... Все это работает нормально и без единого глюка
на всей линейке операционных систем от DOS 3.0 до Windows Vista включительно.
vvs157
Цитата(@Ark @ Sep 2 2010, 17:25) *
в ней используются обращения к функциям BIOS:[.....]для работы с COM-портом
Поопросный режим работы с СОМ-портом - очень ненадежно.
@Ark
Цитата
Поопросный режим работы с СОМ-портом - очень ненадежно.

Зависит от используемого протокола,... и используемого программиста. wink.gif
VslavX
Цитата(@Ark @ Sep 2 2010, 16:25) *
Программы, корректно написанные по DOS, нормально и без глюков работают со всей линейкой DOS-Windows.
У меня одна такая до сих пор используется. Кроме функций DOS, которые используются только для обращения к

Судя по всему осталось недолго. У меня недавно умерла последняя программа в формате .com (транслятор локальных меток) - не заработала под Windows 7 - ее просто невозможно запустить - format unsupported. Правда, у меня Home Premium 64-bit (досталась вместе с новым ноутом) . Возможно, версии семерки Professional+ c XP-mode еще поддерживают DOS-программы, но общее направление развития понятно. Еще аналогично померли широкораспространенные досовские bin2hex и hex2bin - перешел на srecord (давно пора).
x736C
Цитата(@Ark @ Sep 2 2010, 17:25) *
Программы, корректно написанные под DOS, нормально и без глюков работают со всей линейкой DOS-Windows.

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

Так вот возвращаясь к понятию «комфорта». Под комфортом я как раз и имел в виду легкость, с которой достигалась эта корректность. Да и зачем тут спорить, не понимаю.
@Ark
Цитата
Да и зачем тут спорить, не понимаю.

Видимо, не только понятия комфорта, но и корректности написания у нас с вами не совпадают. sad.gif
Вот достал сейчас давно забытый Нортон Коммандер. Запустил. Замечательно работает из под XP.
И ни каких проблем. Потому, что корректно написан.
x736C
А вы откройте, например, Norton Disk Editor.
«Приложение произвело попытку прямого доступа к жесткому диску, что недопустимо. При работе приложения возможны ошибки. ...»
Видимо, написан дураками. Это только маленький пример. Можно много привести. Демки разные с низкоуровневым вводом-выводом. Винда либо не позвляет, либо умирает. Иногда все здорово, когда корректно «попроще» написано.
У нас с вами, действительно, не совпадают понятия. Все люди разные, ничего страшного в этом не вижу. smile.gif
@Ark
Цитата
У нас с вами, действительно, не совпадают понятия.

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

Цитата(VslavX @ Sep 2 2010, 17:42) *
Судя по всему осталось недолго. У меня недавно умерла последняя программа в формате .com (транслятор локальных меток) - не заработала под Windows 7
DOSBox ( http://dosbox.com ) Вас спасет. Работает даже под Линуксом
@Ark
Цитата
100% DOS'овских программ, работающих по прерываниям с СОМ-портом обращались напрямую с железом...

Я же Вам говорю - не 100%. Когда-то специально писал для заказчиков программы для работы с компортом
через BIOS, зная что эксплуатировать их будут долго, а переписывать - никто не будет... Уже и DOS давно
отвалилась, и железный COM давно поменяли на USB-переходник, а местами, вообще, сэмулировали через
эзернет и/или интернет... А программки эти до сих пор периодически используют, потому как им все эти
новшества глубоко "по барабану". wink.gif
VslavX
Цитата(vvs157 @ Sep 2 2010, 20:51) *
DOSBox ( http://dosbox.com ) Вас спасет. Работает даже под Линуксом

DOSBox спасает только когда мы с дитенком на нем древний Duna Blaster гоняем (игрулина такая очень старая и коварная, вдвоем играть можно). А упомянутая мной программка это препроцессор исходных текстов, запускается gmake-ом на 8 ядрах, после него разные компиляторы, да вывод всего этого фильтруется перловским скриптом да кидается в MSVC для навигации по ошибкам. Может быть и можно этот колхоз как-то через DOSBox пропустить, только проще оказалось эту последнюю утилиту под Win32 переписать.
vvs157
Цитата(@Ark @ Sep 2 2010, 22:31) *
Когда-то специально писал для заказчиков программы для работы с компортом
через BIOS
Это крайне редкое явление (практически уникальное - ни одна коммерческая программа так не делала) в мире ДОС програм для СОМ порта.
skef
можно поинтересоваться, как последовательно ввести введенные цифры в ОЗУ и вычислить значение введенного числа
(т.е допустим, вводим число 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.