i8080 help.
Moderator: Shaos
-
- Junior
- Posts: 3
- Joined: 19 May 2013 13:05
- Location: 85.234.168.94
i8080 help.
Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере, но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь. Программа должна делать следующее:
Из портов с номерами 47 и 39 ввести по числу. Введённые числа и ещё два числа, которые уже находятся в стеке с вершиной адреса ABCDh сравнить между собой. Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh. С двумя меньшими числами произвести операцию ИСКЛЮЧАЮЩЕЕ ИЛИ и результат вывести в порт 47. Все четыре числа в любом порядке сохранить в памяти с начальным адресом A1B2h.
Для меня главная проблема главным образом заключается в работе со стеком, так как по работе с ним у меня вообще нет никаких знаний. Заранее огромнейшее спасибо.
Из портов с номерами 47 и 39 ввести по числу. Введённые числа и ещё два числа, которые уже находятся в стеке с вершиной адреса ABCDh сравнить между собой. Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh. С двумя меньшими числами произвести операцию ИСКЛЮЧАЮЩЕЕ ИЛИ и результат вывести в порт 47. Все четыре числа в любом порядке сохранить в памяти с начальным адресом A1B2h.
Для меня главная проблема главным образом заключается в работе со стеком, так как по работе с ним у меня вообще нет никаких знаний. Заранее огромнейшее спасибо.
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: i8080 help.
Не - ну пиши уж сам...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
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Со стеком все просто
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 не знает зачем она нужна.
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 не знает зачем она нужна.
-
- Admin
- Posts: 24099
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
А это какая-то дурная задачка...Shaos wrote:Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов?

Наверное, в том и засада - сделать это не сломав стека.

Я её пару раз в сети видел и обратил внимание... но сейчас не нашел навскидку...
Впрочем - вспомни задачки из школы - когда какое-то ведро наполовину затоплено,
тоже ведь бред...
А уж на перегретый пар - самые бредовые задачи обычно.
iLavr
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Вообще фразы "Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh." звучат странно.
Странно то, что тут говорится о нескольких стеках. Стек - обычно, это область памяти куда процессор складывает адреса возвратов, значения регистров с помощью PUSH, ну и высокоуровневые ЯП складывают туда локальные переменные.
Стек во время работы программы обычно не меняется! И главное то, что все это уничтожается, после завершения работы программы!
А по задаче в стек надо сложить результат работы.
Есть еще один вид стека у программистов. Это буфер LIFO (last in first out). То есть взаимосвязь операций чтения и записи.
Тут же говорится по отдельности о чтении из определенного стека, и о записи в определенный стек. Это так же странно.
Странно то, что тут говорится о нескольких стеках. Стек - обычно, это область памяти куда процессор складывает адреса возвратов, значения регистров с помощью PUSH, ну и высокоуровневые ЯП складывают туда локальные переменные.
Стек во время работы программы обычно не меняется! И главное то, что все это уничтожается, после завершения работы программы!
А по задаче в стек надо сложить результат работы.
Есть еще один вид стека у программистов. Это буфер LIFO (last in first out). То есть взаимосвязь операций чтения и записи.
Тут же говорится по отдельности о чтении из определенного стека, и о записи в определенный стек. Это так же странно.
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
Кто это тебе такое сказал?vinxru wrote:Стек во время работы программы обычно не меняется!

