nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 05:04



Reply to topic  [ 40 posts ]  Go to page 1, 2, 3  Next
i8080 help. 
Author Message
Junior

Joined: 19 May 2013 13:05
Posts: 3
Location: 85.234.168.94
Reply with quote
Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере, но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь. Программа должна делать следующее:

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

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


19 May 2013 13:27
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
А в каком это институте заставляют писать программы для процессоров 1974 года?


19 May 2013 13:55
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
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.

На мой взгляд для твоей задачи команд достаточно...

_________________
iLavr


Last edited by Lavr on 19 May 2013 14:06, edited 1 time in total.



19 May 2013 13:58
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Со стеком все просто

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 не знает зачем она нужна.


19 May 2013 14:01
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов? ;)

_________________
:dj: https://mastodon.social/@Shaos


19 May 2013 14:07
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов? ;)

А это какая-то дурная задачка... :(
Наверное, в том и засада - сделать это не сломав стека. :lol:

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

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

А уж на перегретый пар - самые бредовые задачи обычно.

_________________
iLavr


19 May 2013 14:11
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Вообще фразы "Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh." звучат странно.

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

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

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

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

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


19 May 2013 14:27
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
vinxru wrote:
Стек во время работы программы обычно не меняется!

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

Кстати, проблема нереентабельности вызовов DOS также упирается в стек.

_________________
iLavr


19 May 2013 14:32
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...

_________________
:dj: https://mastodon.social/@Shaos


19 May 2013 14:36
Profile WWW
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Поэтому и написал "обычно". А иначе кучу проблем можно отгрести.

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

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

Неправильно идентифиировать стек его вершиной. Это как идентифицировать автомобиль, количеством бензина в баке.


19 May 2013 14:42
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Shaos wrote:
Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...


Угу, вообще без использования указателя. В задаче вершина стека фиксированная. Сколько бы раз алгоритм не отработал, чтение будет происходить из одной и той же ячейки. То есть STA const_addr.


19 May 2013 14:48
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Да не надо тут искать глубокий смысл - просто учебная задача на разные типы команд,
возможно, некорректно составленная или пересказанная нам.

Но "Стек во время работы программы обычно" всё-таки меняется! :lol:
Ты прочти, что сам написал - и вершина меняется и содержимое...

vinxru wrote:
Неправильно идентифиировать стек его вершиной.

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

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

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

Да и при передаче параметров в ассемблерную подпрограмму через стек, как и при возврате
параметров через тот-же стек, содержимым стека придется здорово поманипулировать.
Если в стеке есть некая структура данных, то вполне придется заполнить её поля.
При этом не обязательно указатель стека двигать, можно и через другие указатели
занести данные...

_________________
iLavr


19 May 2013 14:51
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Maks wrote:
Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере,
но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь.

Мы выложили столько помощи и высказали столько практических мыслей и соображений...

Но, похоже, топикстартеру хотелось, чтобы мы без лишних слов решили эту задачу
вместо него... :lol:

_________________
iLavr


20 May 2013 02:16
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Вершина стека это SP, так везде написано.

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

Можно конечно прикинуть, к какому стеку относится SP, но.... в задаче стеки перекрываются.


20 May 2013 02:22
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
vinxru wrote:
Вершина стека это SP, так везде написано.
Вершина - это не начало и не конец, это последний добавленный элемент. Величина переменная, то есть использовать её для описания стека странно.


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

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


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

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

_________________
iLavr


20 May 2013 03:00
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 40 posts ]  Go to page 1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.