Author |
Message |
Maks
Junior
Joined: 19 May 2013 13:05 Posts: 3 Location: 85.234.168.94
|
Добрый всем вечер. Так получилось, что нужно написать программу на ассемблере, но к сожалению, знаний недостаточно. Очень надеюсь на вашу помощь. Программа должна делать следующее:
Из портов с номерами 47 и 39 ввести по числу. Введённые числа и ещё два числа, которые уже находятся в стеке с вершиной адреса ABCDh сравнить между собой. Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh. С двумя меньшими числами произвести операцию ИСКЛЮЧАЮЩЕЕ ИЛИ и результат вывести в порт 47. Все четыре числа в любом порядке сохранить в памяти с начальным адресом A1B2h.
Для меня главная проблема главным образом заключается в работе со стеком, так как по работе с ним у меня вообще нет никаких знаний. Заранее огромнейшее спасибо.
|
19 May 2013 13:27 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
А в каком это институте заставляют писать программы для процессоров 1974 года?
|
19 May 2013 13:55 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Не - ну пиши уж сам...
Со стеком работают так:
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 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 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 не знает зачем она нужна.
|
19 May 2013 14:01 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22571 Location: Silicon Valley
|
Странная какая-то задачка - если получилось так, клади в один стек, а если эдак - в другой? А ничего что программист сломает свой стек возвратов?
|
19 May 2013 14:07 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А это какая-то дурная задачка...
Наверное, в том и засада - сделать это не сломав стека.
Я её пару раз в сети видел и обратил внимание... но сейчас не нашел навскидку...
Впрочем - вспомни задачки из школы - когда какое-то ведро наполовину затоплено,
тоже ведь бред...
А уж на перегретый пар - самые бредовые задачи обычно.
_________________ iLavr
|
19 May 2013 14:11 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
Вообще фразы "Два больших числа нужно сложить и, если сумма с переносом, то результат сохранить в стеке с вершиной адреса ABCEh. Если сумма без переноса, то результат сохранить в стеке с вершиной адреса AABBh." звучат странно.
Странно то, что тут говорится о нескольких стеках. Стек - обычно, это область памяти куда процессор складывает адреса возвратов, значения регистров с помощью PUSH, ну и высокоуровневые ЯП складывают туда локальные переменные.
Стек во время работы программы обычно не меняется! И главное то, что все это уничтожается, после завершения работы программы!
А по задаче в стек надо сложить результат работы.
Есть еще один вид стека у программистов. Это буфер LIFO (last in first out). То есть взаимосвязь операций чтения и записи.
Тут же говорится по отдельности о чтении из определенного стека, и о записи в определенный стек. Это так же странно.
|
19 May 2013 14:27 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Кто это тебе такое сказал?
Очень даже меняется... на одном стеке вызовы BIOS выполняются, DOS-API на другом...
Даже у разных типов подпрограмм могут быть разные стеки.
Кстати, проблема нереентабельности вызовов DOS также упирается в стек.
_________________ iLavr
|
19 May 2013 14:32 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22571 Location: Silicon Valley
|
Может тут имелось ввиду что программист должен создать свою собственную абстракцию "стек"? Без использования SP!
Просто типа в памяти держать адреса вершины стеков и иметь подпрограммки по засовыванию в стек и по высовыванию из стека?...
|
19 May 2013 14:36 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
Поэтому и написал "обычно". А иначе кучу проблем можно отгрести.
И фраза "Записать в стек с вершиной ABCD" логически некорректна. Вершина стека - значение переменное, изменяемое процессором. А стек один. (Если мы говорим о процессорном стеке).
Более того, после записи в стек, его вершина изменится. Стек останется, просто вершина изменится. То есть при втором запуске возникнет новый стек (в воображении программиста), который затрет старый и вершина которого то же изменится.
Неправильно идентифиировать стек его вершиной. Это как идентифицировать автомобиль, количеством бензина в баке.
|
19 May 2013 14:42 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
Угу, вообще без использования указателя. В задаче вершина стека фиксированная. Сколько бы раз алгоритм не отработал, чтение будет происходить из одной и той же ячейки. То есть STA const_addr.
|
19 May 2013 14:48 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да не надо тут искать глубокий смысл - просто учебная задача на разные типы команд,
возможно, некорректно составленная или пересказанная нам.
Но " Стек во время работы программы обычно" всё-таки меняется!
Ты прочти, что сам написал - и вершина меняется и содержимое...
А как же по другому-то? Указывают вершину и обычно есть информация - сколько
байтов вниз - глубина стека, чтобы не наехать ни на что.
Если надо перейти к другому стеку - текущее значение действующего сохраняют.
Указывают новую вершину стека, работают в новом стеке, при выходе из задачи -
восстанавливают старый указатель стека и возвращаются в систему...
По крайней мере корректно работают со стеком именно так.
см. к примеру: Рудаков П.И., Финогенов К.Г. Программируем на языке ассемблера IBM PC: В 4-х частях.
Да и при передаче параметров в ассемблерную подпрограмму через стек, как и при возврате
параметров через тот-же стек, содержимым стека придется здорово поманипулировать.
Если в стеке есть некая структура данных, то вполне придется заполнить её поля.
При этом не обязательно указатель стека двигать, можно и через другие указатели
занести данные...
_________________ iLavr
|
19 May 2013 14:51 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Мы выложили столько помощи и высказали столько практических мыслей и соображений...
Но, похоже, топикстартеру хотелось, чтобы мы без лишних слов решили эту задачу
вместо него...
_________________ iLavr
|
20 May 2013 02:16 |
|
|
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
Вершина стека это SP, так везде написано.
Вершина - это не начало и не конец, это последний добавленный элемент. Величина переменная, то есть использовать её для описания стека странно.
Можно конечно прикинуть, к какому стеку относится SP, но.... в задаче стеки перекрываются.
|
20 May 2013 02:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я не знаю, что тебе странно - но если хочешь, вот тебе определение от Вики:
" Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".
Вершина - это указатель, а стек - область памяти, доступ к которой организован по
магазинному типу.
Но если тебе не нравятся как-бы общепринятые соглашения - выскажи своё
конструктивное мнение, как на твой взгляд должно быть правильно введено описание стека.
_________________ iLavr
|
20 May 2013 03:00 |
|
|