Очень даже меняется... на одном стеке вызовы BIOS выполняются, DOS-API на другом...
Даже у разных типов подпрограмм могут быть разные стеки.
Кстати, проблема нереентабельности вызовов DOS также упирается в стек.
iLavr
-
- Admin
- Posts: 24099
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Поэтому и написал "обычно". А иначе кучу проблем можно отгрести.
И фраза "Записать в стек с вершиной ABCD" логически некорректна. Вершина стека - значение переменное, изменяемое процессором. А стек один. (Если мы говорим о процессорном стеке).
Более того, после записи в стек, его вершина изменится. Стек останется, просто вершина изменится. То есть при втором запуске возникнет новый стек (в воображении программиста), который затрет старый и вершина которого то же изменится.
Неправильно идентифиировать стек его вершиной. Это как идентифицировать автомобиль, количеством бензина в баке.
И фраза "Записать в стек с вершиной ABCD" логически некорректна. Вершина стека - значение переменное, изменяемое процессором. А стек один. (Если мы говорим о процессорном стеке).
Более того, после записи в стек, его вершина изменится. Стек останется, просто вершина изменится. То есть при втором запуске возникнет новый стек (в воображении программиста), который затрет старый и вершина которого то же изменится.
Неправильно идентифиировать стек его вершиной. Это как идентифицировать автомобиль, количеством бензина в баке.
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Угу, вообще без использования указателя. В задаче вершина стека фиксированная. Сколько бы раз алгоритм не отработал, чтение будет происходить из одной и той же ячейки. То есть STA const_addr.Shaos wrote:Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
Да не надо тут искать глубокий смысл - просто учебная задача на разные типы команд,
возможно, некорректно составленная или пересказанная нам.
Но "Стек во время работы программы обычно" всё-таки меняется!
Ты прочти, что сам написал - и вершина меняется и содержимое...
байтов вниз - глубина стека, чтобы не наехать ни на что.
Если надо перейти к другому стеку - текущее значение действующего сохраняют.
Указывают новую вершину стека, работают в новом стеке, при выходе из задачи -
восстанавливают старый указатель стека и возвращаются в систему...
По крайней мере корректно работают со стеком именно так.
см. к примеру: Рудаков П.И., Финогенов К.Г. Программируем на языке ассемблера
IBM PC: В 4-х частях.
Да и при передаче параметров в ассемблерную подпрограмму через стек, как и при возврате
параметров через тот-же стек, содержимым стека придется здорово поманипулировать.
Если в стеке есть некая структура данных, то вполне придется заполнить её поля.
При этом не обязательно указатель стека двигать, можно и через другие указатели
занести данные...
возможно, некорректно составленная или пересказанная нам.
Но "Стек во время работы программы обычно" всё-таки меняется!

Ты прочти, что сам написал - и вершина меняется и содержимое...
А как же по другому-то? Указывают вершину и обычно есть информация - сколькоvinxru wrote:Неправильно идентифиировать стек его вершиной.
байтов вниз - глубина стека, чтобы не наехать ни на что.
Если надо перейти к другому стеку - текущее значение действующего сохраняют.
Указывают новую вершину стека, работают в новом стеке, при выходе из задачи -
восстанавливают старый указатель стека и возвращаются в систему...
По крайней мере корректно работают со стеком именно так.
см. к примеру: Рудаков П.И., Финогенов К.Г. Программируем на языке ассемблера
IBM PC: В 4-х частях.
Да и при передаче параметров в ассемблерную подпрограмму через стек, как и при возврате
параметров через тот-же стек, содержимым стека придется здорово поманипулировать.
Если в стеке есть некая структура данных, то вполне придется заполнить её поля.
При этом не обязательно указатель стека двигать, можно и через другие указатели
занести данные...
iLavr
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: i8080 help.
Мы выложили столько помощи и высказали столько практических мыслей и соображений...Maks wrote:Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере,
но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь.
Но, похоже, топикстартеру хотелось, чтобы мы без лишних слов решили эту задачу
вместо него...

iLavr
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
-
- Supreme God
- Posts: 16712
- Joined: 21 Oct 2009 08:08
- Location: Россия
Я не знаю, что тебе странно - но если хочешь, вот тебе определение от Вики:vinxru wrote:Вершина стека это SP, так везде написано.
Вершина - это не начало и не конец, это последний добавленный элемент. Величина переменная, то есть использовать её для описания стека странно.
"Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".Аппаратный стек — непрерывная область памяти, адресуемая специальными регистрами ESP (указатель стека) и SS (селектор сегмента стека).
До использования стека он должен быть инициализирован так, чтобы регистры SS:ESP указывали на область реальной оперативной памяти (стек в ПЗУ, естественно, работать не может). Прикладные программы, как правило, от операционной системы получают готовый к употреблению стек. В защищенном режиме сегмент состояния задачи содержит четыре селектора сегментов стека (для разных уровней привилегий), но в каждый момент используется, естественно, только один стек.
Вершина - это указатель, а стек - область памяти, доступ к которой организован по
магазинному типу.
Но если тебе не нравятся как-бы общепринятые соглашения - выскажи своё
конструктивное мнение, как на твой взгляд должно быть правильно введено
описание стека.
iLavr