i8080 help.

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

Maks
Junior
Posts: 3
Joined: 19 May 2013 13:05
Location: 85.234.168.94

i8080 help.

Post by Maks »

Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере, но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь. Программа должна делать следующее:

Из портов с номерами 47 и 39 ввести по числу. Введённые числа и ещё два числа, которые уже находятся в стеке с вершиной адреса ABCDh сравнить между собой. Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh. С двумя меньшими числами произвести операцию ИСКЛЮЧАЮЩЕЕ ИЛИ и результат вывести в порт 47. Все четыре числа в любом порядке сохранить в памяти с начальным адресом A1B2h.

Для меня главная проблема главным образом заключается в работе со стеком, так как по работе с ним у меня вообще нет никаких знаний. Заранее огромнейшее спасибо.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

А в каком это институте заставляют писать программы для процессоров 1974 года?
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Re: i8080 help.

Post by Lavr »

Maks wrote:Для меня главная проблема главным образом заключается в работе со стеком, так как по работе с ним у меня вообще нет никаких знаний. Заранее огромнейшее спасибо.
Не - ну пиши уж сам...

Со стеком работают так:
LXI SP,ABCDh - так указывают вершину стека.
SPHL - то же, но SP загружаем из HL.

PUSH RP - так заносят регистровую пару в стек и он автоматом сдвигается на 2 вниз.

POP RP- так считывают регистровую пару из стека и он автоматом сдвигается на 2 вверх.
(RP - это HL, DE или BC, но указывают старшую букву)

Можно подвигать сам указатель стека:
INX SP - на 1 вверх,
DCX SP - на 1 вниз.

XTHL - обменивает содержимым слово из верхушки стека и регистровую пару HL

Прочитать сам указатель стека можно так:
LXI H,0000h
DAD SP - в HL будет значение SP.

На мой взгляд для твоей задачи команд достаточно...
Last edited by Lavr on 19 May 2013 14:06, edited 1 time in total.
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Со стеком все просто

1) Установка вершины стека
LXI SP, 0ABCDh

2) Чтение из стека в регистры H и L
POP H

можно еще POP D - это D и E, POP B - это B и C, POP PSW - это A и регистр флагов

2) Запись в стек из регистров H и L
PUSH H

аналогично POP D, POP B, POP PSW

Есть еще команда XTHL, которая работает со стеком, но даже Intel не знает зачем она нужна.
User avatar
Shaos
Admin
Posts: 24099
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов? ;)
А это какая-то дурная задачка... :(
Наверное, в том и засада - сделать это не сломав стека. :lol:

Я её пару раз в сети видел и обратил внимание... но сейчас не нашел навскидку...

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

А уж на перегретый пар - самые бредовые задачи обычно.
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Вообще фразы "Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh." звучат странно.

Странно то, что тут говорится о нескольких стеках. Стек - обычно, это область памяти куда процессор складывает адреса возвратов, значения регистров с помощью PUSH, ну и высокоуровневые ЯП складывают туда локальные переменные.

Стек во время работы программы обычно не меняется! И главное то, что все это уничтожается, после завершения работы программы!

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

Есть еще один вид стека у программистов. Это буфер LIFO (last in first out). То есть взаимосвязь операций чтения и записи.

Тут же говорится по отдельности о чтении из определенного стека, и о записи в определенный стек. Это так же странно.
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

vinxru wrote:Стек во время работы программы обычно не меняется!
Кто это тебе такое сказал? :o
Очень даже меняется... на одном стеке вызовы BIOS выполняются, DOS-API на другом...
Даже у разных типов подпрограмм могут быть разные стеки.

Кстати, проблема нереентабельности вызовов DOS также упирается в стек.
iLavr
User avatar
Shaos
Admin
Posts: 24099
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Поэтому и написал "обычно". А иначе кучу проблем можно отгрести.

И фраза "Записать в стек с вершиной ABCD" логически некорректна. Вершина стека - значение переменное, изменяемое процессором. А стек один. (Если мы говорим о процессорном стеке).

Более того, после записи в стек, его вершина изменится. Стек останется, просто вершина изменится. То есть при втором запуске возникнет новый стек (в воображении программиста), который затрет старый и вершина которого то же изменится.

Неправильно идентифиировать стек его вершиной. Это как идентифицировать автомобиль, количеством бензина в баке.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Shaos wrote:Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
Угу, вообще без использования указателя. В задаче вершина стека фиксированная. Сколько бы раз алгоритм не отработал, чтение будет происходить из одной и той же ячейки. То есть STA const_addr.
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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

Но "Стек во время работы программы обычно" всё-таки меняется! :lol:
Ты прочти, что сам написал - и вершина меняется и содержимое...
vinxru wrote:Неправильно идентифиировать стек его вершиной.
А как же по другому-то? Указывают вершину и обычно есть информация - сколько
байтов вниз - глубина стека, чтобы не наехать ни на что.

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

По крайней мере корректно работают со стеком именно так.
см. к примеру: Рудаков П.И., Финогенов К.Г. Программируем на языке ассемблера
IBM PC
: В 4-х частях.

Да и при передаче параметров в ассемблерную подпрограмму через стек, как и при возврате
параметров через тот-же стек, содержимым стека придется здорово поманипулировать.
Если в стеке есть некая структура данных, то вполне придется заполнить её поля.
При этом не обязательно указатель стека двигать, можно и через другие указатели
занести данные...
iLavr
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Re: i8080 help.

Post by Lavr »

Maks wrote:Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере,
но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь.
Мы выложили столько помощи и высказали столько практических мыслей и соображений...

Но, похоже, топикстартеру хотелось, чтобы мы без лишних слов решили эту задачу
вместо него... :lol:
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Вершина стека это SP, так везде написано.

Вершина - это не начало и не конец, это последний добавленный элемент. Величина переменная, то есть использовать её для описания стека странно.

Можно конечно прикинуть, к какому стеку относится SP, но.... в задаче стеки перекрываются.
User avatar
Lavr
Supreme God
Posts: 16712
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

vinxru wrote:Вершина стека это SP, так везде написано.
Вершина - это не начало и не конец, это последний добавленный элемент. Величина переменная, то есть использовать её для описания стека странно.
Я не знаю, что тебе странно - но если хочешь, вот тебе определение от Вики:
Аппаратный стек — непрерывная область памяти, адресуемая специальными регистрами ESP (указатель стека) и SS (селектор сегмента стека).

До использования стека он должен быть инициализирован так, чтобы регистры SS:ESP указывали на область реальной оперативной памяти (стек в ПЗУ, естественно, работать не может). Прикладные программы, как правило, от операционной системы получают готовый к употреблению стек. В защищенном режиме сегмент состояния задачи содержит четыре селектора сегментов стека (для разных уровней привилегий), но в каждый момент используется, естественно, только один стек.
"Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".
Вершина - это указатель, а стек - область памяти, доступ к которой организован по
магазинному типу.

Но если тебе не нравятся как-бы общепринятые соглашения - выскажи своё
конструктивное мнение, как на твой взгляд должно быть правильно введено
описание стека
.
iLavr